Спекулятивное декодирование: ускорение вывода LLM на 20–50%

Ускоренный инференс LLM без потери качества — практическое руководство

Содержимое страницы

Модель объемом 70 миллиардов параметров генерирует один токен за один прямой проход, и при каждом проходе веса перезагружаются из видеопамяти (VRAM), вычисляется внимание (attention) по всему контексту и синхронизируется память. Между токенами GPU простаивает, ожидая разрешения последовательных зависимостей.

инфографика qwen3 mtp vs standard

На процессоре H100 модель объемом 70 миллиардов параметров производит один токен каждые 30–50 мс. У GPU достаточно вычислительной мощности для параллельной обработки нескольких токенов, но последовательная зависимость этому мешает — каждый токен зависит от предыдущего, что приводит к остановке конвейера.

Спекулятивное декодирование преодолевает это узкое место, позволяя генерировать несколько токенов за время, которое обычно требуется для генерации одного, не изменяя распределение выходных данных. Получаемые вами токены статистически идентичны тем, что вы получили бы при стандартном авторегрессионном декодировании; единственное отличие заключается в скорости их получения.

В этом руководстве рассматриваются механизмы работы, доступные в 2026 году варианты, компромиссы между скоростью принятия решений и практическая настройка в llama.cpp, vLLM, SGLang и TensorRT-LLM.


Как работает авторегрессионное декодирование (и почему оно медленное)

Прежде чем понять спекулятивное декодирование, необходимо понять авторегрессионное ограничение, которое оно обходит. Стандартная авторегрессионная генерация обрабатывает токены последовательно:

  1. Выполните прямой проход через модель с текущим контекстом.
  2. Выберите следующий токен из распределения выходных данных.
  3. Добавьте токен к контексту.
  4. Повторите.

Каждый шаг требует полного прямого прохода — загрузки весов из видеопамяти, вычисления внимания по всему контексту и создания одного токена. Для модели с 70 миллиардами параметров это занимает примерно 30–50 мс на токен на H100. У GPU есть свободная вычислительная мощность — он мог бы обрабатывать больше работы параллельно, — но последовательная зависимость этому мешает.

Разрыв между вычислениями и пропускной способностью памяти

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

Спекулятивное декодирование решает эту проблему, предоставляя GPU больше работы на одну передачу памяти. Вместо одного токена за прямой проход оно генерирует K токенов за один проход, распределяя стоимость памяти по нескольким выходным данным.


Механизм Черновик-Верификация

Спекулятивное декодирование работает по повторяющимся циклам «черновик-верификация». Быстрый механизм черновика предлагает K кандидат-токенов — от небольшой модели черновика, поиска n-грамм или головы предсказания, прикрепленной к целевой модели, — а целевая модель проверяет все K токенов за один прямой проход. Фаза черновика дешева и обычно занимает 5–20% времени прямого прохода целевой модели, в то время как верификация сравнивает каждый предложенный токен с тем, что сгенерировала бы целевая модель, принимая самую длинную совпадающую префиксную часть и перебирая выборку с первого отклонения.

sequenceDiagram participant Draft as Механизм черновика participant Target as Целевая модель Draft->>Draft: Предложить K кандидат-токенов Draft->>Target: Отправить префикс черновика для верификации Target->>Target: Один прямой проход по K позициям alt Черновик совпадает с распределением цели Target->>Target: Принять самый длинный совпадающий префикс else Черновик расходится на позиции i Target->>Target: Принять токены 1..i-1, перебрать выборку с i end Target->>Draft: Добавить принятые токены, начать следующий цикл

Верификация K токенов стоит примерно столько же, сколько генерация одного токена авторегрессионно, поэтому, когда черновик верен, вы получаете K токенов по цене одного шага верификации.

Конкретный пример

Предположим, модель черновика предлагает 5 токенов: ["I", " like", " cooking", " and", " traveling"]. Целевая модель проверяет их за один прямой проход:

Токен Черновик Целевая модель согласна?
1 “I”
2 " like"
3 " cooking" ✗ (целевая модель сказала бы " playing")
4 " and" — (не оценивается)
5 " traveling" — (не оценивается)

