Ускорение Qwen в 2-3 раза: спекулятивное декодирование с sglang и Weaver | AiManual
AiManual Logo Ai / Manual.
11 Июл 2026 Инструмент

Как ускорить Qwen с помощью спекулятивного декодинга: форк sglang и модель Weaver

Разбираем форк sglang и легковесную модель Weaver для спекулятивного декодирования Qwen. Как это работает, примеры команд и кому реально нужно. Инференс ускоряе

Тормозят? Значит, не умеют ускоряться

Если вы когда-нибудь ждали ответа от Qwen 3.5 27B или 3.6 35B больше минуты, зная, что где-то там, на облачных картах, такой же токен вылетает за миллисекунды - вы знакомы с когнитивным диссонансом. Модель локально может быть уместнее и дешевле, но скорость режет глаза. Особенно когда у вас не A100, а одна RTX 3090 или, не дай бог, Mac с объединенной памятью.

Спекулятивное декодирование - штука, которая звучит как магия, но на деле простая до безобразия: пусть маленькая и тупая модель накидает черновик, а большая и умная его только проверит. Если угадали - сэкономили кучу шагов, если нет - не страшно, откатились. Форк sglang и модель Weaver превращают эту идею в рабочий инструмент для Qwen. И нет, это не хайп, это работает.

💡
В тестах на Qwen 3.5-35B-A3B (исправленная версия) ускорение в режиме спекулятивного декодирования с Weaver достигает 2.3x при batch size=1. На больших моделях типа Qwen 122B - ещё выше, до 3x, если умеючи подобрать draft model.

Почему sglang, а не vLLM или llama.cpp

На рынке локальных движков три монстра: vLLM, llama.cpp и sglang. У каждого свои тараканы. llama.cpp - бог совместимости, но спекулятивное декодирование там появилось поздно и работает через pydantic модели, а не кастомные черновики. vLLM - чемпион по throughput, но для спекулятивного декодирования требует отдельного draft engine, который не все умеют конфигурировать.

Форк sglang, о котором речь, сделал простую вещь: вшил поддержку Weaver как родной draft model. Никаких костылей, никаких дополнительных докер-образов. Поставил, запустил с флагом --speculative --draft-model weaver - и полетело. Плюс sglang из коробки дружит с Qwen-форками (включая тот самый Qwen Code с убитой телеметрией) и не вылетает с "exceeds context size" на длинных диалогах.

Движок Спекулятивное декодирование Draft model Weaver Поддержка Qwen 7B-122B
llama.cpp Через speculative декодер (драфт из базовой модели) Нужно конвертировать в GGUF Только Q4-квантованные
vLLM Через DraftModelPlugin Требует кастомного кодера Все размеры
sglang (форк) Из коробки, флаг --speculative Поддерживается нативно Все стандартные и кастомные

Модель Weaver - тот самый черновик

Weaver - маленькая трансформерная модель (~300M параметров), специально обученная предсказывать варианты следующего токена, который может предложить большая модель. Не путать с грамматиками и правилами - это чистая нейронка, обученная на парах (черновик от Weaver, проверка от Qwen).

Идея проста: Weaver работает в 10-20 раз быстрее Qwen 3.5 27B, поэтому можно сгенерировать 5-6 кандидатов токенов за один проход, а Qwen их проверит и примет те, которые совпадают с её собственным распределением. Если совпало 4 из 5 - получили ускорение в 2.5-3 токена на шаг. Если совпал только один - ну хоть не потеряли.

Важный нюанс: Weaver не идеальна для всех задач. Если ваша задача сильно заточена под специфичный стиль (например, секретный промпт для Qwen 3.5-27B), Weaver может реже угадывать. Для кода она справляется отлично, для креатива - чуть хуже. Но всегда можно откатиться к обычному декодированию без штрафа.

Как это выглядит на практике (и где подводные камни)

1 Установка форка sglang

Форк доступен на GitHub под именем sglang-weaver. Ставится через pip, но с оговоркой: рекомендуемая версия Python - 3.11, CUDA 12.4 и выше. На Mac тоже работает, но через MPS - там прирост меньше из-за ограничений бэкенда.

