← Все гайды AI Release
EN Подписаться на @ai_release1

llama.cpp или vLLM: что выбрать для локального инференса LLM

Обновлено: 20.10.2026 · AI Release · @ai_release1
llama.cpp или vLLM: что выбрать для локального инференса LLM

TL;DR

Требования и подготовка

Иллюстрация к разделу «Требования и подготовка»
Иллюстрация к разделу «Требования и подготовка»

Проверка базы:

nvidia-smi
df -h .
python3 --version
cmake --version

Пример: nvidia-smi печатает таблицу с именем GPU, объёмом памяти и версией драйвера. Если команда не найдена или таблица пустая — GPU не проброшен, дальше идти нет смысла: у vLLM нет CPU-режима.

Если вы ещё выбираете железо под локальный инференс (в том числе мини-ПК с NPU), начните с материала Что такое NPU и как выбрать мини-ПК для локального запуска ИИ — там разобрано, какой класс устройств под какие задачи подходит.

Шаг 1. Определите сценарий и выберите движок

Иллюстрация к разделу «Шаг 1. Определите сценарий и выберите движок»
Иллюстрация к разделу «Шаг 1. Определите сценарий и выберите движок»

Что сделать: ответьте на четыре вопроса и сверьте ответ с таблицей ниже. Это отсекает половину проблем ещё до установки.

1. Сколько запросов одновременно? Один разработчик → llama.cpp; десятки параллельных → vLLM.

2. Какое железо? Только CPU или слабая GPU → llama.cpp; нормальная NVIDIA GPU → оба варианта.

3. Какие веса есть на диске? GGUF → llama.cpp; safetensors из Hugging Face → vLLM (llama.cpp их напрямую не грузит).

4. Нужен ли OpenAI-совместимый HTTP API? Оба движка его отдают, но разными бинарниками и на разных портах по умолчанию.

Зачем: движки оптимизированы под разные профили нагрузки. llama.cpp — компактный C++-движок, удобный для одиночных запросов и квантованных GGUF-весов. vLLM — серверный движок на Python с PagedAttention (механизм управления памятью под KV-кэш — кэш состояний внимания, который растёт с длиной контекста) и непрерывным батчингом: он держит много запросов в одном проходе по GPU.

Критерийllama.cppvLLM
Формат весовGGUF, в т.ч. квантованныеsafetensors (Hugging Face)
ЖелезоCPU, GPU, Apple SiliconNVIDIA GPU
Профиль нагрузки1–2 пользователя, локальный чат, встраивание в приложениеМного параллельных запросов, сервис
HTTP API`llama-server` (OpenAI-совместимый)`vllm serve` (OpenAI-совместимый)
Порт по умолчанию80808000
Установкасборка через CMake`pip install vllm`

Как проверить: заполните чек-лист — если хотя бы один пункт в правой колонке отмечен, берите vLLM.

Пример: стажёр поднимает локальную модель, чтобы подключить её к редактору кода как персонального ассистента — один пользователь, GGUF-файл на диске, ноутбук с дискретной GPU. По таблице выигрывает llama.cpp.

Шаг 2. Соберите и запустите выбранный движок

Что сделать: поднимите сервер того движка, который выбрали на шаге 1. Оба поднимают HTTP-сервер с OpenAI-совместимым API, поэтому клиентская часть потом не меняется — меняется только порт.

Зачем: именно серверный режим (а не интерактивный чат в терминале) даёт endpoint /v1/chat/completions, к которому подключаются сторонние клиенты.

Вариант A. llama.cpp

cmake -B build -DGGML_CUDA=ON
cmake --build build --config Release -j
./build/bin/llama-server \
  --model ./models/<имя-модели>.gguf \
  --host 0.0.0.0 --port 8080 \
  -ngl 99 -c 8192

-ngl 99 означает «выгрузить на GPU все слои» (число слоёв больше реального = все), -c 8192 задаёт размер контекста в токенах (токен — кусочек слова, единица, которой модель считает текст). Флаг -DGGML_CUDA=ON включает CUDA-сборку — без него движок соберётся под CPU и будет медленным.

Пример: адрес репозитория и актуальный список флагов сборки сверьте с документацией проекта — набор CMake-опций между релизами меняется.

