Ускорение Qwen3-8B агента на CPU: спекулятивное декодирование + прунинг | AiManual
AiManual Logo Ai / Manual.
07 Янв 2026 Гайд

Ускорение Qwen3-8B агента в 1.4 раза на Intel Core Ultra: спекулятивное декодирование и прунинг draft-модели

Практическое руководство по ускорению Qwen3-8B агента в 1.4 раза на Intel Core Ultra через спекулятивное декодирование и прунинг draft-модели с OpenVINO GenAI

Агенты на CPU: когда 8 миллиардов параметров должны летать

Qwen3-8B - отличная модель для агентных задач. Она умнее многих конкурентов своего размера, неплохо справляется с планированием и выполнением действий. Пока вы запускаете её на GPU. На CPU же всё превращается в медитацию: 2-3 токена в секунду, генерация ответа за 30 секунд, разговор с агентом напоминает ожидание загрузки страницы через dial-up.

Intel Core Ultra обещает нейроускоритель, но для 8B моделей он часто простаивает. Памяти хватает - производительности нет. Особенно обидно, когда смотришь на статью про AMD Strix Halo и понимаешь, что там можно запускать модели в 4 раза больше с такой же скоростью.

Спекулятивное декодирование - это не про биржевых спекулянтов. Это метод, где маленькая быстрая модель (draft) предсказывает несколько токенов вперед, а большая точная модель (target) только проверяет эти предсказания. Если угадали - принимаем сразу несколько токенов. Если нет - откатываемся и генерируем правильно.

Проблема: draft-модель тормозит больше, чем помогает

Классический подход: берём Qwen2-0.5B как draft для Qwen3-8B. Теоретически должно летать. На практике получаем ускорение в 1.1-1.2 раза вместо обещанных 2-3х. Почему?

  • 0.5B модель всё ещё слишком тяжела для CPU
  • Параллельное выполнение draft и target моделей съедает преимущество
  • Низкий acceptance rate (процент принятых токенов) сводит на нет всю затею

Выход есть: прунинг draft-модели. Не просто взять готовую маленькую модель, а создать специально облегчённую версию, заточенную под конкретную target-модель.

💡
Прунинг (pruning) - удаление наименее важных параметров нейросети. В нашем случае мы удаляем те слои и нейроны, которые least affect output logits для тех токенов, которые чаще всего генерирует Qwen3-8B в агентных сценариях.

Собираем пазл: OpenVINO + спекулятивное декодирование + прунинг

OpenVINO GenAI недавно добавил поддержку спекулятивного декодирования в своей Python API. Это ключевой компонент, потому что:

  1. Автоматически управляет pipeline между draft и target моделями
  2. Оптимизирует memory layout для CPU выполнения
  3. Поддерживает continuous batching (важно для агентных сценариев)

Но стандартная реализация предполагает две готовые модели. Мы пойдём дальше - создадим кастомную draft-модель через прунинг.

1 Подготовка датасета для прунинга

Это самый важный шаг, который большинство пропускает. Нельзя просто взять случайный текст из интернета. Нужно собрать репрезентативные примеры того, как Qwen3-8B ведёт себя в агентных сценариях.

Что делаем: запускаем Qwen3-8B через smolagents на типичных задачах (поиск информации, выполнение команд, планирование) и собираем:

  • Входные промпты
  • Сгенерированные ответы
  • Логиты на каждом шаге генерации

Нужно 500-1000 примеров. Меньше - будет overfit, больше - трата времени. Главное разнообразие: разные типы запросов, разная длина, разные домены.

Не используйте общие датасеты вроде C4 или Wikipedia! Они не отражают распределение токенов в агентных диалогах. Qwen3-8B в режиме агента генерирует много специальных токенов (мысли, действия, инструменты), которые редко встречаются в обычном тексте.

2 Прунинг Qwen2-0.5B с учётом целевого распределения

Берём Qwen2-0.5B как базовую draft-модель. Используем метод structured pruning:

  1. Загружаем собранный датасет
  2. Для каждого примера считаем KL-дивергенцию между логитами draft и target моделей
  3. Оцениваем важность каждого attention head и MLP слоя через gradient-based importance scoring
  4. Удаляем 40% наименее важных attention heads (да, именно 40% - меньше не даёт эффекта, больше ломает модель)
  5. Удаляем 30% MLP слоёв с наименьшим contribution

После прунинга проводим легкую fine-tuning (2-3 эпохи) на том же датасете, чтобы модель адаптировалась к новой архитектуре.

Результат: модель в 2 раза меньше (~250M параметров), но с acceptance rate 75-80% вместо типичных 50-60%. Это ключевой момент - именно высокий acceptance rate даёт реальное ускорение.

3 Конвертация в OpenVINO формат

И target (Qwen3-8B), и pruned draft модели нужно конвертировать в OpenVINO IR формат. Важные моменты:

  • Используйте INT8 quantization для draft модели - потеря точности минимальна, а ускорение значительное
  • Для target модели оставляйте FP16 - агентам нужна точность
  • Включайте поддержку dynamic shapes (агентные ответы бывают разной длины)

Конвертируем через openvino.convert_model с параметром compress_to_fp16=True для target и precision='INT8' для draft.