pip install sglang-weaver[all]

После установки загружаем модель Qwen (например, через HuggingFace Hub) и модель Weaver:

python -m sglang.weaver.download --model Qwen/Qwen3.5-35B-A3B --draft weaver-300m

2 Запуск сервера

python -m sglang.launch_server \
  --model-path ./Qwen3.5-35B-A3B \
  --speculative \
  --draft-model-path ./weaver-300m \
  --num-speculative-tokens 5 \
  --host 0.0.0.0 --port 8000

Главный флаг --speculative включает спекулятивное декодирование, --num-speculative-tokens отвечает за длину черновика. Оптимальное значение - 5-7, больше - рискуете лишними откатами. Если заметили, что модель стала чаще перепроверять - снижайте до 3.

3 Проверка через API

import requests
response = requests.post("http://localhost:8000/generate", json={
    "prompt": "Расскажи, как ускорить Qwen локально",
    "max_tokens": 200
})
print(response.json()["text"])

В логах сервера будут строки вида Accepted: 3/5 tokens, speed: 45 tok/s. Если accept rate выше 50% - всё летает. Если ниже 30% - Weaver не справляется, и стоит либо поменять draft модель, либо отключить спекулятивное декодирование (--no-speculative).

Где это реально жжет, а где - пустая трата времени

Спекулятивное декодирование даёт профит только когда batch size равен 1 (режим онлайн, один пользователь). В батч-процессинге уже не до drafts - там всё упирается в считалки GPU. Так что если вы гоняете через Qwen тысячи запросов в офлайне, лучше подумать про застройку на нескольких картах.

Ещё один момент: на маленьких моделях (Qwen 3.5 7B, Qwen 3.0 0.6B) ускорение почти нулевое - черновик Weaver замедляет, а не ускоряет, потому что целевая модель уже летает. Но на моделях от 27B и выше - разница очевидная. Особенно если у вас карта с маленькой памятью и вы используете квантование q4_k_m (читайте про исправление ошибок бессмысленного вывода - там тоже может помочь настройка параметров декодирования).

Для Qwen 3.6 35B есть специфическая проблема - зацикливание в режиме спекулятивного декодирования. Решается переключением sampling temperature на 0.8-1.0 и включением топ-p. Подробно описано в статье "Как устранить зацикливание в Qwen3.6 35B и Ornith V1".

Кому этот инструмент реально нужен

  • Разработчикам голосовых ассистентов - если вы использовали Qwen3-0.6B для замены облака - не подходит, там модель слишком мала. Но для ассистента на Qwen 3.5-27B с ответом в реальном времени - самое то.
  • Исследователям и R&D - когда нужно быстро прогнать 1000 промптов для анализа, а GPU всего одна.
  • Фаззерам кода - Qwen 122B на 4x RTX 6000 Pro - монстр, но спекулятивное декодирование немного снижает latency; если не критично, можно оставить.
  • Маководам - на Mac с M2 Ultra ускорение достигает 1.7x. Не прорыв, но бесплатно. Важно: на Mac лучше сначала исправить бесконечное мышление, и только потом включать speculative.

Честно? Главная проблема всего этого - не скорость, а головная боль с подбором конфигурации. Если у вас шаблонный рабочий процесс (чат, суммаризация, перевод) - скорее всего, Weaver окупается. Если вы пишете промпты для глубокого мышления (как в статье про исправленный Qwen3.5-35B-A3B) - Weaver будет мешать, так как ей сложно угадывать глубокие размышления. Придётся подбирать температуру и количество спекулятивных токенов отдельно.

Мой совет: попробуйте с 5 токенами и standard sampling. Не понравилось - откатывайтесь до обычного инференса. Никто не заставляет вас ускорять то, что и так сносно работает. Но если уж решили выжать из своего железа максимум, то форк sglang с Weaver - один из самых адекватных способов. Без танцев с бубном, без переписывания кода. Просто pip install, два флага, и ваш Qwen начинает дышать быстрее.

Подписаться на канал