Контекст задачи
До обновления API LLMCOD работал на Qwen 3.6. Модель справлялась, но по мере роста числа клиентов и усложнения промптов (длинные базы знаний, многошаговые диалоги, агенты) стало понятно: нужен более свежий бэкенд с лучшим качеством и более эффективным использованием GPU.
Цель — получить максимум от имеющегося железа (Tesla V100-SXM2-32GB), не покупая новый GPU.
Что сделали
1. Обновили модель
Перешли с Qwen 3.6 на Qwen 3.8 27B (Dense) в квантовании Q6_K_M (Ultra-Deduplicated). Модель — из серии UD-квантований I-Quants, оптимизированных под минимальную потерю качества при максимальном сжатии.
Размер модели на диске: ~12 ГБ. В VRAM после загрузки всех слоёв на GPU (-ngl 99) — ~18 ГБ.
2. Включили MTP-спекулятивный декодинг
Qwen 3.8 поддерживает Multi-Token Prediction (MTP) — механизм, при котором отдельная драфт-модель предсказывает несколько следующих токенов за один проход, а основная модель проверяет их за один forward. Если драфт угадал — генерация ускоряется; если нет — основная модель корректирует.
Мы используем MTP-модель в квантовании Q4_0 (~3 ГБ VRAM) с параметром --spec-draft-n-max 3 (до 3 токенов за шаг).
Эффект: MTP поднимает скорость генерации примерно на 40–50% по сравнению с обычным autoregressive decoding. В тестах:
-
без MTP: ~30 ток/с
-
с MTP: ~45 ток/с (одиночный запрос)
-
с MTP, два параллельных: ~26 ток/с на каждый поток
3. Распределили контекст: 2×32K с KV-кэшем в q8_0
Главная задача — дать клиентам большой контекст (32K токенов на диалог) и при этом сохранить параллельную обработку двух запросов.
Проблема: KV-кэш для 2 слотов по 32K в формате f16 (по умолчанию) занимает ~10 ГБ VRAM. Вместе с весами модели (18 ГБ) и MTP-моделью (3 ГБ) получается ~31 ГБ — на грани OOM.
Решение: Квантование KV-кэша в q8_0 — флаги --cache-type-k q8_0 --cache-type-v q8_0. Это уменьшает размер кэша примерно вдвое при практически незаметной потере качества.
Итоговая конфигурация
iniExecStart=/opt/llama.cpp/build/bin/llama-server \ -m /opt/models/qwen38-27b/Qwen3.8-27B-UD-Q6_K_M.gguf \ -md /opt/models/qwen38-27b/MTP/mtp-Qwen3.8-27B-Q4_0.gguf \ --spec-type draft-mtp --spec-draft-n-max 3 \ -ngl 99 \ -c 65536 --cache-type-k q8_0 --cache-type-v q8_0 \ --port 8080 --host 0.0.0.0 \ --jinja --reasoning off \ --alias qwen3.8 --parallel 2
ExecStart=/opt/llama.cpp/build/bin/llama-server \ -m /opt/models/qwen38-27b/Qwen3.8-27B-UD-Q6_K_M.gguf \ -md /opt/models/qwen38-27b/MTP/mtp-Qwen3.8-27B-Q4_0.gguf \ --spec-type draft-mtp --spec-draft-n-max 3 \ -ngl 99 \ -c 65536 --cache-type-k q8_0 --cache-type-v q8_0 \ --port 8080 --host 0.0.0.0 \ --jinja --reasoning off \ --alias qwen3.8 --parallel 2
|
Параметр |
Значение |
|---|---|
|
Модель |
Qwen 3.8 27B, Q6_K_M (UD) |
|
Драфт-модель |
MTP, Q4_0 |
|
GPU |
Tesla V100-SXM2-32GB |
|
Общий контекст |
65 536 токенов |
|
Контекст на слот |
32 768 токенов |
|
Параллельных слотов |
2 |
|
KV-кэш |
q8_0 (K и V) |
|
VRAM всего |
~26.3 ГБ из 32 ГБ |
|
Запас VRAM |
~6.5 ГБ |
|
Скорость (1 запрос) |
~45 ток/с |
|
Скорость (2 параллельных) |
~26 ток/с на поток |
Бенчмарк: параллельная обработка
Для проверки параллельности отправили два запроса одновременно — «напиши 500 слов про космос» и «напиши 500 слов про океан». Оба стартовали в одну секунду (PID 20935 и 20936).
|
|
Космос |
Океан |
|---|---|---|
|
Prompt tokens |
23 |
23 |
|
Completion tokens |
804 |
777 |
|
Время генерации |
30.7 сек |
29.7 сек |
|
Скорость |
26.2 ток/с |
26.1 ток/с |
|
Draft accepted |
447 из 1074 |
435 из 1023 |
Разница во времени — меньше секунды. Оба слота работали независимо, без очереди.
Разбор по памяти
|
Компонент |
VRAM |
|---|---|
|
Веса модели (Q6_K_M, все слои на GPU) |
~18 ГБ |
|
MTP-модель (Q4_0) |
~3 ГБ |
|
KV-кэш 2×32K в q8_0 |
~5 ГБ |
|
Прочее (CUDA context, буферы) |
~0.3 ГБ |
|
Итого |
~26.3 ГБ |
Для сравнения, KV-кэш в f16 занял бы ~10 ГБ, и итого было бы ~31 ГБ — на грани OOM.
Что получили клиенты
-
Контекст 32K на каждый диалог — десятки тысяч слов, большие промпты, базы знаний.
-
Два одновременных запроса без очереди — виджет и API могут работать параллельно.
-
MTP-ускорение — генерация быстрее на 40–50% по сравнению с обычным режимом.
-
OpenAI-совместимый API — ключи и эндпоинты не менялись, интеграции работают без изменений.
Деплой
Модель и сервер управляются через systemd (qwen-llama-server.service), автозапуск включён. При перезагрузке ОС сервис стартует автоматически с актуальными параметрами.
LLM API: Чат без ключа:
Дата: 10 сентября 2026 · LLMCOD · Tesla V100-SXM2-32GB · llama.cpp + MTP
ссылка на оригинал статьи https://habr.com/ru/articles/1080846/