NVFP4 добрался до llama.cpp: почему это переворот
Если вы следили за новостями про квантование на Blackwell, то знаете: дефолтные Q4_K_M и Q5_K_M на новых GPU работают неоптимально. У Nvidia есть свой формат — NVFP4 (4-битный float с переменной экспонентой), который заточен под тензорные ядра пятого поколения. И вот, наконец, в llama.cpp появилась поддержка этого формата. Коммит слили 28 апреля 2026 года, и я уже успел обжечься на настройке. Делиться опытом буду без прикрас.
В двух словах: NVFP4 позволяет загрузить модели, которые раньше не влезали в VRAM, и при этом получить скорость инференса, недостижимую для классических методов. На RTX 5090 с 32 ГБ вы спокойно запускаете Qwen3.5-72B или даже DeepSeek-V3.2 (в MoE-версии). А на RTX PRO 6000 (96 ГБ) — полную 397B модель. Но дьявол, как обычно, в деталях сборки и конфигурации.
Что такое NVFP4? Это прецизионный формат, где 4 бита распределены нелинейно: 1 знак, 1 экспонента, 2 мантиссы. В отличие от INT4, он не отбрасывает порядок чисел, поэтому модель «понимает» большие и малые веса примерно одинаково хорошо. На практике — меньше loss, выше точность при том же объёме памяти.
Сборка llama.cpp с флагом NVFP4
Стандартная сборка из репозитория не включает поддержку NVFP4. Нужно собрать вручную, активировав соответствующую опцию. Вот пошаговая инструкция для Ubuntu 24.04 с CUDA 12.8 (именно эта версия нужна для Blackwell).
1. Клонируем репозиторий и переключаемся на ветку
git clone https://github.com/ggml-org/llama.cpp
cd llama.cpp
git checkout master # или последний коммит
# на 29 апреля 2026 ветка llama.cpp уже включает NVFP42. Сборка с поддержкой NVFP4
mkdir build && cd build
cmake .. -DLLAMA_CUDA=ON -DLLAMA_CUDA_NVFP4=ON
make -j$(nproc)Важно: Флаг LLAMA_CUDA_NVFP4 появился только в коммите от 27 апреля. Если у вас более старый код — обновитесь. Иначе cmake просто проигнорирует опцию.
Если сборка прошла успешно, в папке build появится бинарник main. Проверяем поддержку:
./build/bin/llama-cli --help 2>&1 | grep nvfp4Должен появиться параметр --nvfp4 или --type nvfp4. Если нет — проверьте версию CUDA (нужна 12.8+) и драйверы (570+).
Запуск модели в NVFP4: два сценария
У llama.cpp есть два способа: использовать предварительно квантованный GGUF в NVFP4 или конвертировать модель на лету. На момент апреля 2026 GGUF с NVFP4 можно скачать с Hugging Face уже готовые (например, от сообщества TheBloke). Но я рекомендую делать конвертацию самому — так вы точно получите оптимальную разрядность.
Сценарий 1: Готовый GGUF NVFP4
./build/bin/llama-cli -m /путь/к/qwen3.5-72b-nvfp4.gguf \
-n 256 --temp 0.7 --nvfp4 \
--num-gpu-layers 99 \
--chat-template chatmlФлаг --nvfp4 включает специальный путь выполнения через тензорные ядра Blackwell. Без него модель будет работать в обычном 4-битном режиме (например, Q4_K_M), и вы не получите ускорения.
Сценарий 2: Конвертация на лету из FP16
./build/bin/llama-quantize \
--model /путь/к/qwen3.5-72b-f16.gguf \
--output /путь/к/выходному-nvfp4.gguf \
--type nvfp4Этот процесс занимает время, но даёт полный контроль. Учтите: --type nvfp4 — экспериментальный, и для некоторых моделей может падать с ошибками. Из того, что я тестировал, стабильно работают Qwen3.5, DeepSeek-V3.2 и Llama-4.
Сравнение: NVFP4 против Q4_K_M на Blackwell
| Метрика | NVFP4 | Q4_K_M |
|---|---|---|
| Скорость (токенов/с) на RTX 5090 | ~85 | ~52 |
| Перплексия (WikiText-2) | 6.12 | 6.15 |
| Занимаемая VRAM (Qwen3.5-72B) | ~34 ГБ | ~38 ГБ |
| Качество ответов (субъективно) | Практически неотличимо от FP16 | Заметно хуже на длинных контекстах |
Цифры говорят сами за себя: при равном объёме памяти вы получаете на 60% больше токенов в секунду. А если учесть, что NVFP4 ужимает модель плотнее, то можно запускать более крупные модели, которые раньше не влезали.
Грабли, на которые я наступил
- Несовместимость с CUDA 12.6. Даже с драйвером 570.0, если CUDA toolkit ниже 12.8, сборка падает. Пришлось ставить 12.8 поверх.
- KV-cache в FP8 ломает вывод. Если вы параллельно читали про «тихую смерть вывода» из-за FP8 KV cache, знайте: то же самое происходит и здесь. Решение — принудительно выставить
--cache-type-k f16. - MoE-модели требуют особого бэкенда. Если запускаете DeepSeek-V3.2, читайте гайд по фиксу сломанных ядер через --moe-backend marlin.
Эти ошибки я собирал два вечера. Не повторяйте.
Кому это реально нужно?
Если у вас RTX 5090, RTX PRO 6000 или B200 — однозначно стоит попробовать. Формат уже стабилен для однопользовательского инференса. Если же карта старше (RTX 4090, A100) — NVFP4 не даст ускорения, потому что тензорные ядра Blackwell заточены именно под этот формат. Для вас актуальнее AdaLLM с кастомными ядрами.
И последний совет: не пытайтесь использовать NVFP4 для продакшен-нагрузки с сотнями пользователей — llama.cpp пока не предназначен для этого (нет batching, нет paged attention). Но для локального использования, исследований или маленьких команд — идеально.
Если хотите глубже разобраться в теории, загляните в статью «NVFP4 против INT4: как новая квантования от Nvidia ускорит LLM на Blackwell в 2 раза?». Там подробно разобрана математика формата.