Предисловие для тех, у кого 3090 и ровно 24 гига
У тебя одна RTX 3090. Ты выкупил Qwen3.6-27B в Q4 квантовании. Без MTP модель спокойно жуёт 32K+ контекста. Включаешь MTP — и контекст падает до каких-то 14K. Генерация ускоряется, но работать не с чем.
Знакомая боль? Добро пожаловать в ад инженерных компромиссов. Я покажу, почему так происходит, и как выжать максимум, не расшибая копилку на вторую 3090.
Анатомия катастрофы: куда девается память
Сядь прямо, возьми калькулятор. Одна RTX 3090 — это 24 ГБ видеопамяти. Qwen3.6-27B в Q4_K_M занимает около 16 ГБ (веса + overhead). Остаётся 8 ГБ свободных.
KV-кеш на 32K токенов для 27B модели в FP16 кушает примерно 7.5 ГБ. Итого: 16 + 7.5 = 23.5 ГБ. Почти полный упор. Без MTP живём.
Теперь включаем MTP. По умолчанию llama.cpp предсказывает два дополнительных токена (--mtp 2). Это значит, что в памяти нужно держать не одну голову, а три: основная + две MTP-головы. Каждая MTP-голова для 27B модели весит как ~3.5 ГБ (скрытые состояния + проекции). Итого: 16 + 7.5 + 3.5 + 3.5 = 30.5 ГБ. Упс.
llama.cpp не падает в оут-оф-мемори — он просто урезает KV-кеш до тех пор, пока всё влезет. Сколько останется? 24 — 16 — 7 = 1 ГБ (округлим). 1 ГБ даёт примерно 4K токенов? Нет, это слишком мало. На практике — 14K.
| Компонент | Память (ГБ) |
|---|---|
| Модель Q4 | ~16 |
| KV-кеш (32K, FP16) | ~7.5 |
| MTP-голова (×2) | ~7.0 |
| Итого с MTP (32K) | 30.5 |
| Доступно VRAM | 24.0 |
| Дефицит | −6.5 |
Вот она, математическая правда жизни. MTP — дорогая игрушка.
Варианты выживания: от варварских до изящных
1. Просто выключи MTP
Самый очевидный вариант — --no-mtp. Скорость упадёт на 30–50%, зато контекст вернётся к 32K. Если тебе важнее длинный контекст, а не скорость — это твой выбор. Не надо геройства.
2. Уменьши число предсказываемых токенов
Поставь --mtp 1 вместо --mtp 2. Одна голова — это 3.5 ГБ. Съэкономишь половину MTP-накладных расходов. Контекст подрастёт до ~20K. Ускорение будет, но меньше.
3. Квантуй KV-кеш
Современный llama.cpp (май 2026) поддерживает --cache-type-k q4_0 и --cache-type-v q4_0. KV-кеш в Q4 вместо FP16 уменьшает его размер в 4 раза. 7.5 ГБ превращаются в ~2 ГБ. Это огромный выигрыш. С MTP и квантованным кешем ты можешь получить обратно 24K–32K контекста.
Звучит слишком хорошо? Нюанс: качество немного страдает, особенно на длинных контекстах. Но для большинства задач незаметно. Статья про TurboQuant на AMD показывает похожие приёмы — там получили 64K на RX 7900 XTX. У нас 3090, но принцип тот же.
4. Используй offloading на CPU
С параметром --tensor-split или --main-gpu можно часть слоёв отправить в CPU. Скорость упадёт, но контекст вырастет. Вариант для отчаянных — когда без MTP никак, а контекст нужен хотя бы 24K.
./llama-server --model qwen3.6-27b-q4_k_m.gguf \
--n-gpu-layers 60 \
--mtp 2 \
--cache-type-k q4_0 --cache-type-v q4_0 \
--ctx-size 32768Попробуй уменьшить --n-gpu-layers до 50–55, если не влазит.
Внимание: --cache-type-k q4_0 — экспериментальная фича в ветке master llama.cpp. Убедись, что собрал актуальную версию. На май 2026 она стабильна.
5. Перейди на Q3_K_M или Q2_K
Более низкое квантование модели сожмёт её до 12–13 ГБ. Освободится 3–4 ГБ — можно пустить на контекст. Качество пострадает, но для некоторых сценариев приемлемо. Тестируй.
Как не наступить на грабли: типичные ошибки
- Не смотри только на цифры в терминале. llama.cpp пишет что-то вроде
Available context size: 14336. Логи не всегда показывают, сколько съела MTP. Запускай с--verboseи смотри строчкиMTP head memory. - Не включай MTP, если контекст уже на пределе. Если без MTP ты получаешь 24K, то с MTP получишь ~10K. Лучше оставить как есть.
- Следи за версией llama.cpp. В Qwen 3.5 была известная бага с бессмыслицей — в Qwen3.6 её пофиксили, но MTP всё ещё жрёт память.
- Проверяй, что MTP включена правильно. Иногда модель не поддерживает MTP, и llama.cpp молча её игнорирует. Запусти
--infoи посмотриhas_mtp.
Тяжёлая артиллерия: TurboQuant и сплит на два GPU
Если RTX 3090 одна, а контекст нужен 32K+ с MTP — придётся либо добавить вторую 3090 через NVLink, либо использовать TurboQuant (экспериментальная техника сжатия KV-кеша). Там на AMD получили 64K — на 3090 тоже работает, но стабильность не гарантирована. В крайнем случае — RPC через ik_llama на двух машинах, как описано в гайде.
А что с качеством генерации?
MTP в Qwen3.6 — это не просто ускорение. Он меняет распределение вероятностей. Разбор на примере инструментальных агентов показывает, что MTP может делать модель более «торопливой» — она хуже планирует ответ. Так что прежде чем жертвовать контекстом ради скорости, задумайся: а нужно ли тебе MTP вообще?
Запусти A/B тест: один сеанс с —mtp 0, другой с —mtp 2 на одинаковом контексте 14K. Сравни когерентность длинных ответов. Часто удивляешься.
Так что делать?
Резюме для занятых:
- Обнови llama.cpp до последней версии (ветка master).
- Используй
--cache-type-k q4_0 --cache-type-v q4_0. - Поставь
--mtp 1, если нужен баланс. - Протестируй с разными
--ctx-size: начинай с 16384, увеличивай до упора. - Если контекст всё равно мал — отключай MTP или добавляй вторую 3090.
И напоследок: не верь маркетинговым обещаниям LM Studio про MTP. Там качество падает ещё сильнее. llama.cpp хотя бы позволяет тонко настраивать.
У тебя есть 24 ГБ. Используй их с умом.