Целевая модель принимает токены 1 и 2, затем генерирует " playing" для токена 3, производя три токена за один цикл вместо трех отдельных прямых проходов. Если бы черновик был верен до токена 5, вы получили бы пять токенов по цене одной верификации — ускорение в 5 раз только за этот цикл.

Узкое место верификации

На практике верификация занимает основное время выполнения — от 42% до 95% цикла, в зависимости от метода и размера модели. Прямой проход целевой модели является узким местом, а отклоненные токены представляют собой потраченные впустую вычисления.

Вот почему так важна скорость принятия решений. Каждый отклоненный токен после первого — это потраченные впустую усилия по верификации. Лучшие методы спекулятивного декодирования максимизируют ожидаемое количество принятых токенов за цикл, а не просто общую скорость принятия.


Математическая гарантия

Одно из самых важных свойств спекулятивного декодирования заключается в том, что оно производит токены из точно такого же распределения, как стандартная авторегрессионная выборка из целевой модели. Шаг верификации использует выборку с отклонением — когда черновик предлагает токен x, целевая модель вычисляет свою собственную вероятность p(x), а черновик вычисляет p_draft(x). Вероятность принятия равна:

min(1, p(x) / p_draft(x))

Когда целевая модель согласна (p(x) ≥ p_draft(x)), токен всегда принимается. Когда целевая модель не согласна, токен принимается с вероятностью, пропорциональной соотношению, а отклоненные токены перебираются из остаточного распределения:

r(x) = max(0, p(x) - p_draft(x)) / Σ max(0, p(y) - p_draft(y))

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


Стратегии моделей черновика

Механизм черновика — это переменная, имеющая наибольшее значение. Различные подходы имеют разные компромиссы между сложностью настройки, скоростью принятия решений и ускорением.

Независимые модели черновика

Самый простой подход загружает меньшую модель наряду с целевой — обычно модель объемом 1–3 миллиарда параметров выступает в роли черновика для целевой модели объемом 7–70 миллиардов параметров.

Плюсы:

  • Концептуально просто
  • Работает с любой целевой моделью
  • Модель черновика может быть настроена на соответствие распределению цели

Минусы:

  • Требуется загрузка второй модели в видеопамять (1–4 ГБ в зависимости от размера)
  • Качество модели черновика напрямую определяет скорость принятия решений
  • Черновики из разных семейств (например, Qwen для Llama) обычно работают плохо

Общее правило: Используйте модели из одного семейства. Gemma 2 2B хорошо черновит для Gemma 2 27B. Llama 3.2 1B хорошо черновит для Llama 3.1 70B. Черновики из разных семейств обычно имеют низкую скорость принятия решений, поскольку распределения токенов расходятся.

Поиск совместимых моделей черновика

Не все маленькие модели подходят в качестве моделей черновика для данной цели. Критическим фактором является выравнивание распределения — насколько близко выходные вероятности модели черновика соответствуют целевым.

Целевая модель Рекомендуемый черновик Совпадение семейства
Llama 3.1 70B Llama 3.2 1B-3B То же самое
Llama 3.1 8B Llama 3.2 1B То же самое
Qwen 3 27B Qwen 3 0.6B-1.8B То же самое
Gemma 2 27B Gemma 2 2B То же самое
Mixtral 8x7B Phi-3 4B (обучен на данных Mixtral) Кросс-семейное (осторожно)

Золотое правило: если скорость принятия решений модели черновика падает ниже 50%, спекулятивное декодирование может фактически замедлить вас. Накладные расходы на запуск модели черновика плюс верификация превышают выгоду, когда большинство предложений отклоняются.


EAGLE и EAGLE-3: Головы предсказания

EAGLE (Efficient Architecture Guided Language Model Estimation) устраняет необходимость в отдельной модели черновика. Вместо этого она прикрепляет легкие авторегрессионные головы предсказания к внутренним слоям целевой модели.

Как работает EAGLE

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

  1. Целевая модель выполняет прямой проход через свои слои.
  2. На каждом слое голова EAGLE считывает скрытое состояние и предлагает токены для будущих позиций.
  3. Несколько голов работают параллельно, каждая предсказывает разные временные шаги.
  4. Целевая модель проверяет все предложения за один проход.

