Контекст падает до 14K при MTP на Qwen 27B с одной 3090: решения | AiManual
AiManual Logo Ai / Manual.
27 Май 2026 Гайд

Почему контекст падает до 14K при включении MTP на Qwen 27B с одной 3090: разбор проблемы и возможные решения

Почему включение MTP в llama.cpp режет контекст Qwen3.6-27B до 14K на одной RTX 3090? Диагностика, расчет памяти и способы исправить.

Предисловие для тех, у кого 3090 и ровно 24 гига

У тебя одна RTX 3090. Ты выкупил Qwen3.6-27B в Q4 квантовании. Без MTP модель спокойно жуёт 32K+ контекста. Включаешь MTP — и контекст падает до каких-то 14K. Генерация ускоряется, но работать не с чем.

Знакомая боль? Добро пожаловать в ад инженерных компромиссов. Я покажу, почему так происходит, и как выжать максимум, не расшибая копилку на вторую 3090.

💡
Ключевая идея: MTP (Multi-Token Prediction) добавляет дополнительную голову, которая занимает гигабайты — и эти гигабайты отнимаются у KV-кеша.

Анатомия катастрофы: куда девается память

Сядь прямо, возьми калькулятор. Одна 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
Доступно VRAM24.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. Сравни когерентность длинных ответов. Часто удивляешься.

Так что делать?

Резюме для занятых:

  1. Обнови llama.cpp до последней версии (ветка master).
  2. Используй --cache-type-k q4_0 --cache-type-v q4_0.
  3. Поставь --mtp 1, если нужен баланс.
  4. Протестируй с разными --ctx-size: начинай с 16384, увеличивай до упора.
  5. Если контекст всё равно мал — отключай MTP или добавляй вторую 3090.

И напоследок: не верь маркетинговым обещаниям LM Studio про MTP. Там качество падает ещё сильнее. llama.cpp хотя бы позволяет тонко настраивать.

У тебя есть 24 ГБ. Используй их с умом.

Подписаться на канал