Ollama или vLLM: какой сервер LLM выбрать
Ollama подходит одному пользователю и работает на CPU, а vLLM рассчитан на высокую загрузку GPU. Сравните сценарии и команды запуска обоих серверов.
Ollama и vLLM: в одном абзаце
Ollama — это менеджер моделей с подключенным сервером: он загружает квантованные веса, загружает их в память и отвечает на 127.0.0.1:11434, используя CPU, если на сервере нет другого оборудования. vLLM — это движок высокой пропускной способности: он поддерживает высокую загрузку GPU при одновременной обработке множества запросов. Это неправильный инструмент для машины без GPU. В этом и состоит весь выбор. Один пользователь, общающийся с локальным помощником, — это задача для Ollama. Приложение, обслуживающее команду пользователей, — это задача для vLLM.
Оба продукта поддерживают совместимый с OpenAI HTTP API, поэтому клиентский код можно переносить между ними, изменяя базовый URL. API не является различием. Различие проявляется, когда поступает второй запрос, пока первый еще генерирует токены.
Что на самом деле представляет собой Ollama
Ollama — это уровень упрощения. Одна команда установки предоставляет реестр моделей (ollama pull llama3.1:8b), локальное хранилище весов, запрос для чата, службу systemd и HTTP API. Обслуживаемые модели представлены файлами GGUF и обычно используют 4-битное квантование. Поэтому модель 7B или 8B занимает на диске около 5 GB, а не 16 GB. Именно квантование делает вывод на CPU вообще возможным.
Механизм запуска Ollama построен на llama.cpp — библиотеке вывода на C++, благодаря которой квантование GGUF стало практически применимым на обычном оборудовании. Позднее Ollama добавила собственный механизм для некоторых новых семейств моделей, но llama.cpp по-прежнему является основой большей части обслуживаемых моделей. Поэтому при сравнении Ollama с llama.cpp в основном сравнивают уровень удобства с компонентом, который он оборачивает.
Целевая конфигурация рассчитана на одного пользователя. По состоянию на July 2026 значение по умолчанию для OLLAMA_NUM_PARALLEL равно 1. Это означает, что одна модель обрабатывает один запрос за раз, а остальные запросы ожидают в очереди, которая по умолчанию содержит 512 записей (OLLAMA_MAX_QUEUE). Вы можете увеличить параметр параллельной обработки. Ниже объясняется, какие ресурсы это потребует. Если вы ещё не запускали Ollama, начните с размещения Ollama на VPS с закрытым портом 11434, поскольку API не использует аутентификацию вообще.
Что такое vLLM на самом деле
vLLM — это только сервер инференса. Он не управляет библиотекой моделей, не содержит чата с промптами и не загружает модель по запросу. При запуске вы указываете репозиторий Hugging Face. Сервер загружает эту модель и обслуживает запросы, пока вы не остановите процесс.
Преимущество такого узкого назначения — высокая пропускная способность. Ее обеспечивают два механизма. PagedAttention хранит KV-кэш (key-value cache, состояние внимания для каждого токена, которое модель сохраняет для каждого активного запроса) в блоках фиксированного размера, как операционная система разбивает память на страницы. Запросу больше не требуется одно большое непрерывное зарезервированное пространство, рассчитанное на худший случай. Поэтому память, которая раньше простаивала в резерве, становится доступной для большего числа одновременных запросов. Continuous batching позволяет новому запросу присоединиться к выполняемой группе на следующем шаге декодирования, не дожидаясь завершения текущей группы. Завершенная последовательность сразу покидает группу, а ее слот занимает другой запрос.
Практический результат: на одном GPU переход от одного одновременного пользователя к тридцати резко увеличивает общую скорость в токенах в секунду, а скорость для каждого пользователя снижается гораздо меньше, чем можно ожидать. При настройках Ollama по умолчанию переход от одного пользователя к тридцати просто заставляет двадцать девять человек ждать.
Непрерывная пакетная обработка — главное отличие
Представьте, что пять запросов одновременно поступают на каждый сервер с одинаковым оборудованием.
Ollama с настройками по умолчанию полностью обрабатывает первый запрос, затем второй и так далее. Пятый клиент ждет завершения четырех полных генераций. Общая пропускная способность примерно равна скорости одной генерации, потому что процессор в каждый момент обрабатывает только одну последовательность.
vLLM декодирует все пять запросов за один прямой проход. Генерация одного токена для пяти последовательностей лишь ненамного дороже генерации одного токена для одной последовательности, поскольку основная затратная операция — чтение весов модели из памяти, и это чтение используется всей пакетной группой. Именно этот факт, связанный с пропускной способностью памяти, объясняет низкую скорость инференса на CPU: затраты определяются перемещением весов, а не арифметическими операциями.
Вы можете задать OLLAMA_NUM_PARALLEL=4 и получить часть этого преимущества. Цена — расход памяти. Каждому параллельному слоту требуется собственный KV-кэш, а Ollama делит окно контекста между слотами. Поэтому четыре параллельных запроса к модели, настроенной на 8192 токенов, оставляют каждому запросу контекст размером 2048 токенов. Пейджинговый кэш vLLM устраняет этот компромисс: блоки выделяются запросу по мере фактического роста запроса.
Установка и запуск Ollama
curl -fsSL https://ollama.com/install.sh | sh
ollama pull llama3.1:8b
ollama run --verbose llama3.1:8b "Write two sentences about Linux."Скрипт установки создает системного пользователя ollama, устанавливает бинарный файл и регистрирует службу ollama.service, привязанную к 127.0.0.1:11434. Строка eval rate, выведенная командой --verbose, показывает фактическое количество токенов в секунду на этом сервере. Учитывайте это значение, а не опубликованные показатели.
Чтобы увеличить параллелизм, используйте drop-in-конфигурацию systemd. При обновлении это изменение не будет перезаписано:
sudo systemctl edit ollama.service[Service]
Environment="OLLAMA_NUM_PARALLEL=4"
Environment="OLLAMA_KEEP_ALIVE=30m"sudo systemctl restart ollama
ollama psollama ps показывает загруженную конфигурацию, а столбец PROCESSOR содержит фактическое значение. 100% CPU означает, что GPU не используется. Это объясняет большинство случаев, когда Ollama работает медленно.
Установка и запуск через vLLM
Для vLLM требуются Linux и Python 3.10–3.13. Установите его в отдельное виртуальное окружение, поскольку vLLM устанавливает определенную сборку PyTorch:
uv venv --python 3.12 --seed
source .venv/bin/activate
uv pip install vllm --torch-backend=autoЗатем запустите модель. В качестве имени используется идентификатор репозитория Hugging Face, а не короткая метка:
vllm serve Qwen/Qwen2.5-1.5B-InstructПри первом запуске инициализация занимает много времени. Сначала загружаются веса, затем выполняется профилирование GPU, чтобы определить, сколько блоков KV-кэша помещается. Сервис прослушивает порт 8000. Проверьте его работу до написания клиентского кода:
curl http://localhost:8000/v1/models
curl http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{"model": "Qwen/Qwen2.5-1.5B-Instruct", "messages": [{"role": "user", "content": "Who won the world series in 2020?"}]}'Если Docker уже установлен на сервере, официальный образ избавляет от необходимости настраивать зависимости CUDA:
docker run --runtime nvidia --gpus all \
-v ~/.cache/huggingface:/root/.cache/huggingface \
--env "HF_TOKEN=$HF_TOKEN" \
-p 8000:8000 \
--ipc=host \
vllm/vllm-openai:latest \
--model Qwen/Qwen3-0.6B--ipc=host обязателен, а не является декоративным параметром: PyTorch передает тензоры между процессами через общую память, а выделяемого по умолчанию объема общей памяти Docker недостаточно для вывода с параллелизмом по тензорам.
В рабочей среде наиболее важны следующие параметры: --max-model-len — размер контекстного окна, за который вы готовы платить; --gpu-memory-utilization — доля памяти видеокарты, которую vLLM может использовать (по состоянию на July 2026 значение по умолчанию составляет 0.92); --tensor-parallel-size — для распределения одной модели между несколькими GPU; и --api-key.
В vLLM аутентификация включается одним флагом, а в Ollama отсутствует
vLLM проверяет bearer-токен, если вы передадите его:
vllm serve Qwen/Qwen2.5-1.5B-Instruct --api-key token-abc123То же значение можно задать через переменную окружения VLLM_API_KEY. Запрос без этого значения получает HTTP 401. Это по-прежнему не является причиной публиковать порт 8000 на общедоступном интерфейсе: в vLLM нет ограничения частоты запросов, а токен в обычном HTTP передаётся без шифрования и может быть прочитан в процессе передачи. Однако это означает, что сервер распознаёт вызывающую сторону.
В Ollama такая возможность отсутствует. Нет ключа, входа в систему или списка разрешённых источников. Любой процесс, имеющий доступ к порту 11434, может запускать, загружать или удалять модели. Оставьте его доступным только через loopback и подключайтесь к нему через самостоятельно размещённый VPN WireGuard либо через аутентифицирующий обратный прокси, который завершает TLS (защиту транспортного уровня).
Оборудование: что требуется каждому варианту
Ollama работает на CPU. Квантованная модель с разрядностью 4 бита требует примерно полгигабайта RAM на каждый миллиард параметров, а также около гигабайта на служебные расходы во время работы и дополнительную память для контекста. Поэтому модели 3B требуется около 4 GB свободной памяти, а модели 8B — около 8 GB. Скорость на общем vCPU составляет от единиц до небольшого двузначного числа токенов в секунду. Это ограничение пропускной способности памяти, а не ошибка конфигурации. Ни один флаг не устранит его.
vLLM рассчитан на GPU. В стандартном режиме он обслуживает веса без квантования с точностью 16 бит. Это примерно 2 GB на каждый миллиард параметров. Поэтому модели 8B требуется около 16 GB видеопамяти только для весов, без учёта KV-кэша, необходимого для параллельной обработки запросов, ради которой вы установили vLLM. На карте с 24 GB остаётся достаточно места для рабочего кэша. На карте с 16 GB его недостаточно. В этом случае выберите модель меньшего размера или передайте --quantization вместе с квантованным checkpoint. Бэкенд для CPU существует, но стандартные wheels не собраны для него. Кроме того, его использование лишает смысла запускать vLLM.
Поэтому вопрос об оборудовании в большинстве случаев определяет выбор программного обеспечения. Если GPU нет, используйте Ollama. Если арендованный GPU загружен на 5 процентов, потому что запросы обрабатываются последовательно, используйте vLLM.
Что выбрать для вашей рабочей нагрузки
- Один пользователь, CPU VPS, подготовка черновиков и составление кратких изложений: Ollama. Скорость приемлемая, а более простого решения нет.
- Помощник для программирования или MCP-сервер, который подключает ваши инструменты к локальной модели, к которому обращаетесь только вы: Ollama. Фактическая рабочая нагрузка предполагает один параллельный запрос.
- Сравнение пяти моделей на этой неделе: Ollama. Загрузка и удаление моделей с тегами — именно та задача, для которой он подходит, тогда как vLLM требует перезапуска процесса для каждой модели.
- Внутреннее приложение, чат-продукт или конвейер поиска и генерации с реальными пользователями: vLLM. В этом случае пакетная обработка оправдывает расходы на GPU.
- Пакетная задача по оценке ста тысяч документов за ночь: vLLM с высоким
--max-num-seqs. Важен только показатель пропускной способности, а задержка обработки отдельного документа значения не имеет. - Платформа агентов, в которой несколько самостоятельно размещаемых AI-агентов одновременно обращаются к модели: vLLM, поскольку трафик от агентов по своей природе неравномерен и параллелен.
Типовые причины с указанием отображаемых сообщений
vLLM не запускается с ошибкой KV-кэша. В сообщении указаны оба значения:
ValueError: The model's max seq len (32768) is larger than the maximum number of tokens that can be stored in KV cache (8192). Try increasing gpu_memory_utilization or decreasing max_model_len when initializing the engine.Модель задает окно контекста, размер которого превышает объем памяти, оставшийся после загрузки весов. Уменьшите его с помощью --max-model-len 8192 или увеличьте --gpu-memory-utilization, если карту больше ничто не использует. При значениях использования выше примерно 0.95 эта ошибка запуска часто заменяется сбоем CUDA out-of-memory при последующей работе под нагрузкой. Это более серьезная проблема.
Ollama выводит Killed в процессе генерации. Linux out-of-memory killer остановил процесс, поскольку модели потребовалось больше RAM, чем доступно на сервере. Подтвердите это с помощью sudo dmesg | grep -i oom. Используйте модель меньшего размера или с более сильным квантованием. Изменение параметра не устранит проблему.
Ollama нормально отвечает в одиночном режиме, но зависает под нагрузкой. Ошибки нигде не отображаются. Запросы выполняются тем дольше, чем больше одновременно вызывающих клиентов, поскольку OLLAMA_NUM_PARALLEL=1 обрабатывает их последовательно. Увеличьте это значение и примите меньший размер контекста на запрос либо перенесите рабочую нагрузку в vLLM.
vLLM возвращает 401 для каждого вызова. Вы запустили его с параметром --api-key, но клиент не отправляет заголовок Authorization. Большинство клиентских библиотек OpenAI отправляет в качестве ключа переданное вами значение. Поэтому задайте ключ в клиенте, а не удаляйте этот параметр.
vLLM сообщает, что модель не найдена. Ollama загружает модели по требованию, а vLLM этого не делает. Поле model в теле запроса должно совпадать с идентификатором репозитория, с которым вы запустили сервер, или со значением --served-model-name, если вы его задали. Проверьте точную строку с помощью curl http://localhost:8000/v1/models.
Запуск обоих вариантов — разумное решение
Они не исключают друг друга. Распространённый вариант: vLLM работает на экземпляре с GPU и обслуживает приложение, а Ollama — на обычном VPS рядом с ним для локальных скриптов, заданий cron и тестирования новых выпусков моделей. Обе конечные точки совместимы с OpenAI API, поэтому достаточно одной клиентской библиотеки и переключения базового URL. Контроль затрат здесь важнее выбора конкретного движка: простой GPU тарифицируется так же, как загруженный, а контроль прогнозируемых затрат на агентов и инференс — это отдельная задача, не связанная с выбором сервера.
FAQ
vLLM быстрее Ollama?
Для одного запроса на том же GPU разница невелика, поскольку обе системы выполняют одинаковые вычисления. Для большого числа одновременных запросов vLLM значительно быстрее, поскольку continuous batching декодирует каждую активную последовательность за один forward pass, а Ollama по умолчанию обрабатывает их последовательно. На машине только с CPU этот вопрос неактуален: Ollama работает на CPU, а vLLM фактически нет.
Может ли vLLM работать без GPU?
Практически нет. Стандартные wheels предназначены для GPU NVIDIA или AMD. На CPU исчезает причина существования vLLM — поддержание высокой загрузки ускорителя при обработке пакетных запросов. CPU backend существует для разработки. Для референса на CPU используйте Ollama или llama.cpp напрямую.
В чем разница между Ollama и llama.cpp?
llama.cpp — это библиотека для inference, а GGUF — ее формат квантованных весов. Runner Ollama построен на этой библиотеке и добавляет функции, которые в llama.cpp нужно настраивать самостоятельно: реестр моделей, автоматическую загрузку, постоянно работающий сервер, модуль systemd и endpoint, совместимый с OpenAI. Ollama добавила собственный engine для некоторых новых семейств моделей, поэтому теперь внутреннее устройство этих систем не полностью совпадает.
Сколько видеопамяти нужно vLLM для модели 8B?
При точности 16 бит только веса занимают около 16 GB, то есть примерно 2 GB на каждый миллиард параметров. Кроме того, требуется место для KV cache. Видеокарта на 24 GB подходит без ограничений. Для видеокарты на 16 GB потребуется квантованный checkpoint или модель меньшего размера. vLLM использует долю памяти видеокарты, заданную параметром --gpu-memory-utilization. По состоянию на July 2026 значение по умолчанию — 0.92.
Нужно ли изменять код приложения при переходе между ними?
Обычно достаточно изменить base URL, API key и имя модели. Ollama предоставляет совместимый с OpenAI интерфейс по адресу http://127.0.0.1:11434/v1 и игнорирует ключ, а vLLM предоставляет http://localhost:8000/v1 и проверяет ключ, если он задан. Имена моделей имеют разный формат: llama3.1:8b для Ollama и полный идентификатор репозитория, например Qwen/Qwen2.5-1.5B-Instruct, для vLLM.