Преимущество: головы EAGLE обучены специально для соответствия распределению целевой модели. Они напрямую видят внутренние представления цели, что дает им гораздо лучшее выравнивание, чем у независимой модели черновика.

Улучшения EAGLE-3

EAGLE-3 (2025) уточняет подход тремя ключевыми изменениями:

  1. Отбор слоев: Вместо прикрепления голов к каждому слою, EAGLE-3 использует байесовскую оптимизацию для выбора оптимального выходного слоя, снижая накладные расходы.
  2. Много-токеновое предсказание: Каждая голова предсказывает несколько токенов одновременно, увеличивая глубину черновика без пропорциональной вычислительной стоимости.
  3. Эффективность обучения: EAGLE-3 обучается на собственных данных генерации целевой модели, улучшая скорость принятия решений на рабочих нагрузках внутри распределения.

Скорость принятия решений: EAGLE-3 обычно достигает скорости принятия 60–80% на рабочих нагрузках внутри распределения, по сравнению с 40–60% для независимых моделей черновика. На рабочих нагрузках по генерации кода с высокой повторяемостью скорость принятия может превышать 85%.

Настройка: EAGLE-3 требует предварительно обученных голов для вашей целевой модели. NVIDIA предоставляет головы EAGLE-3 для нескольких популярных моделей через TensorRT-LLM и коллекцию модулей спекулятивного декодирования на HuggingFace. Реализации сторонних разработчиков существуют для vLLM и SGLang.

P-EAGLE: Параллельное черновое декодирование (март 2026)

Главное ограничение EAGLE-3 — авторегрессионное черновое декодирование — каждый токен черновика зависит от предыдущего, поэтому генерация K токенов черновика требует K последовательных прямых проходов через голову черновика, а накладные расходы черновика растут линейно с K. P-EAGLE снимает этот потолок, генерируя все K токенов черновика за один прямой проход через легковесный драфтер из 4 слоев, обученный предсказывать до 10 токенов параллельно.

Результат: P-EAGLE обеспечивает ускорение до 1.69x по сравнению с чистым EAGLE-3 на реальных рабочих нагрузках на NVIDIA B200. Преимущество расширяется при более высоких значениях K — там, где последовательное черновое декодирование EAGLE-3 становится узким местом, параллельное черновое декодирование P-EAGLE не несет дополнительных затрат.

Настройка в vLLM: Скачайте предварительно обученную голову P-EAGLE из HuggingFace, установите "parallel_drafting": true в конфигурации vLLM и используйте тот же флаг --speculative-model — vLLM остальное обработает сам. P-EAGLE является текущим передовым методом для спекулятивного декодирования на базе EAGLE, и если вы развертываете EAGLE в 2026 году, P-EAGLE — это вариант, который следует использовать.


Спекулятивное декодирование на основе n-грамм

Спекулятивное декодирование на основе n-грамм заменяет нейронный черновик сопоставлением с образцами в истории промпта. Алгоритм ищет повторяющиеся последовательности n-грамм в контексте, и когда текущая последовательность токенов совпадает с ранее увиденным паттерном, он предлагает токены, которые следовали за этим паттерном ранее — например, если модель уже сгенерировала def calculate_total(items): и снова встречает def calculate_total(, она знает, что следующие токены, скорее всего, будут items): на основе предыдущего появления.

Варианты карты n-грамм (ngram-map-k, ngram-map-k4v) используют хеш-таблицы для более быстрого поиска вместо линейного сканирования, где ключом хеша является текущая n-грамма размера N, а значением — последовательность токенов, которая следовала за ней.

Плюсы:

  • Нулевые накладные расходы на видеопамять — нет необходимости загружать дополнительную модель (~16 МБ для хеш-таблицы)
  • Экстремально быстро для повторяющихся рабочих нагрузок (редактирование кода, рефакторинг, генерация шаблонов)
  • Скорость принятия решений может достигать 90%+ на рабочих нагрузках с высокой самосходностью

Минусы:

  • Бесполезно для новой генерации — если паттерн ранее не появлялся, у n-грамм нет ничего для предложения
  • Скорость принятия решений падает почти до нуля на творческих или разнообразных рабочих нагрузках
  • Ограниченная глубина черновика (обычно 2–4 токена на совпадение)

