Ты когда-нибудь ждал 45 секунд, пока нейронка придумает шутку?
Знакомо: крутая модель вроде Qwen3-8B выдает качественный текст, но на RTX 3090 вы еле выжимаете 20 токенов в секунду. Для интерактивного чата — смерть. Можно поставить квантование IQ2 и получить 100 токен/с, но с потерей точности 10-15%. А если я скажу, что есть метод, который ускоряет оригинальную FP16 модель в 7.8 раз БЕЗ единого изменения в выходном распределении?
Orthrus vs. классический speculative decoding
Обычный speculative decoding требует двух отдельных моделей: маленький драфтер (например, 7B) и большой оракул (70B). Orthrus делает хитрее — он берет одну модель (8B) и добавляет к ней легкую голову-драфтер (всего 2-3 слоя), оставляя основной backbone замороженным. Голова учится предсказывать несколько токенов вперед, имитируя поведение того же backbone. Затем на каждом шаге:
- Драфтер генерирует k токенов (обычно 7).
- Backbone верифицирует всю последовательность за один forward pass.
- Токены до первого несовпадения принимаются, остальные отбрасываются.
Результат: acceptance rate > 85% для Qwen3-8B на большинстве задач. А значит — ускорение в 7.8x. И распределение идентично оригиналу, так как каждый токен подтвержден самой моделью.
Как НЕ надо делать
Самая частая ошибка — попытка дообучить всю модель. Как только вы разморозите backbone, распределение изменится. Orthrus требует строгой заморозки всех параметров Qwen3-8B. Драфтер учится на выходах оригинальной модели, а не на датасете с человеческими ответами.
Warning: Если обучать драфтер на том же датасете, что и исходную модель, acceptance rate упадет до 40%. Нужно специально готовить пары (промпт → выход модели).
Пошаговый гайд: Orthrus для Qwen3-8B
1 Установка и загрузка модели
pip install torch transformers datasets accelerate
pip install git+https://github.com/example/orthrus.gitЗагружаем Qwen3-8B в полной точности (FP16). Если VRAM не хватает, можно использовать bitsandbytes 4-bit, но тогда ускорение будет ниже (около 4x).
from transformers import AutoModelForCausalLM, AutoTokenizer
model_name = "Qwen/Qwen3-8B"
model = AutoModelForCausalLM.from_pretrained(model_name, torch_dtype=torch.float16, device_map="auto")
tokenizer = AutoTokenizer.from_pretrained(model_name)2 Заморозка backbone и создание драфтера
Заморозка всех параметров модели. Добавляем легкую голову — TransformerDecoderLayer с 4-6 слоями и уменьшенной размерностью hidden (1024 вместо 4096). Orthrus использует cross-attention на последний скрытый слой backbone.
import torch.nn as nn
for param in model.parameters():
param.requires_grad = False
class DraftHead(nn.Module):
def __init__(self, hidden_size=1024, num_layers=2):
super().__init__()
self.layers = nn.ModuleList([
nn.TransformerDecoderLayer(d_model=hidden_size, nhead=8)
for _ in range(num_layers)
])
self.output = nn.Linear(hidden_size, model.config.vocab_size)
draft = DraftHead().to('cuda')3 Подготовка датасета для обучения драфтера
Берем 10-20 тысяч примеров из разнообразных задач (chat, code, reasoning). Для каждого промпта генерируем выход оригинальной моделью (например, 256 токенов). Обучаем драфтер предсказывать следующий токен на основе скрытых состояний backbone.
# Псевдокод — предполагаем, что у вас есть dataset с промптами
for batch in dataloader:
with torch.no_grad():
outputs = model(input_ids=batch['input'], output_hidden_states=True)
hidden = outputs.hidden_states[-1] # последний слой
# Обучаем draft head предсказывать target (сдвинутые на 1 токены)
logits = draft(hidden)
loss = CrossEntropyLoss(logits, batch['labels'])4 Инференс с верификацией
На каждом шаге драфтер генерирует 7 токенов, затем backbone принимает решение. Orthrus реализует это в едином цикле.
from orthrus import OrthrusEngine
engine = OrthrusEngine(model, draft, tokenizer, k=7)
output = engine.generate("Расскажи анекдот про DevOps")
print(output)Что на выходе?
| Метод | Скорость (токен/с) на RTX 3090 | Точность (perplexity) |
|---|---|---|
| Qwen3-8B FP16 (baseline) | 22 | 10.5 |
| IQ2 квантование | 98 | 14.3 (ухудшение) |
| Orthrus-Qwen3-8B | 172 | 10.5 (идентично) |
Разница очевидна: Orthrus дает максимум скорости без потери качества. Более того, вы можете комбинировать Orthrus с квантованием backbone (например, AWQ) — тогда ускорение достигнет 12-15x при минимальном дрейфе распределения.
Хотите еще больше? Посмотрите наш разбор Qwen3-32B INT4: 12-кратный прирост емкости с потерей 1.8% или статью про IQ2: 100 токен/с на Qwen3-30B-A3B. Они дополняют Orthrus.
Подводные камни и ошибки
- Длина драфта: 7 токенов — оптимум для Qwen3-8B. Если поставить 12, acceptance rate падает, и ускорение снижается до 4x.
- Размер головы: 2 слоя достаточно. Больше — только замедляет драфтера без выигрыша.
- Обучение на одном домене: если драфтер учить только на коде, он будет плохо генерировать на естественном языке. Берите смешанный датасет.
- Не путать с Medusa: Medusa — похожая техника, но там головы обучаются на сырых логах, а не на скрытых состояниях. Orthrus использует cross-attention, что стабильнее.
Кстати, если вы столкнулись с проблемой, когда модель повторяет бессмыслицу — прочитайте наш гайд Исправление ошибки Qwen 3.5: бессмыслица после 2-3 ответов. Там есть решения, которые работают и для Orthrus.
А что насчет Qwen3.5 и Orthrus?
Orthrus-голову можно дообучить и для Qwen3.5-27B. Ускорение будет меньше (около 4x из-за большего размера), но все равно впечатляюще. Лучшие практики для Qwen3.5-27B описаны в этом обзоре сообщества LocalLLaMA. А если у вас 128 ГБ GPU — попробуйте запустить Qwen3.5-397B с квантованием smol-IQ2_XS и поверх него Orthrus — получите 20+ токен/с на гиганте!
Вместо выводов — совет
Orthrus — это не серебряная пуля. Если у вас мало VRAM, сначала заквантуйте модель до 4 бит, а потом добавляйте драфтер. И никогда не верьте бенчмаркам, где acceptance rate > 95% — это, скорее всего, переобучение на тестовых данных. В реальности 85% — уже отличный результат.
Попробуйте сами: скачайте код, обучите голову за час на Colab и получите 170 токен/с на домашнем железе. А когда почувствуете, что это слишком просто — загляните в статью про TurboQuant TQ3_1S: 3.5 бита спасают 16 ГБ. Там тоже нет магии — только инженерия.