Вариант B. vLLM

python3 -m venv .venv
source .venv/bin/activate
pip install vllm
vllm serve <org>/<модель> \
  --host 0.0.0.0 --port 8000 \
  --gpu-memory-utilization 0.90 \
  --max-model-len 8192

--gpu-memory-utilization 0.90 разрешает движку занять до 90% памяти GPU под веса и KV-кэш; --max-model-len ограничивает длину контекста, чтобы кэш не съел всю память.

Как проверить: сервер должен ответить списком моделей. Для llama.cpp:

curl -s http://localhost:8080/v1/models

Для vLLM:

curl -s http://localhost:8000/v1/models

Пример ожидаемого вывода: JSON вида {"object":"list","data":[{"id":"<имя-модели>", ...}]}. Если data пустой или соединение отклонено — сервер не поднялся, смотрите его лог в терминале.

Шаг 3. Проверьте генерацию и снимите свой замер

Иллюстрация к разделу «Шаг 3. Проверьте генерацию и снимите свой замер»
Иллюстрация к разделу «Шаг 3. Проверьте генерацию и снимите свой замер»

Что сделать: отправьте реальный запрос на генерацию и измерьте время и число выданных токенов.

Зачем: /v1/models подтверждает только то, что процесс жив. Генерация проверяет весь тракт: загрузку весов, токенизатор, выделение памяти под KV-кэш и работу сэмплера.

curl -s http://localhost:8080/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "<имя-модели>",
    "messages": [{"role": "user", "content": "Перечисли три способа проверить связь с сервером."}],
    "max_tokens": 128,
    "temperature": 0.2
  }'

Для vLLM та же команда, но порт 8000; в поле model подставьте идентификатор из ответа /v1/models.

Как проверить: в ответе есть choices[0].message.content с текстом и блок usage с полями prompt_tokens, completion_tokens, total_tokens. Зафиксируйте свой замер:

time curl -s http://localhost:8000/v1/chat/completions -H "Content-Type: application/json" -d @request.json

Пример: usage.completion_tokens = 96, time показывает real 0m2,4s — это ваши собственные цифры для вашей карты и модели. Готовых цифр в гайде нет специально: они зависят от GPU, квантования и длины контекста, поэтому корректно сравнивать только два движка на одной машине и одной модели.

Дальше сервер можно подключать к клиентам: пошаговая схема подключения локальной модели к Claude Code разобрана в Как подключить локальную модель к Claude Code: llama-server, OpenAI-совместимый API и лаунчер — там показано, как прописать базовый URL и имя модели в конфиге.

Возможные проблемы и решения

Проблема. vLLM падает при старте, GPU-память занята. Симптом: процесс завершается через несколько секунд после загрузки весов.

Проблема. llama.cpp не грузит файл модели.

Проблема. Клиент не видит сервер. Симптом: запрос из скрипта падает мгновенно.

Резюме и следующие шаги

Выберите llama.cpp для одиночных запросов, CPU и GGUF-весов, а vLLM — для сервиса с параллельными запросами на NVIDIA GPU; клиентский код при этом одинаковый, меняется только порт. Следующий шаг — подключить поднятый endpoint к рабочему клиенту и снять собственный замер на вашей модели.

FAQ

llama.cpp или vLLM — что быстрее?

На одиночном запросе разница зависит от квантования и карты; на потоке параллельных запросов vLLM выигрывает за счёт непрерывного батчинга. Корректно сравнивать только на одной машине, одной модели и одинаковой длине контекста — снимите замер по Шагу 3.

Можно ли запустить vLLM без GPU?

Нет, vLLM рассчитан на NVIDIA GPU с CUDA. Для CPU-инференса берите llama.cpp.

Загрузит ли llama.cpp модель в формате safetensors?

Напрямую — нет, нужен формат GGUF. Конвертация выполняется скриптом из репозитория llama.cpp; актуальную команду сверьте с документацией проекта.

Почему curl возвращает ошибку соединения, хотя сервер запущен?

Почти всегда несовпадение порта: llama.cpp слушает 8080, vLLM — 8000. Плюс проверьте --host 0.0.0.0, если обращаетесь не с localhost.

🤖 Кратко для ИИ