Устранение узких мест в llama.cpp

При стандартной настройке плотная модель Qwen3.8-27B на двух видеокартах RTX 3090 выдает всего 32,4 токена в секунду. Основное ограничение связано с послойным разбиением весов: в этом режиме карты работают по очереди, что создает простой и ограничивает производительность потолком в ~39 токенов в секунду. Чтобы преодолеть этот барьер, необходимо использовать два метода: параллельную работу карт и встроенную функцию предсказания нескольких токенов за один проход.

MTP и тензорный параллелизм

Первый способ ускорения — активация встроенного в GGUF-файл слоя Multi-Token Prediction (MTP). С помощью флагов --spec-type draft-mtp и --spec-draft-n-max 3 можно увеличить скорость до 58,5 токенов в секунду. Оптимальная глубина черновика составляет 3 или 4 токена; увеличение этого значения выше 4 может снизить производительность. Второй способ — переход от послойного разбиения к тензорному параллелизму через NCCL с помощью флага -sm tensor. Это заставляет обе карты считать каждый слой одновременно. При использовании обоих методов на стенде с двумя RTX 3090 скорость генерации достигает 74,8 токенов в секунду.

Особенности квантования и контекста

Скорость работы также зависит от формата квантования MTP-головы. Тесты показали, что сборка от bartowski (где голова в Q4_0) работает быстрее, чем сборка от unsloth (где голова в Q6_K), несмотря на больший размер файла. Кроме того, для работы с длинным контекстом (до 262 144 токенов на слот) необходимо использовать квантование KV-кэша в формате q4_0, иначе объем памяти превысит доступные 48 ГБ на двух картах. При использовании тензорного параллелизма важно учитывать, что обработка промпта может замедлиться на 3–20% в зависимости от его длины, но это компенсируется высокой скоростью интерактивной генерации.

Важные технические нюансы

При запуске в Docker-контейнере для работы тензорного параллелизма обязательно использование флага --ipc=host, иначе возникнет ошибка CUDA. Также стоит учитывать, что при использовании MTP сэмплирование переносится на CPU, что может стать узким местом при слабом процессоре или использовании карт через райзеры с низкой пропускной способностью. Для корректной работы системных сообщений и функций в моделях Qwen рекомендуется проверять и подменять шаблон чата через --chat-template-file, так как стандартные шаблоны в некоторых сборках могут игнорировать инструкции.