Лучше всего подходит для: Рефакторинга кода, заполнения шаблонов, повторяющейся документации и любых рабочих нагрузок, где модель возвращается к схожим паттернам. Худшее применение: творческое письмо, открытый чат и задачи рассуждения.

Настройка параметров

Параметры n-грамм имеют большее значение, чем можно ожидать. Значения по умолчанию работают для кода, но текстовые рабочие нагрузки требуют корректировки:

Параметр По умолчанию Код Текст Примечания
size-n (длина поиска) 12 12-16 8-10 Более длинные n-граммы уменьшают ложные срабатывания, но пропускают короткие паттерны
size-m (длина черновика) 48 48 32 Более длинные черновики означают больше токенов на совпадение, но также больше отклонений
min-hits 1 1 2 Более высокое min-hits уменьшает ложные срабатывания ценой меньшего количества совпадений

Для текстовых рабочих нагрузок уменьшите size-n до 8–10 и увеличьте min-hits до 2. Это обменивает частоту совпадений на более высокую скорость принятия решений за каждое совпадение.


Самоспекулятивное декодирование

Самоспекулятивное декодирование (также называемое LayerSkip или самоспекуляцией) использует частичные вычисления самой модели в качестве черновика, поэтому отдельная модель не требуется.

Как это работает

Вместо запуска полной модели для каждого токена, самоспекулятивное декодирование запускает усеченную версию — пропуская некоторые слои трансформера — для дешевого генерирования токенов черновика, а затем полная модель проверяет предложения.

Например, модель с 32 слоями может работать только с 16 слоями для черновика, а затем верифицироваться со всеми 32 слоями. Усеченный прямой проход быстрее, потому что он обрабатывает меньше слоев, а токены черновика выигрывают от просмотра тех же начальных слоев, что и целевая модель.

Плюсы:

  • Не требуется загружать дополнительные веса модели
  • Естественное выравнивание с целевым распределением (одинаковая архитектура, частичные слои)
  • Хорошо работает для моделей с значительной избыточностью в более глубоких слоях

Минусы:

  • Требует модификации механизма вывода для поддержки частичных прямых проходов
  • Сложности с кэшем KV — черновик использует частичный кэш KV, который должен быть согласован с кэшем полной модели
  • Скорость принятия решений обычно ниже, чем у EAGLE или хорошо настроенных моделей черновика

Реализация в llama.cpp: PR #18471 представил самоспекулятивное декодирование, используя историю контекста в качестве черновика. Модель повторно использует токены из собственной истории генерации для предложения продолжений, что особенно эффективно для рабочих нагрузок по кодированию, где паттерны повторяются внутри одного окна контекста.


MTP (Много-токеновое предсказание)

MTP — это специализированная форма спекулятивного декодирования, встроенная непосредственно в определенные контрольные точки моделей. Qwen 3.6 поставляется как со стандартными, так и с MTP-включенными вариантами GGUF.

В чем разница: Головы MTP встраиваются в архитектуру модели во время обучения. Модель несет дополнительные головы предсказания, которые предлагают несколько будущих токенов за один прямой проход. Отдельной модели черновика нет — головы MTP являются частью самой целевой модели.

Компромиссы:

  • Нет модели черновика для управления — MTP активируется с помощью --spec-type draft-mtp --spec-draft-n-max N
  • Головы MTP добавляют ~1–2 ГБ накладных расходов на видеопамять
  • Лучше всего работает на архитектурах MoE (Qwen 3.6 35B-A3B), где разреженная маршрутизация держит головы MTP дешевыми

Для подробных бенчмарков MTP против стандартного декодирования для Qwen 3.6 27B и 35B, см. Qwen 3.6 MTP vs Standard on 16GB GPU.


Скорость принятия решений: Что это значит на практике

Скорость принятия решений (α) — это самый важный метрический показатель для производительности спекулятивного декодирования. Она определяет, получаете ли вы ускорение или платите накладные расходы.

Формула ускорения

Ожидаемое количество принятых токенов за шаг верификации:

E[accepted] = α × K

Где K — количество предложенных токенов черновика за цикл. Если α = 0.7 и K = 5, вы принимаете 3.5 токена за проход — ускорение в 3.5 раза по сравнению со стандартным декодированием (которое производит 1 токен за проход).

Скорость принятия решений по методам

Метод Типичный диапазон α Лучшая рабочая нагрузка
Модель черновика (одно семейство) 40-60% Общий чат, рассуждения
Модель черновика (разные семейства) 20-40% Редко рекомендуется
EAGLE-3 60-80% Общие рабочие нагрузки, код
P-EAGLE 65-85% Общие рабочие нагрузки, более глубокое спекулирование
n-gram 10-90%+ Зависит от нагрузки (высокая на повторяющихся, почти нулевая на новых)
MTP 50-70% Специально для моделей Qwen 3.6
Самоспекулятивное 30-50% Кодирование, повторяющиеся паттерны

Когда скорость принятия решений падает

Скорость принятия решений не постоянна в течение генерации. Она варьируется в зависимости от:

  • Позиции токена: Ранние токены обычно имеют более высокую скорость принятия (больше контекста, меньше неопределенности). Поздние токены падают по мере того, как модель исследует более разнообразные продолжения.
  • Типа рабочей нагрузки: Редактирование кода с повторяющимися паттернами видит α > 80%. Открытое творческое письмо видит α < 40%.
  • Температуры: Более высокая температура увеличивает расхождение между черновиком и целью, снижая скорость принятия. Спекулятивное декодирование лучше всего работает при низкой температуре (0.0–0.7).

Критический порог: Если ваша эффективная скорость принятия решений (α × K) падает ниже 1.0, спекулятивное декодирование медленнее, чем стандартное. Накладные расходы черновика плюс время верификации превышают стоимость одного авторегрессионного шага.


Спекулятивное декодирование в продакшене: Что на самом деле происходит

Исследовательские статьи сообщают об ускорении в 2–4 раза, но производственные бенчмарки рассказывают более нюансированную историю — ускорение сокращается с размером пачки, верификация доминирует во времени цикла, и ни один метод не выигрывает на каждой рабочей нагрузке.

Выводы SpecDecode-Bench (2026)

Систематическая оценка пяти вариантов SD (n-gram, EAGLE, EAGLE-3, Draft-Model, MTP) в vLLM на четырех моделях и шести рабочих нагрузках выявила:

  1. SD работает, но ускорение сокращается с размером пачки. При размере пачки 1, EAGLE достигает до 1.96x на Llama-3-70B. К размеру пачки 128 это падает до 1.21x. Система становится вычислительно ограниченной при высокой конкурентности, и у GPU остается меньше свободной вычислительной мощности для спекуляций.

  2. Верификация доминирует во времени выполнения (42–95%). Прямой проход целевой модели является узким местом. Уменьшение потраченных впустую верификаций на отклоненные токены — самый перспективный путь для улучшения.

  3. Ни один метод не выигрывает везде. EAGLE-3 — лучший универсальный выбор. Методы моделей черновика преуспевают, когда целевая модель большая (70B+). n-gram оптимален для редактирования кода и задач с высоким перекрытием.

  4. Анализ оракула выявляет разрыв. Теоретический верхний предел для комбинированных стратегий n-gram + EAGLE достигает ~4.9x на рабочих нагрузках по редактированию кода, но текущие реализации достигают 2–3x. Есть место для оптимизации.

Практические ожидания ускорения

Сценарий Ожидаемое ускорение
Модель 70B, один запрос, EAGLE-3 1.5-2.0x
Модель 70B, пачка 32, EAGLE-3 1.2-1.5x
Модель 8B, один запрос, модель черновика 1.3-1.8x
Редактирование кода, n-gram 2.0-4.0x (зависит от нагрузки)
Творческое письмо, любой метод 1.0-1.3x (часто не стоит того)
MTP на Qwen 3.6 27B, GPU 16GB 1.5-1.7x
P-EAGLE на B200, один запрос 2.0-3.0x

Эффект размера пачки критичен. При малых пачках у GPU есть свободные вычисления для спекуляций. При больших пачках система уже насыщена, и спекулятивное декодирование добавляет накладные расходы без пропорциональной выгоды.

Мониторинг в продакшене

Вы должны отслеживать скорость принятия решений в продакшене. Падение скорости принятия решений сигнализирует о том, что ваша модель черновика расходится с целевой — либо потому, что рабочая нагрузка изменилась, либо потому, что модель черновика требует переобучения.

