Тормозят? Значит, не умеют ускоряться
Если вы когда-нибудь ждали ответа от Qwen 3.5 27B или 3.6 35B больше минуты, зная, что где-то там, на облачных картах, такой же токен вылетает за миллисекунды - вы знакомы с когнитивным диссонансом. Модель локально может быть уместнее и дешевле, но скорость режет глаза. Особенно когда у вас не A100, а одна RTX 3090 или, не дай бог, Mac с объединенной памятью.
Спекулятивное декодирование - штука, которая звучит как магия, но на деле простая до безобразия: пусть маленькая и тупая модель накидает черновик, а большая и умная его только проверит. Если угадали - сэкономили кучу шагов, если нет - не страшно, откатились. Форк sglang и модель Weaver превращают эту идею в рабочий инструмент для Qwen. И нет, это не хайп, это работает.
Почему 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 начинает дышать быстрее.