Спекулятивное декодирование — это техника, ускоряющая генерацию текста большими языковыми моделями без изменения модели и без ухудшения качества ответов. Представленная как способная ускорить вывод в 2–3 раза, она основана на более умной стратегии генерации, а не на изменении архитектуры.
Узкое место — память
Каждый раз, когда пользователь отправляет сообщение чат-боту, модель генерирует ответ токен за токеном, то есть фрагмент текста за фрагментом. Такой подход становится препятствием по мере роста моделей, особенно для программистских ассистентов, служб поддержки или агентов реального времени, требующих почти мгновенного ответа.
Тормозит в основном не вычислительная мощность. GPU вроде NVIDIA H100 очень быстры для матричных вычислений. Проблема в том, что миллиарды параметров модели, хранящихся в памяти, необходимо передать в процессор перед генерацией каждого токена. Вычислительные блоки при этом остаются в значительной степени бездействующими. Инженеры говорят о системе с ограниченной пропускной способностью памяти: добавление вычислительной мощности поэтому не ускоряет процесс заметно.
Предложить, а затем проверить
Принцип заключается в генерации нескольких кандидатных токенов за один раз с последующей их параллельной проверкой. Система опирается на две модели. Маленькая модель, называемая черновой (draft model), быстро создаёт последовательность кандидатов, обычно от четырёх до восьми токенов. Целевая модель (target model), более крупная и качественная, оценивает весь набор за один проход. Поскольку GPU предназначены для параллельных вычислений, обработка пакета токенов занимает ненамного больше времени, чем обработка одного токена.
Для каждого кандидата целевая модель сравнивает собственную вероятность с той, которую присвоила ему черновая модель. Если целевая модель уверена как минимум не меньше, токен принимается. В противном случае он принимается с вероятностью, уменьшающейся по мере роста расхождения. Отвергнутый токен заменяется токеном, выбранным из скорректированного распределения, после чего цикл повторяется. Согласно описанию метода, эта статистическая процедура гарантирует, что выходные данные следуют точно тому же распределению вероятностей, как если бы целевая модель генерировала каждый токен самостоятельно.
В лучшем случае все кандидаты принимаются, и целевая модель добавляет дополнительный токен, то есть пять-девять токенов за стоимость одного прохода целевой модели. В худшем случае первый кандидат отвергается, что добавляет небольшие накладные расходы, так как время генерации черновой модели всё равно затрачено. Поэтому плохо подобранная пара моделей может слегка замедлить генерацию.
Реальный выигрыш зависит в основном от коэффициента принятия, то есть от частоты, с которой кандидаты черновой модели проходят проверку. При уровне около 70–80 %, который считается типичным для хорошо подобранных пар на стандартных задачах, ускорение составляет от 2x до 3x. Предсказуемые или повторяющиеся тексты дают более высокие коэффициенты и больший выигрыш.
Варианты и практическое применение
Исходная схема требует отдельной черновой модели, что добавляет памяти и инженерной сложности. Несколько более новых техник обходятся без неё. Некоторые отказываются от строгой статистической гарантии ради более простой реализации или более высокой пропускной способности, что, по данным источника, обычно оказывает пренебрежимо малое влияние на качество выходных данных.
Medusa добавляет к целевой модели несколько дополнительных голов предсказания на её последнем слое, каждая из которых прогнозирует разную будущую позицию. Eagle (Extrapolation Algorithm for Greater Language-model Efficiency) опирается на внутренние состояния модели, а не на её выходные токены, что, по данным источника, способствует более высоким коэффициентам принятия на сложных или специализированных текстах. Prompt Lookup Decoding не использует вторичную модель: он находит в промпте и истории диалога выражения, которые могут появиться в ответе, и использует их как кандидатов, что особенно подходит для редактирования кода и суммаризации документов.
Спекулятивное декодирование предлагается как опция в нескольких фреймворках для вывода, включая text-generation-inference от Hugging Face, vLLM и llama.cpp. По данным источника, его активация чаще всего сводится к изменению конфигурации.
Техника наиболее выгодна для длинных генераций, когда модель обрабатывает один запрос за раз и промпт и ответ имеют общий словарь или структуру. Вопросно-ответные задачи, суммаризация документов и дополнение кода входят в число случаев, где выигрыш наиболее значителен. В высокопроизводительном пакетном обслуживании, напротив, она может снизить пропускную способность, так как черновые токены потребляют память и вычисления, которые могли бы быть использованы для других запросов.