Ключевые метрики для мониторинга:

  • Скорость принятия решений на запрос (должна быть стабильной вокруг вашей базовой линии)
  • Токенов в секунду с и без спекулятивного декодирования (фактическое ускорение)
  • Время верификации как процент от времени цикла (должно быть 42–95%)
  • Время прямого прохода модели черновика (должно быть < 20% от времени целевой модели)

Если ваша скорость принятия решений падает ниже 40%, отключите спекулятивное декодирование для этого запроса. Накладные расходы не стоят того.


Практическая настройка

Выбор движка так же важен, как и стратегия черновика — см. Ollama vs vLLM vs LM Studio и другие локальные рантаймы для того, как каждый рантайм обрабатывает батчинг, совместимость API и пропускную способность, прежде чем выбрать путь спекулятивного декодирования.

llama.cpp

Для общей настройки сервера и загрузки GGUF начните с быстрого старта llama.cpp; флаги ниже добавляют спекулятивное декодирование поверх.

llama.cpp поддерживает несколько методов спекулятивного декодирования через флаг --spec-type:

# Модель черновика (независимая)
llama-server \
  --model target-model.gguf \
  --draft-model draft-model.gguf \
  --spec-draft-n-max 4 \
  --parallel 1  # Обязательно: --parallel 1 для спекулятивного декодирования

# n-gram
llama-server \
  --model target-model.gguf \
  --spec-type ngram-simple \
  --spec-ngram-simple-size-n 12 \
  --spec-ngram-simple-size-m 48

# n-gram (настройка для текстовой нагрузки)
llama-server \
  --model target-model.gguf \
  --spec-type ngram-simple \
  --spec-ngram-simple-size-n 8 \
  --spec-ngram-simple-size-m 32 \
  --spec-ngram-simple-min-hits 2

# MTP (Qwen 3.6)
llama-server \
  --model Qwen3.6-27B-MTP.gguf \
  --spec-type draft-mtp \
  --spec-draft-n-max 2

# Самоспекулятивное (рабочие нагрузки по кодированию)
llama-server \
  --model target-model.gguf \
  --spec-type draft-self

Критические флаги:

  • --parallel 1 — Спекулятивное декодирование в llama.cpp требует режима одиночной пачки. Это текущее ограничение.
  • --spec-draft-n-max — Количество токенов черновика за цикл. Начните с 3–5; более высокие значения увеличивают нагрузку на видеопамять.
  • --spec-ngram-simple-size-n — Длина поиска n-граммы. По умолчанию 12 хорошо работает для кода; уменьшите до 8 для текста.

Распространенные ошибки:

  • Забывание --parallel 1 — сервер молча проигнорирует спекулятивное декодирование.
  • Использование моделей черновика из разных семейств — скорость принятия решений рушится, уничтожая любое ускорение.
  • Установка --spec-draft-n-max слишком высоко — каждый дополнительный токен черновика стоит видеопамяти для буфера черновика. Закон убывающей доходности вступает в силу около 5–8.

vLLM

Быстрый старт vLLM охватывает базовое развертывание; флаги ниже включают спекулятивное декодирование на существующем сервере vLLM.

vLLM поддерживает спекулятивное декодирование через флаги --speculative-model и --speculative-num-steps:

# Модель черновика
vllm serve target-model \
  --speculative-model draft-model \
  --speculative-num-steps 5 \
  --speculative-accept-length 5

# EAGLE-3
vllm serve target-model \
  --speculative-model EAGLE-target-model/ \
  --speculative-num-steps 7 \
  --speculative-draft-tensor-parallel-size 1

# P-EAGLE (параллельное черновое декодирование)
vllm serve target-model \
  --speculative-model P-EAGLE-target-model/ \
  --speculative-num-steps 7 \
  --speculative-parallel-drafting true

# n-gram
vllm serve target-model \
  --speculative-method ngram \
  --speculative-num-steps 5 \
  --ngram-context-size 12

Спекулятивное декодирование vLLM интегрировано с непрерывным батчингом, поэтому оно работает под конкурентными рабочими нагрузками. Планировщик обрабатывает несколько слотов токенов в рамках одного прямого прохода, а менеджер памяти обрабатывает кэш KV как для моделей черновика, так и для целевых моделей.

