Коротко: на одной коробке, обслуживающей несколько человек, движок редко оказывается узким местом, а честная причина его сменить — смена формы ворклоада, а не таблица бенчмарков. Мы гоняем llama.cpp на машинах Strix Halo, а vLLM — на паре DGX Spark, и решающим в обоих случаях было то, что нужно ворклоаду, а не какой движок «быстрее» в вакууме.
Сначала предупреждение о жанре. Большинство сравнений движков, которые вы найдёте, прогнаны на датацентровых GPU, цитируют множители пропускной способности, снятые на размерах батча, которых домашний сервер не видит никогда, и опускают модель, квант и конкурентность, которые их произвели. Кросс-движковых цифр на одинаковом железе нет и у нас — и вместо того, чтобы одолжить чужие, эта страница говорит то, что мы знаем из эксплуатации обоих.
Для чего каждый из них
llama.cpp запускает квантованные веса GGUF почти на чём угодно,
включая встроенные GPU через Vulkan, — ровно поэтому он наш обслуживающий
рантайм на коробках с unified-памятью. Это сервер плюс набор бэкендов, он
стартует за секунды и честно рассказывает, что делает, если спросить:
эндпоинт /props вернёт конфигурацию, которая сложилась на деле, — а она важнее, чем принято думать.
vLLM построен для обслуживания в масштабе: непрерывный батчинг, управление памятью через paged attention, тензорный параллелизм между устройствами. На нашей паре Spark тензорный параллелизм — не приятное дополнение: это единственная причина, по которой модель на 284B параметров вообще запускается, и серверный рецепт существует потому, что дорога туда потребовала настоящей эксплуатационной работы. В обмен на эту возможность вы получаете стек потяжелее: долгий старт, ограничения по формату модели и поведение выбора ядер, которое может молча взять путь помедленнее.
Ollama — слой дистрибуции и управления моделями, под которым работает llama.cpp. «Ollama против llama.cpp» поэтому обычно вообще не вопрос про движок — это вопрос о том, чьи дефолты вы наследуете и видите ли вы их.
Вопрос, который весит больше движка
Что бы вы ни запускали, выясните, какая конфигурация сложилась на деле. Самая дорогая ошибка измерения в нашем собственном журнале родом из рантаймового дефолта параллельных слотов, который сменился между версиями и молча поделил пропускную способность на поток — дни теорий о тюнинге умерли от одного запроса к работающему серверу. Полная история — в эссе, а общая форма урока — здесь: флаг, который вы не выставили, всё равно часть вашей конфигурации.
Вот где обёртки обходятся дорого. Слой, который управляет моделями за вас, заодно выбирает за вас длину контекста, число слотов, поведение выгрузки и дефолты сэмплинга, и если посмотреть на эти решения вы не можете, то не можете ни объяснить собственные цифры, ни починить их.
Когда llama.cpp достаточно
Всё, что мы меряем на одной коробке со 128 ГБ, работает на нём: одиночные ассистенты, конкурентность небольшой команды, документные сессии, автоматизация со строгим JSON и три часа непрерывной нагрузки. На этом классе железа практический потолок — пропускная способность памяти, и с физикой не спорит ни один движок: сильнее всего наши цифры сдвинули квантование и бэкенд, оба внутри llama.cpp.
Когда ворклоад просит vLLM
Три сигнала — из собственного опыта эксплуатации, а не из бенчмарка:
Модель не помещается в одно устройство. Тензорный параллелизм между узлами — та самая возможность, и для фронтирного открытого класса она не опциональна.
Вы обслуживаете настоящую очередь, а не несколько чатов. Непрерывный батчинг отрабатывает свою сложность, когда запросы действительно перекрываются весь день.
Вам нужен вендорский быстрый путь для конкретной модели. Некоторые ядра поставляются только в этой экосистеме — и, как мы выяснили, иногда только если попросить о них явно.
Если ничто из этого не описывает вашу коробку, тяжёлый стек даёт вам не скорость, а лишнюю эксплуатационную поверхность.
Чего мы не измеряли
Сравнения этих движков на одном железе, одной модели и одном ворклоаде в нашем архиве нет, поэтому на этой странице нет кросс-движковых цифр. Наши два движка работают на двух разных классах железа по двум разным причинам, и поставить их цифры в соседние колонки значило бы изготовить ровно тот фольклор, на демонтаж которого мы тратим время. Если сравнение случится позже, оно придёт с сырыми прогонами.
А пока протокол, которым это решается на вашей собственной коробке, описан здесь: заморозьте ворклоад, запините оба стека, спросите каждый сервер, с какой конфигурацией он на самом деле работает, и держите отказы в знаменателе. Это измерение стоит для вас больше любого общего ответа, включая этот.