Зачем вам 27B на одной 3090?
Qwen 3.5 27B — одна из лучших моделей для локальных агентов. Но в FP16 она весит ~54 GB, а ваша RTX 3090 — всего 24. Казалось бы, миссия невыполнима. Однако есть два пути: AutoRound (квантование с калибровкой) и llama.cpp (классические GGUF). Оба позволяют ужать модель до 15-18 GB, но с разными последствиями. Я перепробовал оба на двух 3090 и на одной, и вот что реально работает.
Важно: Все тесты проводились на Qwen 3.5 27B (актуальная версия на апрель 2026) с драйверами 560.xx и CUDA 12.8. Датасеты для калибровки — подборка agent-specific диалогов.
Проблема: 24 GB — это приговор?
Полная модель не влезает. Даже с квантованием 8 бит (AWQ или GPTQ) — около 27 GB, что всё равно не помещается в одну карту. На двух 3090 — да, но статья про одну карту, ибо многие хотят оставить вторую для других задач или у них всего одна. Решение — 4-битное квантование. Здесь и начинается война: AutoRound vs llama.cpp.
Решение 1: AutoRound — алхимия точности
AutoRound (Intel, 2024-2025) — это метод квантования, который подгоняет веса под калибровочный датасет, минимизируя потерю перплексии. На Qwen 27B даёт почти родное качество при 4 битах. Но есть нюанс: для инференса нужен либо auto-round pipeline (который жрёт память), либо экспорт в формат GPTQ. Я пробовал оба.
1Квантование через AutoRound
git clone https://github.com/intel/auto-round.git
cd auto-round
pip install -v .
auto-round --model Qwen/Qwen3.5-27B --bits 4 --group_size 128 --dataset agent_mix --output ./qwen27b_4bitВнимание: Калибровочный датасет должен быть репрезентативным для ваших задач. Если планируете tool calling — включите примеры с функциями. Иначе модель начнёт галлюцинировать при вызове инструментов. Подробнее про настройку tool calling — в нашем гайде.
Результат: модель занимает ~15 GB на диске и при загрузке — 12-14 GB VRAM. Но беда в том, что родной инференс AutoRound использует много памяти из-за динамических вычислений. На одной 3090 контекст 4K — уже почти упёрся в лимит. Выход — экспорт в GPTQ и использование auto_gptq.
from auto_round import export_to_gptq
export_to_gptq("path_to_quantized", "qwen27b_4bit_gptq")
# затем загружаем через transformers
from transformers import AutoModelForCausalLM, AutoTokenizer
model = AutoModelForCausalLM.from_pretrained("qwen27b_4bit_gptq", device_map="auto")Скорость: ~45-50 tok/s при контексте 2K, но при увеличении до 8K падает до 25-30. Speculative decoding не особо помогает, так как драфт-модель тоже ест память. Итог: качество отличное, но производительность средняя.
Решение 2: llama.cpp — проверенный боец
llama.cpp с GGUF — стандарт индустрии. Для Qwen 3.5 27B лучше всего взять квантование Q4_K_M — баланс скорости и качества. Вес ~16 GB, влезает в 24 GB с запасом для контекста 8K+.
2Установка и запуск
# Собираем с поддержкой CUDA
git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp
cmake -B build -DGGML_CUDA=ON
cmake --build build --config Release -j
# Скачиваем готовый GGUF (например, от TheBloke)
wget https://huggingface.co/TheBloke/Qwen3.5-27B-GGUF/resolve/main/qwen3.5-27b-q4_k_m.gguf
# Запускаем сервер
./build/bin/server -m qwen3.5-27b-q4_k_m.gguf -ngl 40 --port 8080Настройка -ngl (число слоёв на GPU) зависит от вашей задачи: 40 слоёв (из 80) на GPU, остальные на CPU — хороший старт. Если нужно больше контекста — уменьшайте до 30-35.
Скорость: ~55-65 tok/s на контексте 4K. А теперь главный козырь — speculative decoding.
Speculative decoding: 100+ tok/s
Идея: маленькая модель (например, Qwen 2.5 7B Q4_K_M) генерирует черновики, большая проверяет. На 3090 это работает отлично, если драфт-модель тоже на GPU.
./build/bin/server -m qwen3.5-27b-q4_k_m.gguf \
--draft-model qwen2.5-7b-q4_k_m.gguf \
--draft-ngl 40 \
-ngl 40 \
--port 8080Но есть подводные камни. Во-первых, не все модели-черновики совместимы. Лучше брать ту же серию Qwen. Во-вторых, при tool calling speculative decoding может лагать — драфт-модель генерирует неправильные вызовы, большая их отклоняет, теряется ускорение. Решение — использовать --draft-min-tokens и отключать speculative для первых токенов. Как настроить — в нашей статье про TPS.
Сравнение: AutoRound vs llama.cpp
| Параметр | AutoRound (GPTQ) | llama.cpp (Q4_K_M) |
|---|---|---|
| Качество (perplexity) | Лучше (~0.05 loss) | Отлично (~0.1 loss) |
| Скорость (без spec.) | 25-50 tok/s | 55-65 tok/s |
| Скорость (spec. dec.) | 30-60 tok/s | 90-110 tok/s |
| Макс. контекст (24GB) | 4-6K | 8-12K |
| Tool calling стабильность | Средняя (зависит от калибровки) | Высокая (без доп. действий) |
| Сложность настройки | Высокая (нужны свои датасеты, экспорт) | Низкая (скачал и запустил) |
Наш вердикт: Для локального агента на одной 3090 — llama.cpp+GGUF+speculative decoding. AutoRound имеет смысл, если вам критично каждое 0.05 perplexity (например, для научных расчетов), но для агентов с tool calling важнее скорость и стабильность.
Подводные камни и ошибки
1. «Бессмыслица после 2-3 ответов»
Классическая проблема: модель начинает галлюцинировать, повторять одно и то же. Обычно из-за неправильного chat template или переполнения контекста. В llama.cpp убедитесь, что используете шаблон --chat-template qwen. Подробный разбор — в этой статье.
2. «Available context size» ошибка
При запуске с большим контекстом (16K) llama.cpp может выдать ошибку. Ограничение — физическая память. На одной 3090 с Q4_K_M максимальный контекст — 12K без speculative, 8K с ним. Если нужно больше — используйте --ctx-size 8192 и --rope-scaling. Диагностика — в гайде для 35B, но принципы те же.
3. Tool calling не работает
Qwen 3.5 требует точного форматирования функций. Если ваша GGUF-сборка не поддерживает грамматики, инструменты будут игнорироваться. Лучший способ — использовать llama-server с эндпоинтом /chat/completions и передавать функции в теле запроса. Пример конфигурации агента — в статье про Tool Calling.
4. Speculative decoding не ускоряет
Если драфт-модель слишком маленькая (например, 1B), она будет часто ошибаться, и ускорения не будет. Оптимально — 7B из той же семьи. Также проверьте, что обе модели загружены на GPU (флаг -ngl).
Multi-agent сценарии: одна 3090 — не приговор
Многие думают, что для роя агентов нужны десятки гигабайт. На одной 3090 можно запустить 3-4 агента на базе Qwen 27B, если использовать batch inference в llama.cpp. Флаг --parallel 4 позволяет обрабатывать несколько запросов одновременно, память делится. Скорость упадёт, но для асинхронных задач (например, анализ документов) это приемлемо. Подробнее — в гайде по рою агентов.
Если же вам нужен один мощный агент с контекстом 32K — увы, 3090 не тянет. Придётся либо докупить вторую, либо использовать облачные инстансы (но это уже не локально).
Итоговые рекомендации
Берите llama.cpp+GGUF+speculative decoding. Почему? Простота, скорость, стабильность. AutoRound — для тех, кто готов жертвовать производительностью ради 1-2% качества. Но на одной карте разница в скорости перевешивает. Не забудьте про правильный чат-шаблон — ссылка на руководство.
И последнее: не гонитесь за 100+ tok/s, если агент работает качественно. Для большинства задач (кодирование, рерайтинг, поиск) 50 tok/s — уже комфортно. А вот для real-time диалогов — да, пригодится speculative decoding.