Спекулятивное декодирование: SpecKV ускоряет LLM на 56%

Спекулятивное декодирование: SpecKV ускоряет LLM на 56%

Инференс больших языковых моделей (LLM) — одна из главных статей расходов в AI-сервисах. Спекулятивное декодирование, где маленькая «черновая» модель предлагает токены, а большая их проверяет, уже стало стандартным инструментом ускорения. Но у всех реализаций есть общий недостаток: длина спекуляции фиксируется заранее, обычно на значении 4. Исследователи из проекта SpecKV показали, что адаптивный выбор этого параметра даёт 56% прироста скорости — и всё это ценой 0,34 миллисекунды накладных расходов на шаг.

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

Спекулятивное декодирование (speculative decoding) — это техника ускорения авторегрессионной генерации текста. Небольшая модель-«черновик» (draft model) генерирует несколько кандидатов-токенов за один такт, а затем целевая модель (target model) проверяет их все за один прямой проход. Если черновик угадал правильно — все токены принимаются. Если ошибся — берётся исправление от целевой модели и цикл начинается заново. Ключевой параметр всего процесса — длина спекуляции γ, то есть сколько токенов черновик предлагает за один шаг.

Проблема в том, что γ жёстко задают на старте, обычно равным 4. Но оптимальное значение зависит от задачи, модели и, как выяснилось, от уровня сжатия целевой модели. Фиксированное γ работает «в среднем», но на каждом конкретном шаге можно было бы выбрать значительно лучше. До сих пор никто не задавался вопросом: а что если менять γ на лету, ориентируясь на сигналы самой черновой модели?

Проблема: сжатие и спекуляция связаны

В продакшене модели почти всегда квантизируют — уменьшают точность весов с FP16 до INT8 или даже 4-битного NF4. Это сокращает память и часто повышает пропускную способность, но меняет распределение вероятностей целевой модели. А от этого распределения напрямую зависит, сколько токенов-кандидатов будут приняты. Получается, что сжатие модели и выбор длины спекуляции — не независимые решения, а связанные параметры, которые нужно оптимизировать совместно. Именно этот факт до SpecKV оставался без внимания.

Исследователи замерили эту связь эмпирически. На паре Llama 3.2 1B (черновик) / 3B (целевая) они прогнали 240 экспериментов с четырьмя задачами — генерация кода, математические рассуждения, открытый диалог и суммаризация, — четырьмя значениями γ и тремя уровнями сжатия. Результат оказался показательным: оптимальное γ действительно сдвигается при смене квантизации. Под FP16 большинство задач предпочитают γ=2 или 4. Под INT8 оптимум смещается к 6 или 8 — потому что деквантизация через BitsAndBytes добавляет задержку на каждый шаг, и агрессивная спекуляция начинает окупаться за счёт амортизации возросших затрат. NF4 занимает промежуточную позицию с оптимальным γ в районе 4–6.

В среднем уровень принятия (acceptance rate) остаётся стабильным — около 0,70 при всех уровнях сжатия. Но профиль пропускной способности заметно меняется. Например, для математических рассуждений при FP16 оптимальное γ=6 даёт 128,7 токенов/с, а при INT8 — уже γ=8 становится оптимальным. Для суммаризации при FP16 лучше всего γ=2 (111,6 токенов/с), а при INT8 тот же γ=2 уже далеко не оптимален.

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

SpecKV не требует дополнительных вычислений. На каждом шаге спекулятивного декодирования черновая модель уже выдаёт распределение вероятностей по словарю для каждого кандидата-токена. Обычно эти данные просто выбрасывают. SpecKV извлекает из них четыре сигнала: среднюю энтропию черновика, среднюю уверенность (confidence), максимальную энтропию и минимальную уверенность. Все четыре вычисляются «бесплатно» — они являются побочным продуктом обычного процесса генерации.

Эти сигналы подаются на вход простейшему MLP с 16 скрытыми нейронами, который предсказывает уровень принятия для каждого кандидата γ из множества {2, 4, 6, 8}. Контроллер выбирает γ, максимизирующее ожидаемое число принятых токенов. Обучение MLP занимает минуты на небольшом датасете из профилировочных прогонов. Важно, что корреляция между сигналами черновика и реальным уровнем принятия составляет около 0,56 — и, что ключевое, она стабильна при всех уровнях сжатия. Один и тот же предиктор обслуживает FP16, INT8 и NF4 без переобучения. Это значит, что при переключении модели между режимами квантизации контроллеру не нужно ничего знать заранее — он подстроится автоматически.

Анализ важности признаков показал, что наиболее информативными оказались минимальная уверенность (30% важности) и максимальная энтропия (24,1%). Это логично: они отражают «худший случай» среди токенов-кандидатов. Если хотя бы один токен в цепочке имеет высокую энтропию или низкую уверенность, именно он с наибольшей вероятностью будет отклонён целевой моделью — а отказ на любом позиции обрывает весь остаток цепочки.

Экспериментальная установка

Все эксперименты проведены на одной видеокарте NVIDIA RTX 3090 с 24 ГБ видеопамяти. В качестве моделей использовалась семья Llama 3.2: 1B-Instruct как черновик и 3B-Instruct как целевая модель, обе со словарём 128 256 токенов. Спекулятивное декодирование реализовано вручную поверх HuggingFace Transformers, чтобы получить покашровое логирование — каждый шаг записывал уровень принятия, энтропию и уверенность черновика.

Тестировались три режима квантизации целевой модели: FP16 без сжатия, INT8 через BitsAndBytes и 4-битный NF4 (NormalFloat) также через BitsAndBytes с FP16 compute dtype. Для каждого сочетания уровня сжатия и значения γ прогонялись 20 промптов — по 5 на каждую из четырёх задач. В сумме получено 240 записей экспериментального уровня и 5 112 покашровых записей. Это скромный масштаб, но достаточный, чтобы продемонстрировать сам феномен — зависимость оптимального γ от квантизации.

