Когда одна модель живёт двумя разными жизнями
Вы качаете одну и ту же модель — свежайший Nemotron 3 Super 120B, выпущенный NVIDIA в начале 2026. Запускаете её в llama.cpp с квантованием Q4_K_XL. Результат на вашем любимом бенчмарке — 55.4%. Потом, для скорости, разворачиваете ту же модель во vLLM с NVFP4. И получаете 40.2%. Разрыв в 15 процентных пунктов. Это не погрешность. Это системная ошибка. Или нет?
Это не баг. Это фундаментальное различие в том, как два самых популярных инференс-движка интерпретируют и выполняют одну и ту же математику. Если вы выбираете бэкенд, глядя только на токены в секунду, вы рискуете потерять львиную долю интеллекта модели.
Цифры, которые заставляют чесать затылок
Сообщество уже несколько недель ломает голову. На форумах и в чатах тестировщики делятся результатами. Паттерн один: llama.cpp, особенно с «тяжёлыми» квантованиями вроде Q4_K_XL или Q5_K_M, стабильно показывает лучшее качество на задачах рассуждения (reasoning). VLLM выигрывает в пропускной способности, иногда в разы, но проигрывает в точности. Разрыв особенно заметен на новых мультимодальных и агентных бенчмарках, где важна последовательность мыслей.
| Бэкенд | Квантование / Формат | Скор на AIME 2026 (A) | Токенов/с (A100-80GB) |
|---|---|---|---|
| llama.cpp (v0.4.1) | Q4_K_XL | 55.4% | 14-18 |
| vLLM (v0.6.2) | NVFP4 (нативный) | 40.2% | 120-150 |
| vLLM (v0.6.2) | FP16 | 53.1% | 35-40 |
Первый вопрос: а не в квантовании ли дело? Отчасти да. Но не полностью. Обрати внимание на последнюю строку. Даже в FP16 vLLM отстаёт от квантованного llama.cpp. Значит, дело глубже, чем просто потеря точности в 4 битах.
Копаем в ядро: что делают по-разному
Здесь начинается самое интересное. Оба движка преследуют разные цели. Llama.cpp рождён для работы на чём угодно — от MacBook на Apple Silicon до CPU-сервера. Его ДНК — точность и гибкость. VLLM — это дитя облачных инференс-ферм, его божество — это throughput, максимальная утилизация дорогого GPU.
- Порядок вычислений и аккумуляция. В llama.cpp, особенно для сложных квантований типа K-quants, используется каскадная деквантация с высокой точностью аккумуляторов (часто FP32). VLLM, оптимизируя для скорости, агрессивно использует tensor cores и смешанную точность (FP16/BF16 для аккумуляторов даже в INT4), что может накапливать ошибку в длинных последовательностях.
- Кэш ключей-значений (KV Cache). Это главный подозреваемый. VLLM использует PagedAttention — гениальную систему для эффективного использования памяти. Но её текущая реализация (v0.6.2) для 4-битных весов вынуждена делать дополнительные преобразования и загрузки данных, которые могут нарушать тонкую временную согласованность в attention-слоях. Llama.cpp использует более простой, но детерминированный подход к кэшу.
- Обработка ротационных позиционных эмбеддингов (RoPE). Nemotron 3 Super использует усовершенствованный вариант RoPE с длинным контекстом. Есть намёки, что vLLM применяет к этим вычислениям более агрессивные оптимизации, что может «смазывать» позиционную информацию для дальних токенов в контексте.
Полевой тест: как проверить самому
Не верь на слово. Проверь. Если ты уже умеешь запускать Nemotron 3 Super в llama.cpp, сделай следующее.
- Возьми одну и ту же тестовую промпт-последовательность. Лучше всего сложную цепочку рассуждений или математическую задачу.
- В llama.cpp используй флаги
-c 4096 -ngl 99 --temp 0и убедись, что используешь последнюю версию (0.4.1 на 28.03.2026). Квантование — Q4_K_XL или Q5_K_M. - Во vLLM запусти сервер с флагами, указывающими на ту же модель в формате NVFP4. Используй официальный Docker-образ v0.6.2. Важно: отключи оптимизацию
--enforce-eagerдля чистоты эксперимента. - Сравни не только конечный ответ, но и лог вероятностей (logprobs) для ключевых токенов решения. Именно здесь часто видна разница.
Ты заметишь, что для llama.cpp логи вероятности для правильных шагов рассуждения часто выше и увереннее. VLLM может «дрожать» между вариантами. Это и есть та самая накопленная ошибка.
Что делать? Выбор без компромиссов
Итак, у тебя есть дилемма: качество или скорость. Но есть и третий путь — знание.
- Для разработки, тестирования и исследований используй llama.cpp. Его результаты — эталонные. Особенно если ты работаешь с анализом внутренней работы моделей. Качество важнее.
- Для продакшена с высоким RPS (запросов в секунду) — vLLM. Но будь готов к потенциальному падению качества на сложных промптах. Мониторь метрики внимательно. Рассмотри использование FP16, если пропускная способность позволяет.
- Экспериментируй с гибридными подходами. Некоторые начинают использовать vLLM для простых классификаций и рерайта, а для сложных reasoning-запросов перенаправляют запросы на отдельный сервер с llama.cpp. Архитектурно сложнее, но даёт лучшее из двух миров.
Главная ошибка — слепо переносить гиперпараметры (температуру, top_p) с одного бэкенда на другой. Они начинают работать по-разному из-за различий в распределении вероятностей. Настраивай заново под каждый движок.
А что в будущем? Война движков
Разработчики vLLM уже в курсе проблемы. В roadmap на 2026 год есть пункт «улучшение точности для low-bit квантований». Ожидай, что в версии 0.7.0 появятся новые режимы вычислений, возможно, заимствованные из llama.cpp. С другой стороны, llama.cpp не стоит на месте — команда активно работает над своей реализацией PagedAttention и батчингом, чтобы догнать vLLM по скорости.
Мой прогноз: к концу 2026 года разрыв в качестве сократится до 3-5%, но полностью не исчезнет. Потому что философия разная. Один движок — для мысли, другой — для масштаба. Выбирай, что важнее для твоего проекта прямо сейчас. А если сомневаешься, посмотри глубокое сравнение бэкендов для VLM, там та же история, но с пикселями.
P.S. Если ты всё ещё запускаешь гигантов вроде 120B на домашнем железе, тебе пригодится наш гид про слоевый стриминг против ограничений VRAM. Без него никак.