SGLang

SGLang поддерживает спекулятивное декодирование через флаг --speculative-algorithm:

python -m sglang.launch_server \
  --model-path target-model \
  --speculative-algorithm ngram \
  --ngram-context-size 12 \
  --ngram-max-candidate-tokens 6

Архитектура RadixAttention в SGLang хорошо сочетается со спекулятивным декодированием, потому что кэширование префиксов снижает стоимость верификации — целевая модель повторно использует кэшированное внимание для общих префиксов, делая каждый шаг верификации дешевле, чем холодный прямой проход.

TensorRT-LLM

TensorRT-LLM предоставляет спекулятивное декодирование производственного уровня с Triton Inference Server. Настройка более сложная, но обеспечивает лучшую производительность на оборудовании NVIDIA:

  1. Постройте движок TensorRT как для целевой, так и для модели черновика.
  2. Настройте репозиторий моделей с model.yaml, указывающим конфигурацию спекулятивного декодирования.
  3. Запустите Triton с бэкендом LLM API / PyTorch.

TensorRT-LLM поддерживает как варианты моделей черновика, так и EAGLE-3. Для рабочих нагрузок по генерации кода TensorRT-LLM со спекулятивным декодированием n-gram продемонстрировал снижение задержки в 2–3 раза в производственных развертываниях.


Когда использовать спекулятивное декодирование

Используйте его, когда

  • Большие целевые модели (7B+): Накладные расходы механизма черновика распределяются по вычислениям цели. Спекулятивное декодирование сияет, когда целевая модель медленная — чем больше цель, тем ценнее ускорение.
  • Рабочие нагрузки с низкой температурой: Спекулятивное декодирование лучше всего работает при температуре 0.0–0.7, где распределение целевой модели сфокусировано, и у черновика есть лучший шанс совпадения.
  • Интерактивные приложения: Рабочие нагрузки, чувствительные к задержкам (чат, завершение кода, вызовы инструментов агента), выигрывают больше всего. Пакетная обработка, где вы уже насыщаете GPU, видит меньше преимуществ.
  • Генерация и редактирование кода: Высокая повторяемость в паттернах кода делает n-gram и самоспекулятивное декодирование особенно эффективными.

Пропустите его, когда

  • Маленькие целевые модели (< 3B): Накладные расходы модели черновика приближаются к времени прямого прохода цели. Ускорение маргинально или отрицательно.
  • Сэмплинг с высокой температурой: При температуре > 0.7 распределение целевой модели слишком широко для надежного совпадения черновика.
  • Творческое письмо и открытая генерация: Низкая скорость принятия решений на новом контенте делает накладные расходы не стоящими того.
  • Большие размеры пачек (> 32): Система становится вычислительно ограниченной, и спекулятивное декодирование добавляет накладные расходы без пропорциональной выгоды. SpecDecode-Bench показывает падение ускорения с 1.96x до 1.21x при увеличении размера пачки с 1 до 128.

Комбинирование методов

Продвинутые настройки комбинируют несколько стратегий спекулятивного декодирования. Анализ оракула SpecDecode-Bench показал, что адаптивное комбинирование n-gram и EAGLE может вытолкнуть ускорение до 4.9x на рабочих нагрузках по редактированию кода.

Идея заключается в использовании n-gram для паттернов, которые появлялись ранее, где принятие высокое, а накладные расходы почти нулевые, и отступлении к EAGLE для новых токенов. На практике это требует поддержки движка для многоспособной спекуляции — vLLM и TensorRT-LLM имеют экспериментальную поддержку, но реализации производственного уровня все еще созревают.

На данный момент наиболее практической комбинацией является MTP + n-gram в llama.cpp. MTP обрабатывает нейронную спекуляцию, в то время как n-gram ловит повторяющиеся паттерны, которые пропускает MTP. На Qwen 3 27B эта комбинация достигает 120 токенов/сек по сравнению со стандартными 67 токенов/сек — ускорение в 1.8 раза.


Соображения по стоимости

Спекулятивное декодирование обменивает вычисления на задержку. Общее количество вычислений на токен примерно такое же — вы просто делаете больше работы параллельно, а не последовательно.

