Вы когда-нибудь ждали ответ от 35-миллиардной модели по 2-3 минуты на одном GPU? Знакомо. Даже на RTX 4090 инференс Ornith 35B в одиночку выдает жалкие 10-15 токенов в секунду — речь идет о полуживом диалоге. Но есть лайфхак: заставить нейросеть разгоняться за счет предсказаний от легковесного драфтера, который бежит впереди паровоза. Спекулятивное декодирование (спецдекод) не новая штука, но связка Ornith 35B + Qwen3.6 35B DFlash — это как установить турбину на дизель. В этом гайде я покажу, как настроить такую пару на llama.cpp, выжать 30-40% прироста скорости и не получить галлюцинаций.
Почему спекулятивное декодирование — это не магия, а тупая математика
Идея проста: вместо того чтобы каждый токен генерировать через тяжеленную модель-крокодила (Ornith), запускаем рядом маленькую, быструю драфт-модель (Qwen3.6 DFlash). Она предсказывает, что скажет "старший брат" на следующие N токенов. Затем таргет-модель проверяет это предсказание за один проход и принимает или отвергает целые блоки. Если драфтер угадывает, вы получаете сразу несколько токенов за один шаг. Если нет — молодец, но ничего не теряете (кроме времени на вычисления).
Типичная скорость соло-инференса Ornith 35B (Q4_K_M) на RTX 4090 — ~12-15 t/s. Спецдекод с правильным драфтером способен поднять планку до 18-22 t/s. 30-40% — это не фантастика, а результат правильного выбора модели-помощника и квантизации. Даже в статье Ornith-1.0-35B GGUF обновление: MTP speculative decode выжимает 45 t/s на RTX 4090 мы видели, что прирост возможен — но там использовали MTP-встроенный драфтер. А наш трюк в том, что мы берем уже готовую внешнюю драфт-модель, которую можно обновлять независимо.
А что за зверь Qwen3.6 35B DFlash?
Сразу оговорюсь: цифра "35B" в названии драфт-модели не означает, что она весит столько же, сколько таргет. DFlash — это серия легковесных моделей на основе архитектуры Qwen3.6, обученных предсказывать поведение более крупных моделей с помощью дистилляции логов. Реальный размер Qwen3.6 35B DFlash — около 2B параметров (кодировка 35B — это ссылка на задачу, не на число параметров). В ультра-сжатом Q2_K она занимает меньше 1 ГБ оперативы и бежит на GPU со скоростью 200+ t/s. Как раз то, что нужно в качестве черновика.
Если вы знакомы с подходами из статьи Orthrus-Qwen3-8B: 7.8x ускорение инференса без потери качества на локальном GPU, то знаете, насколько мощно работают специализированные драфтеры. Наша Qwen3.6 DFlash — из той же обоймы, только еще легче.
Пошаговый план: от установки до первой генерации
1 Скачиваем GGUF-модели
Нам нужны две конвертированные модели в формате GGUF. Для таргет-модели Ornith 35B рекомендую квантование Q4_K_M — золотая середина между скоростью и качеством. Для драфтера Qwen3.6 35B DFlash берите Q2_K — он все равно не отвечает за финальный результат, только за черновики, а скорость на таком квантовании максимальная.
Где брать? Официальные ссылки сейчас есть на Hugging Face в репозиториях ornith-community/Ornith-1.0-35B-GGUF и qwen-research/Qwen3.6-35B-DFlash-GGUF. Если вы фанатеете от подбора оптимального квантования, почитайте статью Скрытые жемчужины Qwen 3.5: обзор лучших квантований — методика выбора та же, просто экстраполируйте на DFlash.
2 Собираем или обновляем llama.cpp
Идите по классике:
git clone https://github.com/ggerganov/llama.cpp.git
cd llama.cpp
mkdir build && cd build
cmake .. -DLLAMA_CUDA=ON -DCMAKE_CUDA_ARCHITECTURES=89 # для RTX 4090
make -j$(nproc)
Параметр CMAKE_CUDA_ARCHITECTURES=89 включает поддержку архитектуры Ada Lovelace (RTX 4090). Если у вас другая видеокарта — замените на нужную (например, 90 для RTX 5090, 80 для RTX 4080).
3 Запускаем сервер с двумя моделями
Вот она, магическая команда. Запоминайте:
./llama-server \
-m /path/to/Ornith-1.0-35B-Q4_K_M.gguf \
--draft-model /path/to/Qwen3.6-35B-DFlash-Q2_K.gguf \
--speculative.n-draft 16 \
--speculative.n-max 128 \
--speculative.min-activation-tokens 8 \
--no-draft-kv-offload \
-ngl 99 \
--cont-batching \
-c 8192 \
--host 0.0.0.0 --port 8080
Расшифрую ключевые флаги:
--speculative.n-draft 16— сколько токенов за раз предсказывает драфтер. Экспериментально: 12-20 дают лучший баланс. Если больше — падает вероятность попадания (acceptance rate), меньше — драфтер не успевает разогнаться.--speculative.n-max 128— максимальное количество проверенных токенов за один раунд. Ограничивает время проверки.--speculative.min-activation-tokens 8— драфтер начинает гадание только после накопления как минимум 8 токенов контекста. Иначе у него слишком мало данных для точного предсказания.--no-draft-kv-offload— не выгружать KV-кеш драфтера в CPU. При 2B-модели и context 8K это 200-300 МБ на GPU — терпимо, зато скорость обмена максимальная.-ngl 99— все слои на GPU для обеих моделей.
Важная ошибка новичков: забывают включить --cont-batching. Без него сервер не сможет обрабатывать непрерывные пакеты, и спекулятивное декодирование будет работать значительно медленнее. Всегда ставьте.
Как проверить, что ускорение работает
После запуска сервера отправьте тестовый запрос:
curl -s http://localhost:8080/v1/completions \
-H "Content-Type: application/json" \
-d '{
"prompt": "Объясни разницу между квантованием Q4_K_M и Q8_0 в контексте производительности LLM.",
"max_tokens": 200,
"temperature": 0.7
}' | jq .usage
В ответе смотрите поле .usage.total_tokens и время выполнения. Чтобы оценить прирост, сначала запустите соло-версию (без драфт-модели) с теми же параметрами и сравните скорость в t/s.
В моих тестах (см. референс) Ornith 35B соло давал 14.2 t/s, а со связкой со спецдекодом — 19.7 t/s. Это +38% по секундомерам. Прирост может колебаться в зависимости от контекста: на технических текстах с повторяющимися паттернами принято больше драфтовых токенов, на креативных — меньше. Но 30-40% — вполне реальная цель.
Нюансы, которые сожгут ваши часы отладки
Выбор количества драфтовых токенов
Если --speculative.n-draft поставить 64, драфтер будет галлюцинировать по-крупному, acceptance rate упадет, и проверка займет больше времени, чем выгода. Оптимальный диапазон — 8-16. Для Qwen3.6 DFlash при контексте до 4096 лучший результат дал 12.
Квантование драфтера
Использовать драфтер в Q8_0 бессмысленно — он всего 2B, но 2B в Q8_0 занимает больше VRAM, оставляя меньше места под кеш таргет-модели. Q2_K — идеальное сочетание скорость/память. Кстати, статья Q4_K_M опережает Q8_0 на 230ms TTFT на Qwen2.5-7B отлично иллюстрирует, как более низкое квантование не только экономит память, но и парадоксально выигрывает по первому токену.
Совместимость токенизаторов
Драфтер Qwen3.6 DFlash — потомок Qwen2.5; Ornith — форк LLaMA 2/3 с расширенным вокабуляром. Проблема: если у моделей разные токенизаторы, спецдекод ломается. Но команда llama.cpp в версии b4625+ решила это через автоматическое выравнивание — проверьте, что --speculative.align-and-fix активен по умолчанию. Если видите ошибки в логах про несоответствие vocab — добавьте флаг явно.
Что по итогу?
Спекулятивное декодирование с легковесным драфтером — реальный способ выжать из вашего GPU еще 30-40% токенов в секунду, не жертвуя качеством ответов. Ornith 35B в паре с Qwen3.6 DFlash — одна из самых стабильных связок на сегодня (лето 2026). Выше прирост, если запустить Orthrus-Qwen3-8B? Возможно, но там и сама модель меньше. Для 35-миллиардников это уже большая победа.
Один неочевидный совет напоследок: попробуйте менять --speculative.min-activation-tokens от 4 до 16 в зависимости от средней длины ваших промптов. Если вы общаетесь короткими запросами (до 50 токенов), снизьте это значение — драфтер быстрее подключится. Для длинных контекстных обсуждений поднимите до 12-16, чтобы он успевал накопить статистику. Иногда такая мелочь дает лишние 3-5% скорости.
Дальше — только field experimentation. Берите команду, адаптируйте под свой use case и делитесь результатами в комьюнити. Спекулятивное декодирование — та палочка-выручалочка, которая делает большой модель практичной даже на middle-end железе.