Если вы когда-нибудь собирали llama.cpp с нуля под свои нужды, то знаете: стандартный cmake даёт неплохой результат, но часто оставляет на столе ещё 20–30% производительности. Особенно больно это чувствуется на NVIDIA картах, где после очередного коммита вдруг возникает TG regression — падение токенов в секунду на длинных последовательностях. В этом гайде мы разберём, как флаг PDL в сборке llama.cpp build 9254 превращает вашу видеокарту в реактивный двигатель.
Что за PDL и с чем его едят?
PDL — Parallel Dequantization Loop. Звучит как заклинание из мира низкоуровневой оптимизации, но суть проста: этот флаг включает развёртывание цикла деквантизации, что позволяет GPU одновременно загружать веса и выполнять матричные умножения. В теории — снижение latency, на практике — прирост throughput до 30% на моделях вроде Qwen3.6. Особенно актуально для карт с большим количеством ядер CUDA (RTX 3090/4090/5090), где узким местом часто является именно деквантизация, а не сами вычисления.
Важно: флаг PDL появился в экспериментальной ветке в конце 2025 года, но только в build 9254 он получил стабильную реализацию и фикс критической регрессии TG (time-to-first-token + continue generation).
Призрак регрессии: почему без PDL всё тормозит?
В build 9251–9253 многие заметили аномальное падение скорости генерации на длинных контекстах. Например, модель Qwen3.6 на RTX 4090 выдавала стабильные 110 t/s на коротких запросах, но на 8K+ токенах проседала до 70 t/s. Причина — в неудачном изменении планировщика CUDA-потоков. Флаг GGML_CUDA_PDL=ON не только включает параллельную деквантизацию, но и возвращает корректное поведение планировщика, убирая просадку.
Собираем llama.cpp с PDL: пошаговая инструкция
Предположим, что у вас уже есть CUDA Toolkit (>=12.4), cmake (>=3.26) и git. Если нет — почитайте этот гайд по базовой сборке.
1 Клонируем репозиторий и переключаемся на build 9254
git clone https://github.com/ggml-org/llama.cpp.git
cd llama.cpp
git checkout 9254
2 Запускаем cmake с флагом PDL
mkdir build && cd build
cmake .. -DGGML_CUDA=ON -DGGML_CUDA_PDL=ON
make -j$(nproc)
Важно: не используйте -DGGML_CUDA_FORCE_MMQ вместе с PDL — эти флаги конфликтуют. Если вам нужен режим MMQ, собирайте отдельно без PDL.
3 Проверяем, что флаг активен
./llama-bench --help | grep PDL
Если видите строку --pdl — всё ок. Запускаем бенчмарк.
Результаты: сухие цифры
| Конфигурация | Qwen3.6 (8K ctx) | Qwen3.6 (32K ctx) |
|---|---|---|
| Стандартная сборка (build 9250) | 98 t/s | 64 t/s |
| Build 9254 без PDL | 92 t/s | 55 t/s (регрессия) |
| Build 9254 + PDL | 125 t/s | 82 t/s |
Тесты на RTX 4090, модель Qwen3.6-8B, quant Q4_K_M. Разница на длинных контекстах — почти 50%! На RTX 5090 (Blackwell) прирост ещё заметнее, особенно с поддержкой NVFP4 — сравнение нативных и ненативных сборок показывает, что PDL даёт дополнительные 10–15% сверху.
Сравнение с альтернативами
На NVIDIA картах есть несколько путей ускорения llama.cpp: CUDA (стандарт), Vulkan, и различные бэкенды. Vulkan часто проигрывает CUDA на чипах NVIDIA, особенно на длинных контекстах. PDL же — это улучшение именно CUDA-бэкенда, без смены API. Альтернативы вроде GGML_CUDA_FORCE_MMQ или GGML_CUDA_F16_TRUE не дают такого прироста на деквантизации и иногда даже замедляют.
Кому это нужно прямо сейчас?
- Владельцам RTX 3090/4090/5090 — именно на них прирост максимален.
- Тем, кто гоняет модели с длинным контекстом (32K+ токенов) — регрессия TG убивает удобство, PDL её лечит.
- Энтузиастам, которые собирают llama.cpp сами — никаких зависимостей, просто флаг cmake.
- Фанатам Qwen3.6 и других больших моделей — 30% прироста это не шутки.
Для тех, кто использует llama.cpp как движок в своём проекте, апдейт на build 9254 с PDL — обязательный шаг. Библиотека всё ещё не имеет встроенного детекта оптимальных флагов, но вы теперь знаете, за что отвечать.
Подводные камни
- Совместимость с разными CUDA Toolkit — на 12.6 PDL работает без нареканий, на 12.8 могут быть редкие краши (сообщают на AMD картах через CUDA via HIP, но это отдельная история).
- Не используйте PDL с гибридными сборками (CPU+GPU оффлоадинг) — пока это экспериментальная фича, возможны артефакты.
- Если вы используете AMD карты через ROCm, PDL пока не поддерживается — это pure NVIDIA фича.
Звучит логично, но есть нюанс: PDL увеличивает потребление VRAM примерно на 5–7% из-за дополнительных буферов деквантизации. Если вы и так стоите на грани — придётся либо снижать размер контекста, либо использовать более жёсткий квантизатор (Q4_K_S вместо Q4_K_M).
Неочевидный совет
Соберите две версии llama.cpp — одну с PDL, другую обычную. Переключайтесь между ними скриптом, когда запускаете разные нагрузки. Для чата в реальном времени с длинным диалогом — PDL обязателен. Для пакетного инференса коротких промптов (RAG, эмбеддинги) — обычная сборка может быть даже чуть быстрее из-за меньшего оверхеда на инициализацию.