ИЗ ЧЕГО СКЛАДЫВАЕТСЯ ПАМЯТЬ
Разберём по частям, потому что игнорирование любой из них и приводит к «модель не влезла, хотя по звёздочкам подходила».
1. Веса модели
Основной кусок. Считается прямо: количество параметров × байт на параметр. При FP16 каждый параметр весит 2 байта, при Q8 — примерно 1 байт, при Q4 — примерно 0,55 байта с учётом служебных данных квантизации.
2. KV-кэш
Незаметный пожиратель. Модель хранит промежуточные состояния для каждого токена контекста. Растёт линейно: удвоили контекст — удвоили кэш. На больших окнах кэш может занять больше, чем сама модель.
3. Оверхед
Буферы фреймворка, активации, фрагментация. Закладывайте 10-15% сверху. Без запаса приложение падает с OOM на самом интересном месте.
ТАБЛИЦА: ЧТО ВЛЕЗЕТ НА ВАШЕ ЖЕЛЕЗО
| VRAM | Комфортно | С натяжкой | Типичная карта |
|---|---|---|---|
| 8 ГБ | 7-8B в Q4 | 14B в Q3 | RTX 3060 Ti, 4060 |
| 12 ГБ | 8B в Q8 / 14B в Q4 | 27B в Q3 | RTX 3060 12G, 4070 |
| 16 ГБ | 14B в Q4-Q5 | 32B в Q3 | RTX 4060 Ti 16G, A4000 |
| 24 ГБ | 32B в Q4 | 70B в Q2 | RTX 3090, 4090 |
| 48 ГБ | 70B в Q4 | 110B в Q3 | 2×3090, A6000 |
| 64+ ГБ (unified) | 70B в Q5-Q8 | больше 100B | Mac Studio M-серии |
Обратите внимание на Apple: унифицированная память означает, что 64 ГБ Mac Studio ведут себя иначе, чем 64 ГБ обычной RAM — GPU обращается к ним напрямую без копирования.
УРОВНИ КВАНТИЗАЦИИ: ЧТО ТЕРЯЕМ
Квантизация — это сжатие весов за счёт снижения точности чисел. Ключевой вопрос: где грань, после которой модель начинает тупеть заметно.
| Формат | Байт/параметр | Потеря качества | Когда брать |
|---|---|---|---|
| FP16 | 2,0 | эталон | есть избыток памяти, нужна максимальная точность |
| Q8_0 | ~1,1 | практически незаметна | золотая середина при достатке памяти |
| Q6_K | ~0,8 | едва различима | хороший компромисс |
| Q5_K_M | ~0,7 | малая | рабочий вариант при дефиците |
| Q4_K_M | ~0,55 | заметна на сложных задачах | стандарт де-факто, лучший баланс |
| Q3_K_M | ~0,45 | ощутимая | только если иначе никак |
| Q2_K | ~0,35 | сильная деградация | эксперименты, не для работы |
Практический вывод: Q4_K_M — точка, ниже которой опускаться не стоит без крайней нужды. Модель побольше в Q4 почти всегда лучше модели поменьше в Q8 при одинаковом объёме памяти.
СЧИТАЕМ KV-КЭШ
Формула приблизительная, но для планирования её достаточно:
KV_кэш (ГБ) ≈ 2 × слоёв × размер_скрытого × контекст × байт / 1e9
# для 8B-модели (32 слоя, hidden 4096) при FP16:
# 2 × 32 × 4096 × 32768 × 2 / 1e9 ≈ 17 ГБ (!)
Цифра пугает, и это реальность больших контекстов: кэш легко перевешивает модель. Решение — квантизация самого кэша, она поддерживается основными рантаймами:
# llama.cpp — кэш в 8 бит вместо 16
./llama-server -m model.gguf -c 32768 \
--cache-type-k q8_0 --cache-type-v q8_0
# в Ollama через переменную
OLLAMA_KV_CACHE_TYPE=q8_0 ollama serve
Даёт в 3-3,5 раза больше контекста при почти незаметной потере качества. Один из самых недооценённых приёмов.
КОГДА ПАМЯТИ ВСЁ РАВНО НЕ ХВАТАЕТ
Четыре приёма по убыванию полезности:
- Частичная выгрузка на CPU. Часть слоёв на GPU, часть в обычной RAM. Работает, но каждый выгруженный слой бьёт по скорости — держите на GPU максимум возможного.
- Квантизация KV-кэша. Разобрали выше, лучший приём по соотношению выгода/потери.
- Урезать контекст. Честно спросите себя, нужны ли реально 128k. Большинству задач хватает 8-16k, а память экономится кратно.
- MoE-модели. Mixture of Experts активирует лишь часть параметров на токен — по качеству как крупная модель, по вычислениям как мелкая. Но веса всё равно надо где-то держать.
Свежие сборки квантованных моделей и динамические кванты удобно искать в каталоге REDDYX — там же видно, какие проекты вокруг квантизации набирают обороты.
ПРОВЕРКА ПЕРЕД СКАЧИВАНИЕМ
Быстрый скрипт, который считает потребность до того, как вы потратите трафик:
def vram_gb(params_b, quant_bytes=0.55, ctx=8192, layers=32, hidden=4096, kv_bytes=2):
weights = params_b * quant_bytes
kv = 2 * layers * hidden * ctx * kv_bytes / 1e9
return round((weights + kv) * 1.12, 1) # +12% оверхед
print(vram_gb(14, ctx=8192)) # 14B, контекст 8k
print(vram_gb(14, ctx=32768)) # тот же 14B, контекст 32k
Разница между двумя строками и есть та причина, по которой «у соседа работает, а у меня OOM».
FAQ
Что лучше: 14B в Q4 или 8B в Q8 при одинаковой памяти?
Почти всегда 14B в Q4. Больше параметров важнее точности их представления — это устойчивое наблюдение на большинстве бенчмарков.
Влияет ли квантизация на скорость?
Да, положительно. Меньше данных гоняется через шину памяти — выше скорость генерации. Q4 обычно быстрее FP16 на той же карте.
Можно ли объединить две видеокарты?
Да, llama.cpp и vLLM умеют распределять слои между GPU. Две 3090 по 24 ГБ дают рабочие 48 ГБ, но появляются накладные расходы на обмен между картами.
Почему модель заняла больше, чем я посчитал?
Три обычные причины: не учли KV-кэш, забыли про оверхед фреймворка, либо рантайм зарезервировал буфер под максимальный контекст, даже если вы его не используете.
