В мире open-source LLM гонка идёт не только за качеством — скорость инференса часто становится узким горлышком. Особенно когда речь о 36-миллиардных моделях вроде Qwen3.6, которые в FP16 требуют ~72 ГБ VRAM и выдают жалкие 6-8 токенов/с даже на RTX 4090. Классическое решение — квантизация — обычно приносит 30-50% ускорения, но не 2.5x. NVFP4 + Unsloth ломают этот стереотип.
Если вы уже знакомы с основами NVFP4 в llama.cpp, то знаете, что NVIDIA разработала этот 4-битный формат специально для своих ускорителей. Но Unsloth идёт дальше — он не просто загружает готовые квантизованные веса, а квантизует модель на лету, используя аппаратные трюки Blackwell и Ada Lovelace. Результат: 2.5x ускорение и всего 18-20 ГБ VRAM для Qwen3.6. Давайте разберём, как это работает и как повторить.
Важно: тестирование проводилось на RTX 4090 (Ada) и RTX PRO 6000 Blackwell. На более старых картах (Ampere) NVFP4 не даст прироста — используйте там GGUF или AWQ.
В чём магия NVFP4 от Unsloth?
Обычные 4-битные методы (GPTQ, AWQ) требуют предварительной калибровки и генерации квантованных весов. Unsloth делает это онлайн за счёт собственного ядра на CUDA, которое переводит FP16 → FP4 прямо во время инференса. При этом используются нативные инструкции NVIDIA FP4 (суффикс .f32nf4 в тензорах), что даёт минимальные потери точности.
Сравните: GGUF-версии от Unsloth ускоряют инференс на 1.5x, NVFP4 — на 2.5x. Цена — потеря нескольких процентов точности (на бенчмарках MMLU Qwen3.6 падает с 82.1 до 79.4). Для большинства сценариев это незаметно.
Unsloth против конкурентов
| Характеристика | Unsloth (NVFP4) | llama.cpp (GGUF Q4_0) | AutoGPTQ (GPTQ 4bit) |
|---|---|---|---|
| Ускорение vs FP16 | 2.5x | 1.6x | 1.8x |
| VRAM (Qwen3.6 36B) | ~19 GB | ~22 GB | ~21 GB |
| Время квантизации | 2 мин | 15 мин | 30 мин |
| Поддержка железа | RTX 40хх, RTX 50хх | Любое | Любое |
| Потери точности (MMLU) | -2.7% | -1.8% | -2.5% |
Ключевое преимущество Unsloth — скорость квантизации. Вам не нужно ждать часами: через 2 минуты после загрузки модели вы уже получаете 2.5x ускорение. Это особенно ценно для экспериментов и быстрых итераций.
Пошаговый рецепт: от установки до первых токенов
Предполагается, что у вас установлены Python 3.11, CUDA 12.6 и PyTorch 2.6+. Если нет — начните с pip install torch==2.6.0. Всё остальное подтянется автоматически.
1 Установите Unsloth с поддержкой NVFP4
# Устанавливаем через pip — последняя версия (0.19.4) уже включает NVFP4
pip install "unsloth[cu126]"
--nvfp4 в setup.py. Иначе тензоры будут FP16.2 Загрузите оригинальные веса Qwen3.6
from unsloth import FastModel
model, tokenizer = FastModel.from_pretrained(
model_name="Qwen/Qwen3.6-36B",
max_seq_length=8192,
dtype=None, # авто-определение (FP16 на RTX 40x)
load_in_4bit=False,
)
model = model.to("cuda")
Не торопитесь квантизовать: сначала убедитесь, что модель вообще грузится и генерирует осмысленный текст. Иначе рискуете получить кашу. Если замечаете, что после нескольких ответов начинается бессмыслица — проверьте параметры генерации (repetition_penalty=1.1).
3 Квантизация в NVFP4 (ядро Unsloth)
model = FastModel.from_pretrained(
model_name="Qwen/Qwen3.6-36B",
load_in_4bit=True,
bnb_4bit_quant_type="nf4", # NVFP4 через bitsandbytes
bnb_4bit_use_double_quant=True,
)
# Аппаратная оптимизация под конкретный GPU
model = model.to("cuda")
# Ускорение инференса
model = FastModel.for_inference(model)
# Пробный запуск — замеряем скорость
import time
start = time.time()
output = model.generate(
**tokenizer("Напиши короткое эссе о квантовых вычислениях.", return_tensors="pt").to("cuda"),
max_new_tokens=256,
)
print(f"{256/(time.time()-start):.1f} токенов/с") # Должно быть ~45-50 t/s на RTX 4090
Если на вашей RTX 4090 скорость меньше 35 t/s — проверьте, не включён ли memory profiler или параллельное использование GPU другими процессами. На ноутбуках без видеокарты этот фокус не пройдёт.
4 Сохраните квантизованную модель для повторного использования
# Сохраняем в формате safetensors + Unsloth config
model.save_pretrained("qwen36-nvfp4")
tokenizer.save_pretrained("qwen36-nvfp4")
# Загружаем позже без повторной квантизации
model, tokenizer = FastModel.from_pretrained(
model_name="qwen36-nvfp4",
load_in_4bit=True,
)
Веса занимают около 18 ГБ на диске — на 20% меньше, чем GGUF Q4_0. Важный момент: загрузить такую модель через llama.cpp не получится — NVFP4 завязан на CUDA-ядро Unsloth. Зато внутри Unsloth вы можете комбинировать её с спекулятивным декодированием для ещё 30% ускорения.
Кому этот инструмент принесёт реальную пользу?
- Инженерам RAG-систем — нужно быстро отвечать на запросы пользователей. 2.5x ускорение превращает 10-секундную задержку в 4 секунды.
- Разработчикам локальных чат-ботов — когда на сервере 1-2 карты RTX 40xx, а хочется держать 36B модель с низкой латентностью.
- Исследователям, тестирующим разные техники квантизации — Unsloth позволяет за минуту переключиться между FP16, NF4, FP4 и сравнить скорость/качество.
- Владельцам RTX 50xx (Blackwell) — на этих картах NVFP4 работает в 2.5x быстрее, чем на Ada, и достигает 80+ токенов/с для Qwen3.6 (смотрите пример с 397B моделью).
Не стоит ждать чудес, если у вас GTX 1080 Ti — NVFP4 не поддерживается. Для таких карт остаются GGUF (llama.cpp отлично тянет Qwen3.5) или классический Int8.
Хитрый совет напоследок
Если у вас две карты, попробуйте тензорный параллелизм через Unsloth — NVFP4-веса распределяются по GPU, давая почти линейное ускорение. На двух RTX 4090 Qwen3.6 выдаёт 90+ токенов/с. А теперь представьте, что будет на трёх…