Что такое MTP и почему это важно для MoE-моделей в llama.cpp
Multi-Token Prediction (MTP) - техника, при которой модель предсказывает не один следующий токен, а сразу несколько за один шаг инференса. Вместо последовательной генерации токен за токеном, MTP-головка выдает пакет из n следующих элементов, а llama.cpp проверяет их корректность и принимает только те, что совпадают с результатом обычного декодирования. Это радикально сокращает количество вычислительных шагов и поднимает скорость генерации.
Архитектура Mixture of Experts (MoE) усиливает эффект от MTP. В MoE-моделях каждый токен активирует лишь часть экспертов - 2 из 8 или 4 из 16 в зависимости от конфигурации. Параллельное предсказание нескольких токенов позволяет загрузить больше экспертов одновременно, эффективнее утилизируя вычислительные блоки GPU. Простой получает меньше, а параллелизма больше - это прямой путь к росту t/s TG (токенов в секунду генерации).
llama.cpp поддерживает MTP через два ключевых параметра: n-max - максимальное количество предсказываемых токенов за шаг, и min-p - порог минимальной вероятности для отсечения шумовых токенов. Правильный подбор этих значений под задачу и модель определяет, получите ли вы прирост в 50% или уйдете в замедление из-за массы отвергнутых предсказаний. Тесты на связке dual RTX 5060 Ti 16GB с включенными тензорными ядрами (sm tensor) дают конкретные цифры для двух MoE-моделей: Gemma4-26B-A4B-IT-QAT и Qwen3.6-27B-MTP.
Методика тестирования: оборудование, модели и метрики
Все замеры выполнены на одной физической машине с двумя видеокартами RTX 5060 Ti по 16 ГБ VRAM каждая. Тензорные ядра (sm tensor) активны - llama.cpp собран с поддержкой CUDA и флагом GGML_CUDA_USE_TENSOR_CORES. Это критично: без тензорных ядер скорость падает в 1.5–2 раза, и результаты теряют практический смысл для современных GPU.
Модели:
- Gemma4-26B-A4B-IT-QAT - MoE-модель Google с 26B общих параметров и 4B активных. Квантизованная версия QAT (Quantization-Aware Training) заточена под высокую точность при сжатии.
- Qwen3.6-27B-MTP - MoE-модель Alibaba с нативной MTP-головкой, 27B общих параметров. Версия специально оптимизирована для многотокенного предсказания.
Метрика - t/s TG (tokens per second, time to generate). Измеряется чистое время генерации ответа после обработки промпта (prefill). Контекст фиксирован на 2048 токенов, температура 0.7, top-p 0.9 для языковых задач и 0.0 для кода. Два сценария: диалог/повествование на русском языке и генерация Python-кода по спецификации. Версия llama.cpp - актуальный master на момент тестов (конец июля 2026).
Каждый замер повторялся 5 раз, в таблицах приведено медианное значение. Разброс между запусками не превышал 3%, что указывает на стабильность конфигурации без троттлинга.
Результаты: Gemma4-26B-A4B-IT-QAT - ускорение с 88 до 132 t/s TG
Базовая производительность Gemma4 без MTP - 88 t/s TG на естественном языке. После включения MTP с параметрами n-max=3 и min-p=0.2 скорость поднялась до 132 t/s TG. Прирост составил ровно 50% без видимой деградации качества текста. Модель сохранила связность на длинных ответах в 500+ токенов, не сваливалась в повторы и не теряла нить диалога.
Попытки поднять n-max до 5 дали 141 t/s TG, но в 3 из 5 прогонов появились артефакты: модель начинала перескакивать между темами внутри одного ответа. При n-max=7 скорость выросла до 148 t/s TG, однако каждый второй ответ содержал логические разрывы. Дальнейшее увеличение параметра не тестировалось - практическая ценность исчезла.
Почему n-max=3 и min-p=0.2 оптимальны для естественного языка
Естественный язык обладает высокой энтропией. После слова «я» может идти «думаю», «считаю», «пошел», «буду» - сотни вариантов с близкими вероятностями. Модель с n-max=11 предскажет 11 токенов, но llama.cpp при верификации примет только 1–2, а остальные отбросит. Вычислительные ресурсы потрачены впустую.
n-max=3 дает оптимальный баланс: три токена покрывают большинство коротких высоковероятностных последовательностей («я думаю что», «в данном случае», «с другой стороны»). Процент принятых предсказаний держится на уровне 60–70% - каждый второй шаг инференса экономит 1–2 дополнительных прохода.
min-p=0.2 отсекает токены с вероятностью ниже 20%. Это убирает шум - редкие слова и знаки препинания, которые модель могла бы предсказать ошибочно. Для диалогов и повествования порог в 0.2 сохраняет естественность речи, но отсекает экзотические продолжения, способные увести генерацию в сторону. Снижение min-p до 0.1 на Gemma4 дало 136 t/s TG ценой появления странных лексических выборов в 10% ответов.
Для более глубокого понимания механики MTP и его поведения под нагрузкой рекомендую разбор бенчмарка Qwen3.6-27B на RTX 5090 с vLLM, где показано, как конкурентные запросы и длина контекста влияют на эффективность многотокенного предсказания.
Результаты: Qwen3.6-27B-MTP - n-max=11 и min-p=0.0 для кода
Qwen3.6-27B-MTP показал принципиально иное поведение. Базовая скорость без MTP на генерации Python-кода - 61 t/s TG. С n-max=11 и min-p=0.0 скорость достигла 94 t/s TG. Прирост 54% при полном сохранении синтаксической корректности кода. Все сгенерированные функции проходили тесты без правок.
Почему такие агрессивные настройки работают для кода? Структура программного кода значительно более предсказуема, чем естественный язык. После def calculate( с вероятностью, близкой к 100%, идут self, затем x:, затем int или float, затем ) -> и так далее. MTP-головка угадывает 8–10 токенов из 11, llama.cpp принимает их, и за один шаг инференса генерируется целая сигнатура метода.
min-p=0.0 отключает фильтрацию по вероятности. В коде нет «шумовых» токенов - каждый символ синтаксически обусловлен. Отсечение даже 5% вероятных токенов может сломать структуру: пропущенная скобка или двоеточие сделают код невалидным. Нулевой порог гарантирует, что все предсказанные токены дойдут до верификации.
Попытка использовать n-max=15 подняла скорость до 99 t/s TG, но процент rejected tokens вырос до 40% - модель тратила вычисления на предсказания, которые не принимались. Дальнейший рост n-max упирается в закон убывающей отдачи: каждое дополнительное предсказание требует ресурсов, а вероятность его принятия падает экспоненциально.
Сравнение Gemma4 и Qwen3.6: какая модель для каких задач
| Характеристика | Gemma4-26B-A4B-IT-QAT | Qwen3.6-27B-MTP |
|---|---|---|
| Общие параметры | 26B (4B активных) | 27B |
| Скорость без MTP (язык) | 88 t/s TG | — |
| Скорость с MTP (язык) | 132 t/s TG (+50%) | — |
| Оптимальные настройки (язык) | n-max=3, min-p=0.2 | — |
| Скорость без MTP (код) | — | 61 t/s TG |
| Скорость с MTP (код) | — | 94 t/s TG (+54%) |
| Оптимальные настройки (код) | — | n-max=11, min-p=0.0 |
| Рекомендуемый сценарий | Диалоги, тексты, summarization | Генерация кода, structured output |
Gemma4 предпочтительна для чат-ботов, ассистентов, генерации контента - всего, где требуется связный естественный язык. Qwen3.6 выигрывает в сценариях с жесткой структурой: код, JSON, конфигурационные файлы. Обе модели демонстрируют, что MTP в llama.cpp - зрелая техника, дающая 50%+ прироста без апгрейда железа.
Интересный смежный подход к ускорению MoE-моделей - предсказательная загрузка экспертов через PCIe. В статье про скрытие латентности PCIe через MTP-головку разбирается, как та же технология многотокенного предсказания решает проблему CPU/GPU оффлоуда и потенциально поднимает скорость до 200 t/s.
Практические рекомендации: как внедрить MTP в ваш пайплайн
Запуск Gemma4 с оптимальными параметрами для естественного языка:
./llama-cli \
-m gemma4-26b-a4b-it-qat.gguf \
-ngl 99 \
--n-max 3 \
--min-p 0.2 \
--temp 0.7 \
--top-p 0.9 \
-c 4096Запуск Qwen3.6 для генерации кода:
./llama-cli \
-m qwen3.6-27b-mtp.gguf \
-ngl 99 \
--n-max 11 \
--min-p 0.0 \
--temp 0.0 \
--top-p 1.0 \
-c 4096Ключевой параметр -ngl 99 загружает все слои модели на GPU. Для dual GPU llama.cpp автоматически распределяет слои между картами. Убедитесь, что сборка выполнена с поддержкой тензорных ядер - проверьте вывод llama-cli --version на наличие строки GGML_CUDA_USE_TENSOR_CORES=ON.
Подбор параметров под свою задачу - итеративный процесс. Стартуйте с консервативных значений: n-max=2, min-p=0.3 для языка и n-max=5, min-p=0.0 для кода. Прогоните 10–15 генераций, оцените качество. Увеличивайте n-max с шагом 1–2, пока не заметите артефакты или пока прирост скорости не станет меньше 5% за шаг. Для языка снижайте min-p до появления неестественных конструкций.
Тюнинг параметров под своё железо: на что обратить внимание
Объем VRAM определяет максимальный n-max. Каждый дополнительный предсказываемый токен требует памяти под KV-кэш и промежуточные активации. На RTX 5060 Ti 16GB обе модели с n-max=11 занимали 13.2–14.1 ГБ из 16 доступных - запас меньше 2 ГБ. На картах с 12 ГБ или меньше придется снижать n-max до 5–7 или уменьшать длину контекста.
Тензорные ядра (sm tensor) критичны для производительности MTP. Без них матричные умножения в MTP-головке выполняются на CUDA-ядрах, и прирост от многотокенного предсказания падает до 15–20%. Проверьте флаги сборки llama.cpp: -DGGML_CUDA_USE_TENSOR_CORES=ON должен быть явно указан при компиляции.
Для владельцев систем с ограниченной памятью, желающих запускать большие MoE-модели, будет полезен материал по оптимизации VRAM-кэша в llama.cpp. Там разбираются техники offload экспертов и unified memory, позволяющие запускать модели весом 200+ ГБ на одной карте.
Ограничения и риски: когда MTP может не помочь
MTP не универсальный ускоритель. На маленьких моделях (до 7B параметров) вычислительная нагрузка от верификации нескольких токенов может превысить выигрыш от их параллельного предсказания. Тесты на Qwen2.5-7B показали прирост всего 8–12% - игра не стоит свеч.
Задачи с высокой энтропией - поэзия, креативное письмо, генерация шуток - плохо совместимы с MTP. Модель предсказывает наиболее вероятные продолжения, а творческие задачи требуют неожиданных выборов. Процент rejected tokens взлетает до 80%, и скорость падает ниже базовой. В таких сценариях MTP лучше отключить совсем (--n-max 0).
Воспроизводимость результатов зависит от версии llama.cpp. Поддержка MTP активно дорабатывается, и поведение может меняться между билдами. Тесты в этой статье выполнены на мастере от 20 июля 2026. При использовании более старых или новейших версий проверяйте контрольные замеры на своей конфигурации.
Конкретное железо тоже имеет значение. Dual RTX 5060 Ti 16GB - сбалансированная конфигурация с достаточной пропускной способностью памяти (448 ГБ/с на карту). На GPU с медленной памятью (например, RTX 4060 с 272 ГБ/с) прирост от MTP будет скромнее, так как узким местом станет подгрузка весов экспертов, а не количество шагов инференса.
Заключение: MTP как must-have для MoE в llama.cpp
Multi-Token Prediction в llama.cpp дает 50–54% прироста скорости на MoE-моделях Gemma4-26B и Qwen3.6-27B без замены оборудования. Gemma4 разгоняется с 88 до 132 t/s TG на естественном языке при n-max=3 и min-p=0.2. Qwen3.6 поднимается с 61 до 94 t/s TG на коде при n-max=11 и min-p=0.0. Обе конфигурации стабильны и не требуют жертв в качестве.
Ключевой вывод: параметры MTP нужно подбирать под задачу. Естественный язык требует консервативных настроек с фильтрацией по вероятности. Код и структурированные данные допускают агрессивное предсказание без порогов. Универсального рецепта нет - есть методология итеративного тюнинга, описанная выше.
Попробуйте MTP на своих задачах. Начните с готовых конфигураций из статьи, замерьте базовую скорость, увеличивайте n-max до появления артефактов. Делитесь результатами - сообщество llama.cpp активно собирает статистику по разным моделям и железу, и каждый новый датапоинт помогает точнее предсказывать оптимальные настройки.