* Self-attention или внимание: определяет какие из токенов важны для текущего предсказания
* MLPs (multi layer perceptrons): чтобы добавить нелинейность и перчинку
* Стабилизация residual \+ norms чтобы это не развалилось и работало с глубокими сетями
* Позиционное кодирование (RoPE) чтобы модель знала где токен находится в последовательности и не путала кота и котастрофу 🙂
Накладывая десятки и сотни таких слоев трансформер пытается “понять” ваш запрос, контекст и историю разговора. Чем больше слоев в голов внимания у модели тем умнее модель.
Чтобы работать с моделью ее надо вгрузить в VRAM. Количество должно позволить вгрузить 1\. Веса 2\. KV кеш. Примерные формулы: FP16 \- 2 байта на параметр (7B \- 14Gb), 4 бита \- уже 3.5Gb. Учитывайте еще 10-30% на оверхед. KV кеш стоит около 0.5 мег на токен и зависит от модели. Т.е. 4к токенов \- это еще 2 гига памяти. Некоторые рантаймы позволяют квантизировать и кеш в том числе позволяя экономить большое количество памяти.
Получается, что недостаточно просто впихнуть модель в память, надо чтобы она еще где\-то работала.
И чтобы она работала быстро пригодится Memory bandwidth \+ GPU FLOPs. Именно поэтому некоторые старые видюхи у которых шина пошире будут работать быстрее чем новые модели с более узкой шиной. Так NVIDIA RTX 2080 Ti (2018, 352-битная шина) имеет \~616 ГБ/с bandwidth и часто обходит RTX 4060/4070 (2023, 128/192-битные шины, \~288–504 ГБ/с) в LLM-задачах, несмотря на меньшее количество CUDA-ядер.
Вычисления можно переложить на CPU, но это существенно ощутимо болезненно медленнее.
Квантизация модели дает колоссальную экономию памяти зачастую при незначительной потере качества. 4-бит (NF4/GPTQ/AWQ) квантизация может быть оптимальной для потребительских GPU. Но нужно учитывать, что сложные мат задачи деградируют первыми: математика, логика и кодинг.
Рантаймы, где гонять
* pytorch \+ safetensors: гибко, стандартизовано, GPU/TPU/CPU
* GGUF (llama.cpp): CPU/GPU/portable лучший выбор для квантизации и для устройств “на крае”
* ONNX, TensorRT-LLM, MLC: для спец оборудования
* Избегайте bin по причинам безопасности
Компромиссы повсюду. Балансируйте компромиссы под свою задачу и бюджет.
Как раздавать
* vLLM для параллельных запросов
* llama.cpp server с OpenAI совместимым API
* EXLlama v2/v2 Tabby API с OpenAI совместимым API
* Просто как локальный скрипт через CLI
Локальная модель не значит Offline, а значит что работает на твоем железе. Твое железо может быть под столом, а может быть и в облаке.
Коротко о Fine Tuning
* Большинство задач можно решить через правильный промт \+ RAG
* Для файнтюнина необходимо раздобыть данные
* Делаем adapter layers на LoRA/ QLoRA на своем домашнем железе если сильно хочется
Наиболее частые проблемы
* OOM кончилась память. Квантизуем модель или сокращаем контекст
* Плохая выдача. Проверь chat template, temperature
* Медленно работает? Неправильные драйверы, нет FlashAttention, проверь свое железо CUDA/ROCm/Metal, влазит ли оно в память
* Небезопасно? Не используй bin модели от рандомов из интернета
Зачем все это?
Запуская модель на своем железе вы получаете все управление в свои руки: механизм выбора токена sampling, chat templates, декодирование, системные промпты, квантизацию, контекст. Больше не платите за каждый токен. Только за железо и электричество. Приватность. Отсутствие Network latency.
Источник: https://x.com/TheAhmadOsman/status/1974730678513041490