Результаты: 56% прироста с копеечными накладными расходами

SpecKV-fast (MLP-16) демонстрирует 5,82 ожидаемых токена на шаг против 3,73 у фиксированного γ=4. Это 56,0% улучшения, причём результат статистически значим (p < 0,001, paired bootstrap test с 10 000 ресемплирований). Улучшение стабильно при всех уровнях сжатия: 54,8% для FP16, 56,0% для INT8 и 56,9% для NF4. Стабильность важна — она означает, что SpecKV не просто подстраивается под один режим, а работает как универсальный оптимизатор.

Накладные расходы контроллера — 0,34 мс на шаг при типичной длительности шага около 70 мс на RTX 3090. Это менее 0,5% от времени шага, что даёт чистый прирост около 55,5%. Для сравнения: авторы протестировали также Random Forest со 100 деревьями — он достигает лучшей точности (корреляция 0,835), но требует 21 мс на решение, что уже непозволительно дорого для продакшена. MLP-16 был выбран сознательно как точка на Парето-фронте между точностью и скоростью. Ридж-регрессия тоже укладывается в бюджет по времени, но заметно уступает по качеству предсказания.

Любопытное наблюдение: SpecKV-fast почти точно совпадает с Fixed-best — стратегией, где для каждого уровня сжатия заранее выбрано лучшее фиксированное γ. Разница составляет всего 0,01 токена на шаг. Разница в том, что Fixed-best требует априорного знания оптимального γ для каждого режима, а SpecKV подбирает его на лету для каждого конкретного шага генерации, не требуя никакой ручной настройки.

Практическое значение для инженеров

SpecKV — это не теоретический конструкт. Исследование проведено на доступном железе (одна RTX 3090), код и данные полностью открыты на GitHub. Подход легко встроить в существующие inference-движки: контроллер — это буквально один полносвязный слой с 16 нейронами, который вызывается на каждом шаге спекулятивного декодирования.

Для команд, которые уже используют спекулятивное декодирование в vLLM, SGLang или HuggingFace Transformers, интеграция SpecKV означает минимальные изменения. Система особенно полезна при динамическом переключении между уровнями квантизации — например, когда трафик низкий и модель работает в FP16, а при пиковой нагрузке переключается на INT8 или NF4 для экономии ресурсов. SpecKV автоматически адаптируется к каждому режиму без перенастройки. В сценариях с mixed-workload, когда один и тот же сервис обслуживает и генерацию кода, и чат, и суммаризацию, адаптивный выбор γ даёт выигрыш ещё и за счёт того, что разные задачи при одном и том же уровне сжатия предпочитают разные γ.

Ограничения и перспективы

Работа имеет ряд ограничений. Оценка проведена на относительно небольшой паре моделей (1B/3B) — на крупных продакшен-моделях вроде 8B/70B паттерны принятия могут отличаться. Использовано всего 20 промптов по 4 задачам; репрезентативная оценка требует сотен примеров на категорию (HumanEval с 164 задачами, GSM8K с 1319, MT-Bench, ShareGPT). Основная оценка проведена через офлайн-симуляцию, а не через live-инференс — хотя это стандартная практика для offline policy evaluation, end-to-end тест даст более точные цифры пропускной способности. И наконец, тестировалась только квантизация весов, но не сжатие KV-кэша (H2O, StreamingLLN) и не разреживание внимания — а эти техники тоже влияют на распределение целевой модели.

Авторы наметили конкретные направления развития: масштабирование на пары 1B/8B и 8B/70B, интеграцию с vLLM и SGLang в виде плагинов, онлайн-адаптацию через Thompson Sampling и контекстные бандиты, а также расширение на сжатие KV-кэша и attention sparsification, которые напрямую затрагивают верификационное поведение целевой модели.

Часто задаваемые вопросы

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

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

Насколько SpecKV быстрее стандартного подхода?

SpecKV даёт 56% прироста в ожидаемом числе токенов на шаг по сравнению с фиксированным γ=4, который используется в большинстве систем. Накладные расходы контроллера — 0,34 мс на шаг, менее 0,5% от общего времени. Чистый прирост составляет около 55,5%.

Нужно ли переобучать SpecKV при смене модели?

Да, для каждой пары draft/target моделей нужен небольшой профилировочный прогон для сбора обучающих данных. Но обучение самого MLP занимает минуты, а данные можно собрать на 20–50 промптах за один вечер на одном GPU. При этом один и тот же контроллер работает для всех уровней квантизации — переобучать при смене INT8 на NF4 не нужно.

Почему бы просто не выбрать лучшее фиксированное γ для каждой модели?

Потому что оптимальное γ зависит не только от модели, но и от конкретного шага генерации. Даже в рамках одного промпта уверенность черновой модели меняется от токена к токену — где-то она сильно уверена и можно рисковать с γ=8, а где-то не уверена и лучше ограничиться γ=2. SpecKV улавливает эти колебания, а фиксированное значение — нет.

Итог

SpecKV показывает, что спекулятивное декодирование можно значительно ускорить, просто перестав фиксировать длину спекуляции. Адаптивный выбор γ на основе «бесплатных» сигналов черновой модели даёт 56% прироста при мизерных накладных расходах. А главное — система автоматически адаптируется к уровню квантизации целевой модели, что особенно ценно в продакшене, где модели регулярно переключаются между режимами сжатия. Код и данные доступны на GitHub — если вы используете спекулятивное декодирование в своём сервисе, стоит протестировать SpecKV на своих моделях и задачах.

← Все записи
← Все записи