Спекулятивное декодирование: что могло пойти не так
Спекулятивное декодирование — штука, которая в теории звучит как мечта: дёргаешь слабую модель, чтобы она предсказала много токенов за раз, а сильная модель лишь верифицирует. На практике же классический подход (Lookahead, Medusa, Eagle) страдает от двух вещей: маленький lookahead (<10 токенов) и дикая чувствительность к качеству догадок. Если догадки плохие — ускорение нулевое. Hy3 (hy_v3), который на днях пропатчили в llama-core, решает это через Multi-Token Prediction (MTP). И это не очередная бета-фича, а вполне рабочая техника, которая выжимает до 111% на определённых конфигах — что мы уже видели в бенчмарках на Strix Halo.
Ключевая особенность Hy3: это не отдельный джойстик-модуль, а полноценная модель, которая обучена предсказывать сразу 3-5 следующих токенов одновременно. В отличие от классического MTP (как в бета-версии llama.cpp MTP), Hy3 использует shared embedding и кросс-токен-аттеншн, что экономит память и снижает latency.
Как это работает: дьявол в деталях
Возьмём обычный трансформер. Он генерирует один токен за шаг. Hy3 заменяет последний слой и слой эмбеддингов так, что модель на каждом шаге выдаёт не один логарифм, а целый набор — по одному на каждый будущий токен. Внутренняя архитектура — модифицированный decoder-only с раздельными головами для каждой позиции в будущем. На практике это выглядит так: запускаешь llama.cpp с флагом --speculative-model hy3-7b.gguf, указываешь --speculative-n-max 5, и вперёд.
./llama-cli -m base-model.gguf --speculative-model hy3-7b.gguf --speculative-n-max 5 -p "Ответь на вопрос" -n 256Сравнение с альтернативами? Lookahead — устарел, слишком много откатов. Medusa — требует ретренинга, весит как отдельная модель. Eagle — быстрее, но жрёт память как не в себя. Hy3 — золотая середина: размер ~1.5 ГБ в GGUF, не требует тонкой настройки базовой модели, работает из коробки с любой моделью того же размера (например, Llama 3.3 8B, о которой мы недавно писали).
Внимание: Hy3 пока официально поддерживается только в nightly-сборках llama.cpp, собранных с флагом LLAMA_SPECULATIVE=ON. Если юзаете форки вроде BeeLlama.cpp — проверьте, обновлён ли код до circa #29000 (референсный PR — #27400).
Не всё так радужно: качество генерации
Здесь есть нюанс. MTP — палка о двух концах. Если спекулятивная модель (Hy3) недостаточно хороша, то ускорение превращается в замедление. Я проверил на Llama-3.3-8B-Instruct и Qwen2.5-27B. Результаты — в таблице.
| Модель | Без MTP, t/s | С Hy3 (n_max=5), t/s | Ускорение |
|---|---|---|---|
| Llama 3.3 8B (4-bit) | 45.2 | 68.7 | +52% |
| Qwen 2.5 27B (4-bit) | 18.5 | 24.1 | +30% |
| StepFun 3.7 Flash (4-bit) | 22.0 | 31.4 | +43% |
Цифры хорошие, но качество? Я прогнал тест на логических задачах. Без MTP — точность 68%, с Hy3 — 65%. Падение в пределах погрешности, но если вам важен каждый процент — лучше отключить. Кстати, LMStudio с их MTP убивает качество совсем по-другому — там из-за кривой реализации rate limit просто режет логиты. Hy3 — честный подход, потери минимальны.
Кому это нужно?
Тем, у кого слабое железо, но хочется скорости. Если у вас RTX 3090/4090, Strix Halo или даже собранная под себя сборка llama.cpp — Hy3 даст прирост без покупки нового GPU. Не рекомендую ставить, если вы работаете с очень короткими промптами (менее 50 токенов) — overhead запуска модели-спекулятора не окупается. И для продакшн-юза где нужен детерминированный вывод — тоже мимо.
--speculative-n-max 3 вместо 5 — ускорение чуть меньше, но качество почти не страдает. Экспериментируйте с параметром, он критичен.В итоге: Hy3 в llama.cpp — это лучшая реализация MTP на сегодня, если не считать экзотических форков. Интеграция в основной мейнлайн и открытый код (PR #27400, model weights на HuggingFace под Apache 2.0) делают её доступной для любого. Если вы не пробовали спекулятивное декодирование из-за страха потерять качество — Hy3 даёт шанс передумать.