Спекулятивное декодирование (Speculative Decoding)
Спекулятивное декодирование - это оптимизация вывода, при которой малая быстрая "черновая" модель предсказывает несколько токенов вперёд, а большая целевая модель затем проверяет их за один параллельный прямой проход, принимая те, что совпадают с тем, что она сама бы сгенерировала, и отклоняя остальные. Пользователь получает в точности тот же результат, что и при обычном декодировании, но в 2-4 раза быстрее.
Спекулятивное декодирование - это оптимизация вывода, при которой малая быстрая "черновая" модель предсказывает несколько токенов вперёд, а большая целевая модель затем проверяет их за один параллельный прямой проход, принимая те, что совпадают с тем, что она сама бы сгенерировала, и отклоняя остальные. Пользователь получает в точности тот же результат, что и при обычном декодировании, но в 2-4 раза быстрее.
Почему это важно
Генерация LLM ограничена последовательными зависимостями: каждый токен вынужден ждать предыдущего. Большие модели упираются не в чистую вычислительную мощность, а в пропускную способность памяти - необходимость перемещать свои огромные веса в вычислительные блоки GPU по разу на каждый токен. Спекулятивное декодирование разрывает последовательную цепочку, упаковывая несколько спекулятивных токенов в один прямой проход и резко сокращая число дорогих вызовов большой модели. Google впервые опубликовал этот метод в 2022 году; к 2024-2025 годам каждый крупный движок вывода (vLLM, TensorRT-LLM, llama.cpp, together.ai) поставляет спекулятивное декодирование как стандартную оптимизацию, снижая затраты на обслуживание на 30-70% при том же качестве вывода.
Как это работает
1. Черновая модель предлагает: малая дешёвая модель (скажем, двойник целевой модели на 70B с 1 млрд параметров) генерирует следующие k токенов авторегрессивно. Это быстро, потому что веса черновой модели малы.
2. Целевая модель проверяет: целевая модель выполняет один прямой проход по k черновым токенам параллельно, вычисляя, что она сама сгенерировала бы в каждой позиции.
3. Принятие или отклонение: начиная с первого чернового токена, целевая модель принимает его, если её собственный лучший выбор (или выборка, согласованная по вероятности) совпадает, и продолжает, пока не возникнет расхождение.
4. Исправление и продолжение: при первом расхождении токен целевой модели заменяет черновой. Процесс перезапускается с этого места.
5. Итоговый эффект: если черновик в среднем верен в 70% случаев, целевая модель генерирует примерно в 3 раза больше токенов за прямой проход, пропорционально снижая задержку.
Почему это без потерь
При правильной реализации спекулятивное декодирование даёт в точности то же распределение вывода, что и обычное декодирование. Математика работает, потому что целевая модель выступает в роли проверяющего: любой токен, предложенный черновиком, обязан пройти тест на принятие целевой модели, поэтому итоговая последовательность идентична той, что целевая модель сгенерировала бы в одиночку. Здесь нет компромисса по качеству - только прирост скорости.
Варианты
Базовое спекулятивное декодирование (Google 2022): одна черновая модель, одна целевая. Исходная формулировка.
Medusa: добавляет к самой целевой модели несколько "голов", которые предсказывают несколько токенов вперёд, устраняя необходимость в отдельной черновой модели. Более простое развёртывание.
EAGLE: более точный вариант, использующий собственные внутренние представления целевой модели для составления черновика, достигая более высоких показателей принятия, чем внешние черновики.
Древовидное спекулятивное декодирование: составление нескольких деревьев-кандидатов токенов параллельно. Выше вероятность принятия, больше вычислений на проверку.
Само-спекулятивное: пропуск слоёв целевой модели для формирования дешёвого "черновика" из тех же весов.
Когда это помогает больше всего
Вывод с пакетом из одного запроса: одиночный интерактивный чат ограничен памятью. Спекулятивное декодирование здесь блистает.
Длинные выводы: чем больше токенов генерирует модель, тем больше накапливается совокупная экономия.
Повторяющаяся структура: когда вывод следует предсказуемым паттернам (код, JSON), показатели принятия черновика очень высоки.
Использование простаивающего оборудования: на GPU, которые иначе простаивали бы в ожидании памяти, спекуляция заполняет вычислительный пробел.
Когда это помогает меньше
Обслуживание больших пакетов: высокопроизводительные нагрузки уже ограничены вычислениями, а не памятью. Спекуляция добавляет накладные расходы, почти не давая экономии.
Очень креативные / случайные выводы: низкие показатели принятия черновика ограничивают ускорение.
Крошечные модели: черновик на 1B над целевой моделью на 3B мало что экономит, потому что целевая модель и так дешева.
Короткие промпты с короткими ответами: накладные расходы на настройку спекуляции перевешивают выигрыш.
Компромиссы
Дополнительная модель в памяти: теперь вы обслуживаете и целевую, и черновую модель. Объём памяти растёт, если не использовать само-спекулятивный подход.
Сложность реализации: управление циклом проверки, выборкой с отклонением и откатом KV-кэша нетривиально. Используйте библиотеку.
Чувствительность к показателю принятия: плохо подобранный черновик может, наоборот, замедлить работу, если преобладают отклонения.
Холодный старт: первые несколько токенов не выигрывают от спекуляции, пока черновик "прогревается".
Распространённые ошибки
Использование черновой модели из другого семейства: черновик Llama для целевой модели Mistral редко принимается. Черновик должен быть согласован с целевой моделью.
Слишком большой черновик: черновик на 7B под целевой моделью на 70B имеет отличный показатель принятия, но слишком дорог в работе. Черновик должен составлять 5-20% размера целевой модели.
Игнорирование отката KV-кэша: отклонённые токены должны откатывать KV-кэш целевой модели. Забыв об этом, вы повреждаете состояние.
Применение к уже быстрым моделям: модели уровня Haiku/Flash легки по памяти. Спекуляция экономит меньше.
Отсутствие сквозного измерения: тестируйте весь путь запроса. Наивный прирост токенов в секунду иногда исчезает под нагрузкой или когда доминирует сетевая задержка.
Источники: