В llama.cpp предложили поддержку MTP — Qwen3.6 27B быстрее в 2,4 раза

Разработчик am17an открыл PR в llama.cpp с поддержкой MTP-голов: модель предсказывает три токена вперёд, основной forward-pass проверяет их параллельно, и в среднем 75% попадают сразу. На Qwen3.6 27B Q8_0 это даёт ускорение в 2,4 раза.

Обложка: В llama.cpp предложили поддержку MTP — Qwen3.6 27B быстрее в 2,4 раза

Разработчик am17an открыл PR #22673 в llama.cpp с поддержкой MTP-голов: дополнительные слои модели предсказывают следующие три токена, а основной forward-pass проверяет их одним проходом. На Qwen3.6 27B при 8-битной квантизации режим даёт стабильные 16–22 токенов в секунду против 7 на baseline — ускорение в 2,4 раза.

MTP (Multi Token Prediction) — техника, предложенная исследователями Meta в апреле 2024: рядом с основной языковой моделью обучаются дополнительные головы, предсказывающие следующие 1–3 токена напрямую. Широкое применение в production-LLM пришло с DeepSeek-V3, а Qwen3.6 поддерживает архитектуру из коробки. До PR #22673 при экспорте в GGUF эти головы терялись. Теперь они подтягиваются как отдельная под-модель внутри того же файла и работают как драфтер для спекулятивного декодинга.

Главное
Ключевые выводы

Что добавили. Поддержку Multi Token Prediction в llama.cpp — флаг --spec-type mtp запускает спекулятивный декодинг через MTP-головы модели.

Скорость. Qwen3.6 27B Q8_0 — 16–22 ток/с против 7 ток/с baseline. Ускорение в 2,2–2,4 раза в зависимости от типа задачи.

Accept rate. При --spec-draft-n-max 3 — 72,2% угаданных токенов в среднем; при n-max 2 — 82,6% (короче драфт, выше попадание).

Совместимость. Подтверждены Qwen3.6 27B и Qwen3.6 35BA3B; по заявлению автора, режим работает на любой модели с MTP-головами.

Где взять. Готовый GGUF с MTP-головой для Qwen3.6 27B автор приложил к PR — отдельный файл скачивать не нужно, всё в одном.

Что такое Multi Token Prediction

Стандартный авторегрессионный декодинг генерирует токены последовательно: сгенерировал — пересчитал контекст — сгенерировал следующий. Это упирается в латентность памяти: каждый токен требует одного полного прохода через модель, и с ростом её размера падает скорость генерации.

Спекулятивный декодинг ускоряет процесс через идею «угадай и проверь»: маленькая черновая модель быстро генерирует несколько токенов вперёд, а большая основная модель проверяет их одним пакетным проходом. Принятые токены остаются, отвергнутые перегенерируются. Если черновик угадал — экономия в разы.

MTP идёт дальше: вместо двух разных моделей (большая + черновая) одна и та же модель обучается предсказывать сразу несколько следующих токенов через дополнительные параллельные головы. Концепция вышла из статьи Meta «Better & Faster Large Language Models via Multi-token Prediction» (Gloeckle и соавторы, апрель 2024), массовое применение в production-LLM пришло с DeepSeek-V3. Главное преимущество — не нужно держать в памяти отдельную draft-модель.

Бенчмарки am17an на Qwen3.6 27B

Автор PR прогнал девять синтетических задач — генерация Python-кода, C++-кода, объяснение концепций, суммаризация, факто-QA, перевод, креативные тексты, пошаговая математика и длинный код-ревью. Замеры с одной моделью и одним GPU (см. gist с бенчмарком):

  • Baseline без спекулятивного декодинга: 7,0–7,7 ток/с, агрегат 201 секунда на 1404 токена.
  • MTP, n-max 3 (3 драфт-токена за шаг): 13,9–21,6 ток/с, accept rate 72,2%, 83,8 с — ускорение в 2,4 раза.
  • MTP, n-max 2: 15,2–18,2 ток/с, accept rate 82,6%, 90,4 с — короче драфт, но выше доля принятых.
  • Draft-модель Qwen3.5 0.8B, n-max 16: для сравнения с классическим speculative decoding — 12,7–47,7 ток/с, accept rate 67,7%, 81,4 с.

На фактической QA («ответь точно») draft-модель догоняет MTP по скорости — accept rate подскакивает до 99,4%, — но на креативных и аналитических задачах MTP стабильнее: меньше провалов на нестандартных формулировках.

Как запустить

После сборки llama.cpp из ветки PR запуск сервера с MTP выглядит так:

			./llama-server -m qwen3.6-q8_0-mtp.gguf -np 1 \
  --chat-template-kwargs '{"preserve_thinking": true}' \
  --spec-type mtp --spec-draft-n-max 3
		

