Коротко (TL;DR)
- Занятая видеопамять — это не «размер модели». Это четыре слагаемых: веса, KV-кэш, служебные буферы движка и то, что уже забрал рабочий стол. Новичков ломает второе: KV-кэш растёт вместе с длиной диалога, поэтому модель спокойно загружается и падает через полчаса работы.
- Правило «Q4 — это 0,5 байта на параметр» занижает результат примерно на 20%. Мы посчитали реальные размеры GGUF-файлов восьми моделей от 3B до 70B: Q4_K_M даёт 4,86 бита на параметр (диапазон 4,78–5,03), Q8_0 — 8,47 бита. На 70B разница с ходовым правилом — 6,8 ГиБ.
- KV-кэш зависит от числа слоёв и KV-голов, а не от числа параметров. Qwen3 32B ест 256 КиБ на токен, Llama 3.1 8B — 128 КиБ, а MoE-модель Qwen3 30B-A3B — всего 96 КиБ, меньше, чем плотная восьмимиллиардная.
- Живой пример провала: Qwen3 32B в Q4_K_M на карте 24 ГБ занимает 21,6 ГиБ при контексте 8k и 27,6 ГиБ при 32k. Модель стартует, работает, а на длинном документе выходит за пределы карты.
- Формула важнее таблицы. Таблица устареет со следующим релизом, формула — нет: чтобы посчитать любую новую модель, нужны четыре числа из её карточки и размер файла.
Все размеры файлов, параметры моделей и значения флагов в этом материале сверены 16 августа 2026 года. Что устареет первым и как перепроверить — в конце. Материал отвечает на вопрос «влезет ли»; если вы ещё не решили, что именно ставить, начните с разбора того, какую локальную модель выбрать под задачу, и возвращайтесь сюда за расчётом.
- Коротко (TL;DR)
- Из чего складывается занятая видеопамять: четыре слагаемых
- Формула расчёта на примере Llama 3.1 8B: шесть чисел из карточки
- Сколько весит квант: реальные байты GGUF против правила 0,5
- Таблица: сколько видеопамяти нужно под модель и квант
- KV-кэш и длина контекста: почему модель падает на длинном диалоге
- Скользящее окно внимания срезает кэш Gemma 3 в пять раз
- MoE-модели: почему 117 млрд параметров не значит 117 ГБ памяти
- Модель не влезает: четыре рычага и цена каждого
- Сверка расчёта с чужими замерами: где формула сходится и где нет
- Риски расчёта: движок, репозиторий кванта и платформа
- FAQ
Из чего складывается занятая видеопамять: четыре слагаемых
Вопрос «сколько видеопамяти нужно для нейросети» почти всегда задают в форме «модель на 8 миллиардов параметров — сколько это гигабайт». И почти всегда ответ на него неполный, потому что в карту грузится не только модель.
Разберёмся по слагаемым. Опорой будет документация сервера llama.cpp — это движок, на котором работают и Ollama, и LM Studio, и именно его умолчания определяют, сколько памяти уйдёт под кэш. Мейнтейнер проекта отдельно разбирал лог загрузки построчно и назвал ровно четыре буфера, которые аллоцируются на видеокарте; про буфер весов там сказано: «The total size should be very close to the size of the model file on disk». Это первое и главное следствие для расчёта: считать надо от реального файла, а не от арифметики «параметры × полбайта».
Вот все четыре слагаемых.
1. Веса модели. Занимают ровно столько, сколько весит файл GGUF на диске. Не приблизительно — практически байт в байт, потому что движок отображает файл в память как есть.
2. KV-кэш. Внутренняя память модели о том, что уже сказано в диалоге. Каждый новый токен добавляет к ней фиксированную порцию байт. При контексте в четыре тысячи токенов это доли гигабайта, при ста двадцати восьми тысячах — десятки. Это и есть слагаемое, которого нет в большинстве таблиц и из-за которого расчёты новичков расходятся с реальностью.
3. Служебные буферы движка. В разобранном логе это CUDA0 compute buffer size = 507.00 MiB — место под промежуточные результаты вычислений, плюс совсем маленький выходной буфер на 1,95 МиБ. Сверх напечатанного драйвер CUDA забирает ещё несколько сотен мегабайт под собственный контекст, и в логе движка эта часть не видна вовсе. Рабочая оценка на оба буфера вместе — 1–1,5 ГиБ; дальше в таблицах мы берём 1,2 ГиБ. Это оценка, а не замер, и мы её так и помечаем.
4. То, что уже занято. На Windows рабочий стол, браузер и композитор оконного менеджера держат от 0,5 до 1,5 ГиБ видеопамяти ещё до запуска модели. На Linux без графической оболочки — почти ноль. Разница между этими двумя случаями больше, чем весь служебный буфер движка.
Складывается это так:
занятая видеопамять = размер файла GGUF
+ KV-кэш (растёт с длиной контекста)
+ 1–1,5 ГиБ буферов движка и драйвера
+ то, что забрала ОС
Первые два слагаемых считаются точно. Третье оценивается. Четвёртое читатель видит в диспетчере задач сам.
Формула расчёта на примере Llama 3.1 8B: шесть чисел из карточки
Разберём один расчёт полностью — дальше по этому образцу считается любая модель, включая ту, которая выйдет через месяц.
Берём Llama 3.1 8B в кванте Q4_K_M и контекст 8192 токена.
Шаг 1. Размер файла. Идём в репозиторий с готовыми GGUF на Hugging Face и смотрим точный размер блоба: Meta-Llama-3.1-8B-Instruct-Q4_K_M.gguf — 4 920 739 232 байта, то есть 4,58 ГиБ. Ollama для того же кванта печатает округлённое «4.9GB» — сходится.
Шаг 2. Четыре числа из config.json. В карточке модели открываем файл config.json и выписываем:
| Поле | Значение у Llama 3.1 8B | Что это |
|---|---|---|
num_hidden_layers | 32 | сколько слоёв в модели |
num_key_value_heads | 8 | сколько KV-голов (не путать с головами внимания) |
head_dim | 128 | размерность одной головы |
max_position_embeddings | 131072 | максимальный родной контекст |
Отдельно нужен пятый параметр — байт на элемент кэша. По умолчанию llama.cpp хранит KV-кэш в f16, то есть 2 байта. Это прямо записано в документации движка: --cache-type-k, -ctk: KV cache data type for K allowed values: f32, f16, bf16, q8_0, q4_0, q4_1, iq4_nl, q5_0, q5_1 (default: f16). И шестое число — длина контекста, которую вы зададите флагом -c.
Шаг 3. KV-кэш на один токен. Формула:
KV на токен = 2 × слоёв × KV-голов × head_dim × байт_на_элемент
Двойка в начале — потому что кэшируются и ключи (K), и значения (V), причём симметрично: в логе движка это видно как K (f16): 672.00 MiB, V (f16): 672.00 MiB.
Подставляем: 2 × 32 × 8 × 128 × 2 = 131 072 байта = 128 КиБ на токен.
Шаг 4. KV-кэш на весь контекст. 128 КиБ × 8192 токена = 1,00 ГиБ. При 32 768 токенах будет 4,00 ГиБ, при 131 072 — 16,00 ГиБ.
Шаг 5. Складываем.
4,58 ГиБ (веса)
+ 1,00 ГиБ (KV при 8k)
+ 1,20 ГиБ (буферы)
= 6,78 ГиБ
Плюс то, что забрала ОС. На карте 8 ГБ (это 8 ГиБ по факту, видеопамять маркируют в двоичных гигабайтах) остаётся около 1,2 ГиБ — на голом Linux хватит, на Windows с открытым браузером уже впритык. На 12 ГБ конфигурация живёт спокойно и с запасом под контекст побольше.
Почему KV-голов именно 8, а не 32. У Llama 3.1 8B тридцать две головы внимания, но всего восемь KV-голов — это механизм GQA (grouped-query attention, сгруппированное внимание): несколько голов внимания делят один набор ключей и значений. Для расчёта памяти важны именно KV-головы, и разница здесь четырёхкратная. Если взять в формулу num_attention_heads вместо num_key_value_heads, ответ будет завышен вчетверо — это самая частая арифметическая ошибка в этой теме.
Вот те же четыре числа для всех моделей нашей таблицы, чтобы не открывать десять карточек:
| Модель | Слоёв | KV-голов | head_dim | KV на токен (f16) | Родной контекст |
|---|---|---|---|---|---|
| Llama 3.2 3B | 28 | 8 | 128 | 112 КиБ | 131 072 |
| Llama 3.1 8B | 32 | 8 | 128 | 128 КиБ | 131 072 |
| Qwen3 8B | 36 | 8 | 128 | 144 КиБ | 40 960 |
| Qwen3 14B | 40 | 8 | 128 | 160 КиБ | 40 960 |
| Mistral Small 3.2 24B | 40 | 8 | 128 | 160 КиБ | 131 072 |
| Gemma 3 27B | 62 | 16 | 128 | 496 КиБ | 131 072 |
| Qwen3 32B | 64 | 8 | 128 | 256 КиБ | 40 960 |
| Llama 3.3 70B | 80 | 8 | 128 | 320 КиБ | 131 072 |
| Qwen3 30B-A3B (MoE) | 48 | 4 | 128 | 96 КиБ | 32 768 |
| gpt-oss-120b (MoE) | 36 | 8 | 64 | 72 КиБ | 131 072 |
Уже по этой таблице видно главное: число параметров и аппетит к KV-кэшу связаны слабо. У Qwen3 32B кэш вдвое толще, чем у Llama 3.1 8B, хотя параметров вчетверо больше — потому что слоёв ровно вдвое больше. А у Gemma 3 27B KV-кэш формально худший в выборке, и виноваты не параметры, а шестнадцать KV-голов вместо восьми. Что с этим делает движок — разберём отдельно, потому что там всё не так страшно.
Сколько весит квант: реальные байты GGUF против правила 0,5
Ходовое правило звучит так: FP16 — 2 байта на параметр, Q8 — 1 байт, Q4 — 0,5 байта. Оно повторяется во всех восьми материалах, которые мы разобрали для этой статьи, и оно неверно.
Мы взяли точные размеры блобов из API Hugging Face (поле siblings[].size — это байты, а не округление карточки) и поделили на точное число параметров из метаданных safetensors. Вот что получилось на восьми моделях от 3B до 70B:
| Квант | Измерено, бит на параметр | Диапазон по 8 моделям | Ходовое правило |
|---|---|---|---|
| Q3_K_M | 3,91 | 3,82–4,00 | 3,0 |
| Q4_K_M | 4,86 | 4,78–5,03 | 4,0 |
| Q5_K_M | 5,68 | 5,59–5,78 | 5,0 |
| Q6_K | 6,54 | 6,45–6,58 | 6,0 |
| Q8_0 | 8,47 | 8,35–8,52 | 8,0 |
| MXFP4 (gpt-oss-120b) | 4,34 | — | 4,0 |
Расхождение с правилом — от 6 до 21 процента, и всегда в одну сторону: реальный файл больше ожидаемого. Причин две. Первая — K-кванты держат часть тензоров в более высокой точности, поэтому «Q4» не означает, что все веса лежат в четырёх битах. Вторая — служебные данные формата и таблицы масштабов внутри блоков.
Проверить это можно, не веря нам на слово. Ollama печатает для Llama 3.3 70B размер q4_K_M — 43GB и fp16 — 141GB. Отношение 43 к 141 даёт 4,88 бита на параметр — то есть независимый реестр приходит к той же цифре, что и наш расчёт по байтам Hugging Face, а не к заявленным четырём битам.
Практический вывод простой: берите размер конкретного файла, а не считайте по правилу. Посчитаем недобор прямо по цифрам выше. У Llama 3.1 8B правило обещает 3,74 ГиБ, файл весит 4,58 — недобор 0,84 ГиБ. У Qwen3 32B: обещано 15,26, реально 18,40 — недобор 3,15 ГиБ. У Llama 3.3 70B: обещано 32,85, реально 39,60 — недобор 6,75 ГиБ.
Почти семь гигабайт на 70B — это ровно та величина, которая решает, поместится модель в две карты по 24 ГБ или нет. Кто считал по правилу, увидит 32,85 ГиБ и решит, что запас огромный; на деле веса займут 39,6, и с KV-кэшем на длинном контексте сборка на двух RTX 3090 ради 48 ГБ окажется не «с запасом», а впритык.
Ближе всех из англоязычного топа подошли те, кто даёт 0,57 байта на параметр для Q4_K_M — это 4,56 бита, уже теплее, но всё ещё ниже измеренного.
Таблица: сколько видеопамяти нужно под модель и квант
Первая таблица — только веса, то есть размер файла GGUF в ГиБ. Это нижняя граница: без контекста и без буферов модель работать не будет, но меньше этого числа она не займёт никогда.
| Модель | Q3_K_M | Q4_K_M | Q5_K_M | Q6_K | Q8_0 |
|---|---|---|---|---|---|
| Llama 3.2 3B | 1,7 | 1,9 | 2,2 | 2,5 | 3,2 |
| Llama 3.1 8B | 3,7 | 4,6 | 5,3 | 6,1 | 8,0 |
| Qwen3 14B | 6,8 | 8,4 | 9,8 | 11,3 | 14,6 |
| Mistral Small 3.2 24B | 10,7 | 13,3 | 15,6 | 18,0 | 23,3 |
| Gemma 3 27B | 12,5 | 15,4 | 17,9 | 20,6 | 26,7 |
| Qwen3 32B | 14,9 | 18,4 | 21,6 | 25,0 | 32,4 |
| Qwen3 30B-A3B (MoE) | 13,7 | 17,3 | 20,2 | 23,4 | 30,3 |
| Llama 3.3 70B | 31,9 | 39,6 | 46,5 | 53,9 | 69,8 |
| gpt-oss-120b (MoE) | — | — | — | — | — |
У gpt-oss-120b прочерки не по недосмотру: модель публикуется сразу в формате MXFP4 и весит 59,0 ГиБ, а привычных K-квантов у неё просто нет. Подробнее — в разделе про MoE.
Вторая таблица — полная: веса в Q4_K_M плюс KV-кэш в f16 плюс 1,2 ГиБ буферов. Последняя колонка — реалистичный минимум карты при контексте 8192 токена, с поправкой на то, что часть памяти заберёт система.
| Модель (Q4_K_M) | Веса | При 4k | При 8k | При 32k | При 128k | Карта при 8k |
|---|---|---|---|---|---|---|
| Llama 3.2 3B | 1,9 | 3,5 | 4,0 | 6,6 | 17,1 | 6–8 ГБ |
| Llama 3.1 8B | 4,6 | 6,3 | 6,8 | 9,8 | 21,8 | 8 ГБ впритык, 12 ГБ спокойно |
| Qwen3 14B | 8,4 | 10,2 | 10,8 | 14,6 | 29,6 | 12 ГБ |
| Mistral Small 3.2 24B | 13,3 | 15,2 | 15,8 | 19,5 | 34,5 | 16 ГБ впритык, 24 ГБ спокойно |
| Gemma 3 27B | 15,4 | 17,3 | 17,6 | 19,5 | 27,0 | 24 ГБ |
| Qwen3 30B-A3B (MoE) | 17,3 | 18,9 | 19,2 | 21,5 | 30,5 | 24 ГБ |
| Qwen3 32B | 18,4 | 20,6 | 21,6 | 27,6 | 51,6 | 24 ГБ только на коротком контексте |
| Llama 3.3 70B | 39,6 | 42,1 | 43,3 | 50,8 | 80,8 | 48 ГБ (две по 24) |
| gpt-oss-120b (MXFP4) | 59,0 | 60,4 | 60,5 | 61,4 | 64,7 | 64–96 ГБ или выгрузка экспертов |
Значения для Gemma 3 27B и gpt-oss-120b посчитаны с учётом скользящего окна — если считать их наивной формулой, цифры получатся в разы больше, и именно так делают все чужие таблицы. Почему так — следующие два раздела.
Три вещи, которые в этой таблице легко пропустить.
Первое: у Llama 3.3 70B колонка «при 128k» даёт 80,8 ГиБ — то есть на длинном контексте KV-кэш этой модели весит примерно столько же, сколько её собственные веса. Второе: у Qwen3 32B разброс между 4k и 128k — двадцать восемь гигабайт, больше, чем весит сама модель. Третье: gpt-oss-120b на 117 миллиардов параметров от 4k к 128k прибавляет всего 4,3 ГиБ — меньше, чем восьмимиллиардная Llama.
Обратите внимание и на строку Qwen3 32B: 21,6 ГиБ при 8k делают её пограничной для одной карты на 24 ГБ, а вот на RTX 5090 с её потолком в 32 ГБ та же модель живёт уже с контекстом 32k.
KV-кэш и длина контекста: почему модель падает на длинном диалоге
Самый частый сценарий выглядит так. Модель поставили, она запустилась, отвечает быстро. Через полчаса работы, на длинном документе или после десятка сообщений, движок падает с ошибкой нехватки памяти или начинает выдавать токены в десять раз медленнее.
Причина в том, что веса — константа, а KV-кэш — переменная. Он растёт линейно с числом токенов в контексте и живёт в той же видеопамяти.
| Модель | KV на токен | 4k | 8k | 16k | 32k | 128k |
|---|---|---|---|---|---|---|
| Llama 3.2 3B | 112 КиБ | 0,44 | 0,88 | 1,75 | 3,50 | 14,00 |
| Llama 3.1 8B | 128 КиБ | 0,50 | 1,00 | 2,00 | 4,00 | 16,00 |
| Qwen3 14B | 160 КиБ | 0,62 | 1,25 | 2,50 | 5,00 | 20,00 |
| Mistral Small 3.2 24B | 160 КиБ | 0,62 | 1,25 | 2,50 | 5,00 | 20,00 |
| Gemma 3 27B (с окном) | 496 КиБ | 0,72 | 1,03 | 1,66 | 2,91 | 10,41 |
| Qwen3 32B | 256 КиБ | 1,00 | 2,00 | 4,00 | 8,00 | 32,00 |
| Llama 3.3 70B | 320 КиБ | 1,25 | 2,50 | 5,00 | 10,00 | 40,00 |
| Qwen3 30B-A3B (MoE) | 96 КиБ | 0,38 | 0,75 | 1,50 | 3,00 | 12,00 |
| gpt-oss-120b (с окном) | 72 КиБ | 0,15 | 0,29 | 0,57 | 1,13 | 4,50 |
Значения в таблице — гибибайты (ГиБ), то есть двоичные гигабайты.
Разберём кейс целиком. Qwen3 32B в Q4_K_M на карте 24 ГБ — популярная конфигурация, её советуют почти все справочники.
| Контекст | Веса | KV-кэш | Буферы | Итого | Помещается в 24 ГиБ |
|---|---|---|---|---|---|
| 4 096 | 18,4 | 1,0 | 1,2 | 20,6 | да, с запасом 3,4 ГиБ |
| 8 192 | 18,4 | 2,0 | 1,2 | 21,6 | да, запас 2,4 ГиБ |
| 16 384 | 18,4 | 4,0 | 1,2 | 23,6 | формально да, но на Windows с рабочим столом уже нет |
| 32 768 | 18,4 | 8,0 | 1,2 | 27,6 | нет, промах на 3,6 ГиБ |
Вот откуда берётся ощущение «работало, а потом сломалось»: при запуске с флагом -c 32768 движок аллоцирует весь кэш сразу и честно падает на старте, а вот при автоматическом или растущем контексте проблема выстреливает уже в процессе.
Обратите внимание, что родной контекст у Qwen3 32B — 40 960 токенов, а не 131 072, как у Llama 3.x. Колонка «128k» для этого семейства описывает режим с YaRN, который надо включать отдельно; без него такой контекст просто недоступен. В чужих таблицах эта оговорка обычно отсутствует, и читатель считает память под режим, которого у него нет.
Как проверить свой расчёт. llama.cpp печатает размер кэша прямо при загрузке, строкой вида size = 6791.50 MiB (69632 cells, 47 layers, 1/1 seqs), K (f16): 3595.50 MiB, V (f16): 3196.00 MiB. Если ваше число и число движка расходятся больше чем на пару процентов — скорее всего, в формулу подставлены головы внимания вместо KV-голов, либо у модели скользящее окно.
Скользящее окно внимания срезает кэш Gemma 3 в пять раз
По таблице архитектур Gemma 3 27B выглядит худшей моделью в подборке: 62 слоя и 16 KV-голов дают 496 КиБ на токен — вдвое больше, чем у Llama 3.3 70B. Наивный расчёт на 32k контекста даёт 15,50 ГиБ только под кэш. Вместе с весами в Q4_K_M это почти 32 ГиБ, и модель, которую Google называет «работающей на одной видеокарте», в 24 ГБ не влезает вовсе.
Так считают все чужие таблицы. И так не работает ни один современный движок.
В config.json у Gemma 3 есть два поля, которые в расчёт обычно не берут: sliding_window: 1024 и sliding_window_pattern: 6. Технический отчёт Gemma 3 расшифровывает их дословно: «a pattern of 5 local layers for every global layer» и «assign a smaller span of only 1024 tokens to the local layers».
По-человечески: из 62 слоёв только каждый шестой видит весь контекст. Таких слоёв десять. Остальные пятьдесят два смотрят назад не дальше чем на 1024 токена — и держать в кэше больше им не нужно.
llama.cpp это учитывает, причём по умолчанию: в документации сервера есть флаг --swa-full: use full-size SWA cache (default: false). Значение по умолчанию false означает ровно то, что кэш локальных слоёв ограничен окном, а не длиной контекста.
Считаем правильно. Десять глобальных слоёв держат полный контекст, пятьдесят два локальных — по 1024 токена каждый:
| Контекст | Наивная формула | С учётом окна | Во сколько раз меньше |
|---|---|---|---|
| 8 192 | 3,88 ГиБ | 1,03 ГиБ | 3,8 |
| 32 768 | 15,50 ГиБ | 2,91 ГиБ | 5,3 |
| 131 072 | 62,00 ГиБ | 10,41 ГиБ | 6,0 |
Авторы модели меряют тот же эффект в долях, и здесь нужна точность в цитировании. Конкретный процент в тексте отчёта приведён для абляционного варианта с соотношением 1:3 и окном 1024: при контексте 32k накладные расходы на кэш падают с 60 процентов до менее чем 15. Для продакшен-схемы 5:1, которая и стоит в Gemma 3 27B, отдельного числа в прозе отчёта нет — только график. Глобальных слоёв у 5:1 меньше, чем у 1:3, то есть экономия должна быть не хуже, но приписывать продакшен-модели ровно эти 15 процентов было бы натяжкой.
Практический итог: Gemma 3 27B в Q4_K_M при 32k контекста занимает 19,5 ГиБ, а не 32 — то есть спокойно живёт на карте 24 ГБ, тогда как «более лёгкая» по параметрам Qwen3 32B на том же контексте не живёт. Из таблицы «модель × квант» этого не видно никак.
Важная оговорка. Скользящее окно — свойство связки модели и движка, а не только модели. Запустите ту же Gemma 3 с флагом --swa-full, или на бекенде, который этот режим не реализует, и вернётся честная наивная цифра в 15,50 ГиБ. Поэтому проверять надо не только карточку модели, но и то, что печатает движок при загрузке.
MoE-модели: почему 117 млрд параметров не значит 117 ГБ памяти
Mixture of Experts — архитектура, в которой модель состоит из множества «экспертов», а на каждый токен работает лишь несколько из них. У Qwen3 30B-A3B это 128 экспертов, из которых активны 8; у gpt-oss-120b — тоже 128 экспертов, активны 4.
Отсюда растёт устойчивое заблуждение в обе стороны, и оба варианта неверны.
Заблуждение первое: «активных параметров 3 миллиарда, значит нужно как под 3B». Нет. Роутер заранее не знает, какие эксперты понадобятся на следующем токене, поэтому все веса обязаны лежать в памяти. Qwen3 30B-A3B в Q4_K_M весит 17,3 ГиБ — ровно как плотная модель на 30 миллиардов параметров. Активные параметры экономят вычисления и скорость, а не память.
Заблуждение второе: «раз память как у плотной, то и требования как у плотной». Тоже нет — и вот здесь начинается интересное. KV-кэш у MoE считается по тем же слоям и KV-головам, а число экспертов на него не влияет вообще.
| Модель | Параметров | KV-голов | Слоёв | KV на токен |
|---|---|---|---|---|
| Qwen3 8B (плотная) | 8,2 млрд | 8 | 36 | 144 КиБ |
| Qwen3 32B (плотная) | 32,8 млрд | 8 | 64 | 256 КиБ |
| Qwen3 30B-A3B (MoE) | 30,5 млрд | 4 | 48 | 96 КиБ |
MoE-модель на 30 миллиардов параметров держит кэш меньше, чем плотная на восемь. Причина не в экспертах, а в четырёх KV-головах вместо восьми и сорока восьми слоях вместо шестидесяти четырёх. На контексте 32k это разница между 3,00 и 8,00 ГиБ — те самые пять гигабайт, из-за которых одна модель на карте 24 ГБ живёт, а другая нет.
Отдельный случай — gpt-oss-120b. Модель на 117 миллиардов параметров, из которых активны 5,1 миллиарда. Публикуется сразу в MXFP4: карточка OpenAI прямо пишет, что «the models were post-trained with MXFP4 quantization of the MoE weights, making gpt-oss-120b run on a single 80GB GPU». Файл весит 63,4 ГБ, то есть 59,0 ГиБ — 4,34 бита на параметр по нашему расчёту, и 4,25 бита по заявлению Ollama (расхождение объясняется тем, что внимание, роутер и эмбеддинги остаются в BF16).
При этом её KV-кэш — самый скромный во всей подборке: 36 слоёв, 8 KV-голов, размерность головы всего 64, и вдобавок половина слоёв работает со скользящим окном на 128 токенов. При полном контексте 131 072 токена кэш занимает 4,50 ГиБ. Для сравнения, у плотной Llama 3.3 70B столько же кэша набирается уже при 16k.
То есть «120B» пугает цифрой в названии, а по памяти ведёт себя как большая модель с очень дешёвым контекстом. Если веса помещаются — контекст почти ничего не добавит.
Как считать MoE вообще:
- Веса — по полному числу параметров и реальному размеру файла, как у плотной модели. Никаких скидок на активные параметры.
- KV-кэш — по слоям и KV-головам из
config.json. Экспертов в формуле нет. - Если веса не влезают, у MoE есть отдельный рычаг: в llama.cpp флаг
--n-cpu-moeдержит веса экспертов первых N слоёв в оперативной памяти, оставляя внимание и общие части на видеокарте. Для плотной модели такого рычага не существует — там выгружаются слои целиком.
Модель не влезает: четыре рычага и цена каждого
Расчёт показал перебор. Дальше есть ровно четыре рычага, и у каждого своя цена. Порядок ниже — от самого дешёвого к самому дорогому.
Рычаг 1. Укоротить контекст. Самый недооценённый и часто самый безболезненный. Флаг -c в llama.cpp задаёт длину контекста напрямую; по умолчанию движок берёт её из модели, а модели сейчас заявляют 128 тысяч токенов. Если вы ведёте обычный диалог, а не разбираете стостраничный документ, 8192 токена закрывают почти всё. У Qwen3 32B переход со 32k на 8k освобождает 6 ГиБ — больше, чем даёт понижение кванта на ступень.
Цена: модель просто перестанет помнить начало длинного разговора. Никакой деградации качества внутри окна не происходит.
Рычаг 2. Квантовать KV-кэш. Флаги --cache-type-k q8_0 и --cache-type-v q8_0 переводят кэш с двух байт на элемент на один, то есть режут его ровно вдвое. У Qwen3 32B при 32k это 4,00 ГиБ вместо 8,00, и конфигурация возвращается в 23,6 ГиБ — на карте 24 ГБ снова работает, хоть и впритык.
Цена по качеству — единственный опубликованный замер с методикой, который мы нашли, даёт разницу перплексии на Qwen 2.5 Coder 7B в 0,0043 (8,3891 против 8,3934), и это внутри доверительного интервала обоих измерений. Команда запуска и данные приведены в обсуждении в репозитории llama.cpp. Это замер участника сообщества, не наш и не вендорский, и он один — второго с числами найти не удалось.
Оговорка из того же обсуждения важна: безопасен именно q8_0. Про q4_0 там же пишут, что он «produces weird results» на Qwen2-7B. Половинить кэш можно, четвертовать — на свой риск и с проверкой на своих задачах.
Рычаг 3. Спуститься на квант ниже. Q5_K_M вместо Q6_K, Q4_K_M вместо Q5_K_M. Каждая ступень по нашей измеренной шкале — примерно 0,8–1,4 бита на параметр, то есть на 32B-модели около 3 ГиБ.
Цена — потеря качества ответов, и она нелинейна: разница между Q6 и Q5 почти незаметна, между Q4 и Q3 — заметна хорошо. Подробный разбор того, что именно ломается на каждой ступени, — тема отдельного материала, здесь мы даём только цифры памяти.
Рычаг 4. Выгрузить слои в оперативную память. Флаг -ngl задаёт, сколько слоёв держать в видеопамяти; всё, что не поместилось, считает процессор. Формально это позволяет запустить что угодно на чём угодно. Практически это самый дорогой рычаг из четырёх.
Два независимых сторонних замера дают представление о масштабе. На одной 14B-модели в одном и том же кванте полная работа на GPU даёт 43,18 токена в секунду, полностью на CPU — 2,89, разрыв примерно пятнадцатикратный. На RTX 4060 с 8 ГБ переход от полной загрузки к частичной выгрузке роняет скорость с 40,58 до 8,62 токена в секунду — в 4,7 раза.
Важнее абсолютных чисел форма кривой: потеря не пропорциональна доле выгруженных слоёв. Она обвальная, потому что на каждом шаге генерации видеокарта простаивает, ожидая веса из системной памяти через шину PCIe. Выгрузить два слоя из восьмидесяти — почти бесплатно. Выгрузить двадцать — модель превращается в слайд-шоу.
Где выгрузка приемлема:
- Приемлема: пакетная обработка, где вы отдали задание и ушли; выгрузка одного-двух последних слоёв; MoE-модели через
--n-cpu-moe, где в оперативную память едут эксперты, а не слои целиком, и потери заметно меньше. - Неприемлема: интерактивный чат, работа ассистента в редакторе кода, любой сценарий, где вы ждёте ответ на экране. Здесь лучше взять модель на ступень меньше и получить её целиком в видеопамяти.
Общее правило по всем четырём рычагам: сначала контекст и KV-кэш, потом квант, выгрузка — последней. Первые два ничего не отнимают у качества модели, третий отнимает предсказуемо и понемногу, четвёртый убивает скорость.
Пятый рычаг существует, но он не про настройки: докупить памяти. Когда расчёт показывает перебор на всех квантах, вопрос переходит из плоскости флагов в плоскость железа — какую карту или мини-ПК брать под локальный ИИ, разобрано отдельно.
Сверка расчёта с чужими замерами: где формула сходится и где нет
Своих карт у редакции нет, поэтому проверить формулу мы можем только сопоставлением с чужими опубликованными цифрами. Вот все точки сверки, которые удалось найти, включая расхождения.
| Что сверяем | Наш расчёт | Внешний источник | Сходится |
|---|---|---|---|
| KV на токен, Llama 3.3 70B | 327 680 Б (320 КиБ) | 327 680 Б — англоязычный справочник по требованиям VRAM | да, точно |
| KV при 8k, Llama 3.3 70B | 2,50 ГиБ (2,68 ГБ) | «about 2.6 GB» | да |
| KV при 128k, Llama 3.3 70B | 40,00 ГиБ (42,9 ГБ) | «roughly 41 GB», у другого источника «~42 GB (BF16)» | да |
| KV при 32k, модель 8B | 4,00 ГиБ (4,29 ГБ) | «approximately 4.5 GB» | почти, расхождение объяснимо |
| Бит на параметр, Q4_K_M | 4,86 | 43 ГБ / 141 ГБ по данным Ollama = 4,88 | да |
| Размеры GGUF Llama 3.1 8B | 4,0 / 4,9 / 5,7 / 6,6 / 8,5 ГБ | Ollama: 4.0 / 4.9 / 5.7 / 6.6 / 8.5 GB | да, точно |
| Размеры GGUF Llama 3.3 70B | 34,3 / 42,5 / 49,9 / 57,9 / 75,0 ГБ | Ollama: 34 / 43 / 50 / 58 / 75 GB | да |
| Эффект скользящего окна, Gemma 3 при 32k | кэш меньше в 5,3 раза | отчёт авторов: «с 60% до менее 15%», но для абляции 1:3, не для продакшен-схемы 5:1 | порядок тот же, прямого сравнения нет |
| Надбавка на контекст, 70B при 8k | 2,50 ГиБ | один из справочников: «+20 GB» | нет, расхождение в 8 раз |
| Доля KV в общей памяти | у Qwen3 32B при 32k — 43% | другой справочник: «~5-10% extra VRAM» | нет |
Первые восемь строк сходятся, и это главный аргумент в пользу того, что формула рабочая. Расхождение по строке «4,5 ГБ против 4,29» объясняется просто: у источника другая восьмимиллиардная модель и в цифру, судя по формулировке, включён служебный буфер.
Две последние строки — это ошибки в топе выдачи, а не в нашем расчёте. Надбавка «+20 ГБ на 8k для 70B» завышена в восемь раз, и читатель по ней купит лишнюю карту. Утверждение «KV-кэш добавляет 5-10 процентов» верно только для очень короткого контекста: у Qwen3 32B при 32k кэш даёт 8,00 ГиБ против 18,4 ГиБ весов, то есть 43 процента.
Чего мы не проверяли и о чём поэтому не пишем: реальную скорость генерации на конкретных картах, поведение при нескольких одновременных пользователях (там KV-кэш умножается на число сессий) и точный расход на бекендах вне llama.cpp и Ollama.
Риски расчёта: движок, репозиторий кванта и платформа
Расчёт даёт нижнюю границу, а не гарантию. Вот всё, от чего результат может уехать, и что из этого устареет первым.
Репозиторий кванта. Один и тот же «Q4_K_M» у разных сборщиков отличается. Пример из нашей же таблицы: Qwen3 14B в Q4_K_M — 9,0 ГБ у одного репозитория и 9,3 ГБ по данным Ollama. Три процента разницы. У динамических квантов, где точность подбирается по слоям, расхождение бывает больше. Всегда смотрите размер того файла, который скачиваете.
Версия движка. Флаги и умолчания меняются. Значения, которые мы приводим, сверены с веткой master 16 августа 2026 года: KV-кэш по умолчанию в f16, --swa-full по умолчанию false, -ngl по умолчанию auto. Через полгода что-то из этого может быть другим, и первым делом стоит перечитать документацию сервера, а не чужую статью.
Бекенд. Всё в этом материале посчитано для llama.cpp и надстроек над ним (Ollama, LM Studio). У vLLM своя модель памяти с преаллокацией под пул KV-кэша, там расчёт другой. У бекендов без поддержки скользящего окна Gemma 3 будет требовать наивные 15,50 ГиБ при 32k, а не 2,91.
Платформа. На Apple Silicon память единая, и «сколько осталось видеопамяти» — вопрос настроек, а не спецификации карты. Наши цифры по весам и кэшу там применимы, а вот колонка «карта» — нет.
Число одновременных сессий. Все расчёты сделаны на одного пользователя. KV-кэш умножается на число параллельных запросов почти линейно: четыре сессии по 32k у Qwen3 32B дают уже 32 ГиБ кэша.
Служебные буферы. Наши 1,2 ГиБ — оценка, собранная из напечатанного движком буфера вычислений (507 МиБ в разобранном логе) и неотображаемого контекста драйвера. У другой модели, другого размера батча и другой версии CUDA это число будет иным. Оставляйте запас.
Что устареет первым. Именами моделей в таблице — они меняются каждые несколько месяцев. Реальными размерами файлов — при перевыпуске квантов. Дольше всех проживёт формула: она не зависит ни от имени модели, ни от года, и требует только четырёх чисел из config.json плюс размер файла.
Где перепроверять. Материала на английском по теме на порядок больше, чем на русском, и он делится на два класса. Сводные справочники требований к видеопамяти (в англоязычной выдаче это llm vram requirements) дают готовые таблицы по моделям; интерактивные страницы вида vram llm calculator считают по вашим параметрам. Пользоваться ими стоит именно как перекрёстной проверкой, а не как ответом: почти все они берут веса по правилу «0,5 байта на параметр» и скользящее окно не учитывают — то есть воспроизводят ровно те две ошибки, ради которых написан этот материал. Расхождение с нашей таблицей больше чем на 15 процентов почти всегда объясняется одной из них.
FAQ
Сколько видеопамяти нужно для модели на 7 миллиардов параметров?
В кванте Q4_K_M такая модель весит около 4,6 ГиБ. С контекстом 8192 токена и служебными буферами получается 6,8 ГиБ. На карте 8 ГБ это работает, но впритык: свободного места останется около гигабайта, и на Windows с открытым браузером его может не хватить. На 12 ГБ конфигурация живёт спокойно и позволяет поднять контекст до 32k.
Влезет ли модель на 32 миллиарда параметров в видеокарту на 24 ГБ?
Смотря какой контекст. Qwen3 32B в Q4_K_M занимает 21,6 ГиБ при 8192 токенах и помещается. При 32 768 токенах требуется уже 27,6 ГиБ, и карта не справляется. Промежуточный вариант — оставить 32k, но перевести KV-кэш в q8_0 флагами --cache-type-k q8_0 --cache-type-v q8_0: это даёт 23,6 ГиБ, то есть работает, но без запаса на рабочий стол.
Почему модель загрузилась, а через полчаса диалога вылетела с ошибкой памяти?
Потому что веса занимают фиксированный объём, а KV-кэш растёт с каждым токеном диалога. Если движок не аллоцировал весь контекст сразу, память кончается по мере наполнения окна. Лечится одним из двух: задать контекст явно флагом -c поменьше, чтобы падение случилось на старте и предсказуемо, либо перевести кэш в q8_0 и получить вдвое больше места под ту же длину.
Можно ли считать MoE-модель по активным параметрам, а не по всем?
Нет. Роутер не знает заранее, какие эксперты понадобятся на следующем токене, поэтому все веса обязаны находиться в памяти. Qwen3 30B-A3B с тремя миллиардами активных параметров весит столько же, сколько плотная тридцатимиллиардная. Активные параметры экономят вычисления и дают скорость маленькой модели, но не память. А вот KV-кэш у MoE считается по слоям и KV-головам и часто оказывается меньше, чем у плотной модели втрое меньшего размера.
Насколько безопасно квантовать KV-кэш до q8_0?
Единственный найденный замер с опубликованной методикой даёт разницу перплексии 0,0043 на Qwen 2.5 Coder 7B — величину, которая укладывается в доверительный интервал самого измерения. Экономия при этом ровно двукратная. Это замер одного участника сообщества, а не редакции, поэтому на своих задачах результат стоит проверить. Про q4_0 в том же обсуждении отзываются заметно хуже: половинить кэш безопасно, четвертовать — нет.
Считается ли оперативная память вместо видеопамяти, если модель не влезает?
Технически да: флаг -ngl в llama.cpp оставляет часть слоёв на процессоре, и запустить можно почти что угодно. Практически цена высокая и нелинейная. Сторонние замеры дают падение с 43,18 до 2,89 токена в секунду при полном переносе на процессор и с 40,58 до 8,62 при частичной выгрузке. Для пакетных задач это терпимо, для интерактивного чата — нет.
Как проверить, что мой расчёт совпал с реальностью?
llama.cpp печатает размер KV-кэша при загрузке строкой вида size = 6791.50 MiB (69632 cells, 47 layers, 1/1 seqs), K (f16): ..., V (f16): .... Сравните её со своим числом. Расхождение вдвое-вчетверо почти всегда означает, что в формулу подставлены головы внимания вместо KV-голов. Расхождение в разы в меньшую сторону — что у модели скользящее окно внимания.
