Разгон до 75 токенов в секунду: оптимизация Qwen3.8 и тензорный параллелизм в llama.cpp
Стандартная конфигурация запуска плотной языковой модели Qwen3.8-27B на базе llama.cpp с использованием двух видеокарт RTX 3090 обеспечивает скорость генерации около 32 токенов в секунду. Однако глубокий анализ аппаратных возможностей показывает, что данный показатель является лишь отправной точкой. Путем внедрения специализированных флагов запуска, активирующих встроенный механизм предсказания нескольких токенов (MTP) и перехода на тензорный параллелизм, инженерам удалось увеличить пропускную способность до 75 токенов в секунду без потери качества ответов. Данная методика демонстрирует, как скрытые узкие места в конвейере обработки можно устранить через программную настройку, а не только за счет апгрейда железа.

# Оптимизация Qwen3.8 и тензорный параллелизм в llama.cpp: путь к 75 токенам в секунду
Стандартный запуск локальных больших языковых моделей (LLM) часто сталкивается с ограничениями, заложенными в архитектуру рендеринга весов. В случае с популярным инструментом llama.cpp и тяжелой моделью Qwen3.8-27B (27 миллиардов параметров), базовая производительность на двух видеокартах NVIDIA RTX 3090 составляла всего 32.4 токена в секунду. Учитывая, что каждая карта обладает пропускной способностью памяти около 936 ГБ/с и объемом памяти 24 ГБ, теоретический потолок значительно выше. Исследование показало, что основные препятствия кроются не в физической мощности оборудования, а в стратегии распределения вычислений между ядрами.
В ходе работы над задачей были выявлены несколько «узких мест», каждый из которых устранялся путем включения соответствующих функций и флагов конфигурации. Итоговый результат превзошел ожидания: скорость генерации достигла 74.8–75.0 токенов в секунду при сохранении исходных весов модели и без смены архитектуры GGUF-файла.
Механизм предсказания нескольких токенов (MTP)
Одной из первых и наиболее эффективных оптимизаций стало включение функционала Multi-Token Prediction (MTP). Внутри модели Qwen3.8 уже заложена специальная голова (head), способная предсказывать несколько последовательных токенов за один шаг вычислений. Однако по умолчанию llama.cpp игнорирует этот компонент, пропуская веса через лог как неиспользуемые.
Для активации этого механизма необходимо задать специфические параметры запуска, указывающие системе использовать стратегию черновика (draft), основанную на MTP. Это позволяет генерировать текст быстрее, предвосхищая следующее слово или группу слов уже в процессе расчета текущего блока.
*«Черновик модели работает на основе внутренних весов и угадывает следующий фрагмент текста, уменьшая количество необходимых вычислительных итераций для каждого отдельного слова.»*
Включение данной опции дало прирост производительности с 32.4 до 58.5 токенов в секунду (рост в 1.8 раза). Однако для корректной работы требуется дополнительное внимание к кэшированию ключевых и значимых значений (KV-кэш). По умолчанию черновик хранит свои копии в формате с высокой точностью (f16), что быстро съедает объем видеопамяти. Применение квантования q4_0 для этого кэша (-ctkd q4_0, -ctvd q4_0) стало обязательным условием стабильной работы, позволившим использовать глубины черновика в 3–4 токена без переполнения памяти.
Тензорный параллелизм вместо послойного
Второй критический шаг в оптимизации заключался в изменении способа распределения нагрузки между видеокартами. Исходная настройка llama.cpp применяла послойный режим (-sm layer), при котором слои нейросети выполнялись строго по очереди на разных картах. Это создавало ожидание и снижало эффективность использования вычислительных блоков.
После обновления версии сборки до 10666 была внедрена поддержка тензорного параллелизма (Tensor Parallelism, -sm tensor). В этой конфигурации обе видеокарты работают синхронно, рассчитывая каждый слой модели одновременно. Обмен данными между устройствами осуществляется через протокол NCCL, что позволяет значительно сократить время простаивания одного из ускорителей.
| Режим работы | Скорость генерации (короткий контекст) | Скорость при 130K токенов | | :--- | :--- | :--- | | Послойный (layer) | 58.5 ток/с | 41.4 ток/с | | Тензорный (tensor) | 74.7 ток/с | 58.9 ток/с |
Переход на тензорный параллелизм дал итоговый результат — 75 токенов в секунду при работе с активированным MTP. Важно отметить, что этот режим требует правильной настройки межпроцессного взаимодействия (--ipc=host или адекватный размер разделяемой памяти), в противном случае система выдает ошибки в процессе декодирования. Также стоит учитывать, что такая настройка может немного снизить скорость обработки входящих промптов на коротких контекстах, однако для диалоговых систем с длинной историей выгода очевидна.
Контроль качества и выбор конфигурации
При достижении высокой скорости неизбежно возникает вопрос о сохранности качества ответов. Проведенные тесты на код, форматирование и логические задачи показали, что при использовании правильной сборки весов (например, Q6_K_L от bartowski) и корректного шаблона диалога (chat-template от unsloth), качество модели не страдает.
Кроме того, для работы с длинными контекстами (до 262 144 токенов) было необходимо оптимизировать использование памяти под кэширование (-c 524288). Это позволило запускать два параллельных потока запроса одновременно, не жертвуя объемом контекста каждого из них. Для таких нагрузок квантование KV-кэша в q4_0 стало решающим фактором, удерживающим общий потребление видеопамяти в пределах 48 ГБ.
Итоговая конфигурация, обеспечивающая рекордную скорость, включает использование флага тензорного параллелизма, активацию MTP с ограничением глубины черновика и специализированное квантование кэша. Это демонстрирует, что эффективное использование современного оборудования для локальных LLM требует не только мощного железа, но и точного понимания внутренней логики рендерера, чтобы обойти программные ограничения по умолчанию.