Ключевой флаг — --spec-type mtp. --spec-draft-n-max 3 задаёт длину драфта; для большинства моделей оптимум — 2 или 3.

Готовый GGUF с MTP-головами для Qwen3.6 27B автор приложил к PR. Конвертация других MTP-моделей идёт через обновлённый convert_hf_to_gguf.py из той же ветки.

MTP против обычного спекулятивного декодинга

Классическая схема speculative decoding в llama.cpp требует двух GGUF-файлов: основной модели и небольшой черновой (например, Qwen3.5 0.8B как драфт для Qwen3.6 27B). Это удваивает требования к памяти и усложняет деплой — нужно следить, чтобы токенизаторы у обеих моделей совпадали. MTP убирает оба ограничения: дополнительные головы лежат в том же GGUF-файле, что и основная модель, токенизация заведомо одна. По бенчмаркам автора MTP-режим стабильнее по задержке, а draft-модель может выстрелить выше пика на специфичных задачах вроде QA, где её предсказания проще.

В обсуждении PR мейнтейнер ngxson отметил, что предыдущие попытки добавить MTP опирались на постоянное копирование данных между host и device — основной автор am17an обошёл это через отдельный hook для распространения скрытых признаков между ubatch-ами.

Свежий старт лучше моего WIP #18886 — другие попытки добавить MTP сильно полагались на копирование данных host ↔ device. Похоже, у тебя это решено?
Xuan Son Nguyen (ngxson)мейнтейнер llama.cpp
Часто задаваемые вопросы
1
Каким моделям даст ускорение MTP-режим?

Тем, что обучены с MTP-головами. На сегодня в этом списке Qwen3.6 (27B и 35BA3B протестированы автором PR) и DeepSeek-V3. Llama 3, Mistral и большинство более старых моделей MTP-голов в архитектуре не имеют — они продолжат работать через классический speculative decoding с отдельной draft-моделью.

2
Что выгоднее — MTP или draft-модель?

MTP экономит видеопамять: одна модель вместо двух. По скорости на агрегате — сопоставимо: MTP n-max 3 даёт ускорение в 2,4 раза (83,8 с против 201 с), draft-модель Qwen3.5 0.8B с n-max 16 — в 2,5 раза (81,4 с). На фактической QA draft-модель быстрее, на креативных задачах — MTP. Если у вас Qwen3.6 — MTP проще в эксплуатации.

3
Какие настройки --spec-draft-n-max выбирать?

Для MTP оптимум 2–3 токена. n-max 3 даёт более высокий потолок скорости (до 21,6 ток/с), но нижний accept rate (54–91% по задачам). n-max 2 стабильнее — accept rate 67–95%, но потолок ниже. Большие значения (n-max 5+) для MTP смысла не имеют: модель обучена предсказывать ограниченное число токенов вперёд.

4
Когда MTP попадёт в релизные сборки?

PR #22673 находится в активной фазе ревью у мейнтейнеров llama.cpp; уже получил положительную реакцию ngxson. Зависит от мерджа PR #22400 (partial seq_rm для GDN-моделей). До тех пор сборка из ветки PR — единственный способ попробовать. Готовые бинарники с MTP в официальных релизах ggerganov ещё не публиковал.

Чек-лист для тех, кто хочет попробовать

  1. Склонировать репозиторий llama.cpp и переключиться на ветку PR #22673 (или дождаться мерджа в master).
  2. Собрать с CUDA или Metal-бэкендом — режимы для CPU работают, но без значимого ускорения.
  3. Скачать GGUF с MTP-головой: qwen3.6-q8_0-mtp.gguf, ссылка приложена в PR.
  4. Запустить llama-server с флагами --spec-type mtp --spec-draft-n-max 3.
  5. Сравнить токены в секунду с baseline (без флагов спекулятивного декодинга) — на Qwen3.6 ожидается рост в 2–2,5 раза.

Выводы

После мерджа PR локальный запуск Qwen3.6 27B приближается по задержке к облачным API: разница в ответе на коде и аналитике сокращается с десятков секунд до считанных. Для MoE-вариантов вроде Qwen3.6 35BA3B экономия видеопамяти от MTP особенно полезна — ту же скорость теперь можно получить на одной серверной карте, не запуская параллельно отдельную draft-модель.

Если пишете инструменты вокруг локальных LLM — обновитесь после мерджа PR в master. Тем, кто использует облачные модели только из-за скорости, имеет смысл проверить, не закрывает ли Qwen3.6 + MTP их сценарий. У нас уже выходил отдельный гайд по запуску LLM локально через Ollama — он пригодится, если вы только подбираете инструменты.

Источники: PR #22673 в llama.cpp, бенчмарки am17an.