Влияние на стоимость GPU:

  • Задержка одиночного запроса улучшается на 20–50%, что важно для интерактивных приложений.
  • Пропускная способность (токенов/сек через множество запросов) улучшается меньше — GPU уже насыщена при больших размерах пачек.
  • Использование видеопамяти увеличивается на след модели черновика (1–4 ГБ для независимых черновиков, минимально для n-gram/EAGLE).

Облачный инференс: При $2–4/час за H100, спекулятивное декодирование снижает задержку на запрос без увеличения стоимости на токен. Для пакетной обработки, где вы уже насыщаете GPU, финансовая выгода минимальна — вы платите за то же время GPU в любом случае.

Когда спекулятивное декодирование экономит деньги: Интерактивные приложения, где вы взимаете плату за запрос и хотите сократить время до первого токена. Ускорение в 2x означает, что ваши пользователи ждут в два раза меньше, и вы можете обслуживать больше запросов в секунду на том же оборудовании.

Когда нет: Пакетная обработка, где вы уже максимизируете использование GPU. Дополнительные вычисления от спекулятивного декодирования не увеличивают пропускную способность — они просто меняют профиль задержки.


Что дальше

Спекулятивное декодирование созревает от исследовательской новинки до производственного стандарта. Фронтир движется за пределы текущих ограничений:

  • Спекулятивное спекулятивное декодирование (SSD): Параллелизует этапы черновика и верификации на отдельном оборудовании. Модель черновика работает асинхронно, предварительно спекулируя для нескольких вероятных результатов верификации. Ранние результаты показывают ускорение до 2x по сравнению с оптимизированным спекулятивным декодированием и 5x по сравнению с авторегрессионным декодированием. Пока не готово для продакшена, но направление ясно.

  • SpecSA (Разреженная спекулятивная верификация): Комбинирует спекулятивное декодирование с динамическим разреженным вниманием. Превращает разреженное внимание в рабочую нагрузку, ориентированную на верификацию, достигая до 3.49x сквозной пропускной способности по сравнению с авторегрессионным разреженным декодированием. Актуально для моделей с длинным контекстом, где разреженное внимание уже используется.

  • Адаптивная спекуляция: Автоматическое переключение между методами n-gram, EAGLE и модели черновика на основе характеристик рабочей нагрузки. Анализ оракула показывает значительный неиспользованный потенциал — текущие реализации достигают 2–3x, но теоретический предел составляет 4.9x.

  • Мультимодальное спекулятивное декодирование: Расширение черновика-верификации для мультимодальных моделей зрения-языка и генерации видео. Ранние обзоры показывают, что те же принципы применяются, но стратегии верификации нуждаются в адаптации для нетекстовых модальностей.


Рамки принятия решений

Вопрос Ответ Рекомендация
Размер целевой модели? < 3B Пропустите спекулятивное декодирование
Размер целевой модели? 7-13B Используйте n-gram или самоспекулятивное (низкие накладные расходы)
Размер целевой модели? 30B+ Используйте модель черновика или EAGLE-3 (больше цель = больше пользы)
Тип рабочей нагрузки? Редактирование/рефакторинг кода Комбинация n-gram + EAGLE
Тип рабочей нагрузки? Общий чат EAGLE-3 или P-EAGLE
Тип рабочей нагрузки? Творческое письмо Пропустите спекулятивное декодирование
Размер пачки? 1-4 (интерактивно) Спекулятивное декодирование помогает больше всего
Размер пачки? 32+ (пропускная способность) Спекулятивное декодирование помогает меньше
Температура? 0.0-0.7 Хорошо для спекулятивного декодирования
Температура? > 0.7 Пропустите спекулятивное декодирование
Оборудование? GPU 16GB Используйте n-gram или MTP (низкие накладные расходы на видеопамять)
Оборудование? GPU 24GB+ Модель черновика или EAGLE-3 выполнимы
Движок? vLLM EAGLE-3 или P-EAGLE (лучшая интеграция)
Движок? llama.cpp n-gram или MTP (самая простая настройка)
Движок? TensorRT-LLM EAGLE-3 или модель черновика (уровень продакшена)

Подписаться

Получайте новые материалы про системы, инфраструктуру и AI engineering.