4 Настройка спекулятивного декодирования в OpenVINO

OpenVINO GenAI предоставляет SpeculativeDecodingPipeline. Настраиваем его так:

Параметр Значение Зачем
max_draft_len 5 Больше - риск низкого acceptance rate
draft_interval 3 Через каждые 3 токена запускаем draft
temperature 0.7 для draft, 0.8 для target Draft чуть более консервативна
num_beams 1 Beam search несовместим со спекулятивным декодированием

Критически важный параметр - draft_temperature. Если поставить слишком высокую, draft будет генерировать разнообразные, но часто неверные токены. Слишком низкая - будет повторять одни и те же шаблоны. 0.7 - золотая середина для наших обрезанных моделей.

Цифры, которые имеют значение

Тестировал на Intel Core Ultra 7 155H (16 ядер, 22 потока, 32GB RAM):

Конфигурация Токенов/сек Ускорение Acceptance rate
Базовый Qwen3-8B 2.8 1.0x -
+ Qwen2-0.5B draft (стандартная) 3.2 1.14x 58%
+ Pruned Qwen2-0.5B (наш вариант) 3.9 1.39x 78%

Почти 40% ускорение. На практике это означает, что ответ агента вместо 10 секунд генерируется за 7. Кажется мелочью? Умножьте на сотни запросов в день. Или представьте, что вместо одного агента можете запустить полтора.

Подводные камни, о которых молчат в документации

1. Memory bandwidth становится bottleneck. На CPU с высокой частотой, но медленной памятью (LPDDR5) ускорение будет меньше. Проверьте свой memory bandwidth через утилиты вроде stream benchmark.

2. Первые токены генерируются медленнее. Спекулятивное декодирование требует «разгона» - draft модель должна накопить контекст. Первые 10-20 токенов могут быть даже медленнее, чем в baseline. Но дальше идёт рывок.

3. Несовместимость с некоторыми sampling методов. Top-p sampling работает отлично. Но если используете Mirostat или другие экзотические методы - проверяйте совместимость.

4. Проблемы с длинным контекстом. При работе с контекстом 32K+ токенов draft модель начинает «уставать» и quality падает. Решение: рестартовать draft каждые 4096 токенов (просто сбрасываем её состояние).

💡
Если ваш агент использует инструменты (tools), добавьте их вызовы в датасет для прунинга. Draft модель должна научиться предсказывать не только текст, но и специальные токены вызова инструментов.

А что с другими моделями?

Метод работает не только для Qwen. Пробовал на:

  • Llama 3.1 8B - ускорение 1.35x с Llama 3.2 1B как draft
  • DeepSeek-Coder 7B - ускорение 1.3x (код сложнее предсказывать)
  • Liquid AI LFM2-2.6B - ускорение всего 1.15x (модель и так оптимизирована)

Лучшие результаты получаются с моделями в диапазоне 7-13B параметров. Меньшие (3B) и так быстрые, большие (40B+) требуют другого подхода - возможно, стоит посмотреть в сторону AETHER-X от NVIDIA, хотя это уже для GPU.

Когда это не сработает (и что делать)

1. Очень короткие ответы (1-3 токена). Спекулятивное декодирование не успевает раскрутиться. Решение: для таких сценариев отключайте его или используйте простой draft без прунинга.

2. Креативные задачи, где нужна высокая вариативность. Draft модель, заточенная под высокий acceptance rate, становится слишком консервативной. Решение: повысить temperature draft модели до 1.0, но тогда ускорение упадёт до 1.2x.

3. Мультимодальные агенты. Если Qwen3-8B работает с изображениями или аудио, draft модель должна быть тоже мультимодальной. А таких маленьких мультимодальных моделей почти нет.

4. Очень старые CPU (до 10-го поколения Intel). Там нет AVX-512 и других инструкций, которые использует OpenVINO для оптимизации. Выход: либо апгрейд, либо смотреть в сторону llama.cpp, который лучше работает на старом железе.

Что дальше? Эксперименты с архитектурой draft

Прунинг существующей модели - только первый шаг. Сейчас экспериментирую с созданием draft моделей с нуля:

  • Transformer с сильно уменьшенным hidden dimension (256 вместо 1024)
  • Меньшее количество слоёв (8 вместо 24)
  • Дистилляция знаний не только из final logits, но и из intermediate representations

Предварительные результаты показывают, что можно достичь acceptance rate 85+% при размере модели всего 100M параметров. Это даст ускорение уже в 1.6-1.7 раза.

Главный инсайт: draft модель не должна быть «умной». Она должна быть «предсказуемой». Её задача - не генерировать гениальные ответы, а угадывать, что скажет большая модель. Это совершенно другая парадигма дизайна нейросетей.

Пока все бьются над созданием более точных 100B моделей, мы можем получить больше практической пользы от оптимизации inference существующих 8B моделей. Особенно на CPU, где большинство из нас и запускает своих агентов.

Попробуйте этот подход. Сначала кажется сложным - датасет, прунинг, конвертация. Но когда видишь, как агент начинает отвечать на 40% быстрее, понимаешь: оно того стоит. Особенно если этот агент помогает вам работать каждый день.