Ollama или llama.cpp на VPS: что выбрать для CPU
Узнайте, что лучше использовать на VPS с ограниченной памятью. Разбираем разницу между движком llama.cpp и менеджером Ollama, влияние квантования на RAM и выбор настроек.
Ollama или llama.cpp: на каком уровне вы хотите работать?
Ollama и llama.cpp не являются конкурентами в том смысле, который подразумевает вопрос. llama.cpp — это движок инференса: он загружает файл модели и преобразует промпт в токены. Ollama — это менеджер моделей, фоновый демон и HTTP API, работающий поверх этого движка. В файле README проекта Ollama по-прежнему указан llama.cpp в качестве бэкенда для инференса (проверено 27 октября 2026 года). Поэтому реальный вопрос заключается в том, на каком уровне вы хотите работать на своем VPS, а не в том, какой из них быстрее.
Используйте Ollama, если вам нужен сервис, который загружает модели по имени и продолжает работать без вашего вмешательства. Запускайте llama.cpp напрямую, если ваш сервер обладает ограниченными ресурсами и вам необходимо выбрать конкретный файл модели, точный размер контекста и количество потоков, так как на небольшом VPS каждый из этих параметров потребляет память, которой у вас может не быть.
Что представляет собой каждый проект
llama.cpp — это реализация инференса трансформеров на C и C++, построенная на библиотеке ggml. Она считывает файлы GGUF. GGUF (GGML universal file format) — это однофайловый контейнер, содержащий веса, токенизатор и метаданные, необходимые движку для запуска модели. Проект выпускает отдельные бинарные файлы для разных задач. llama-server — это HTTP-сервер, llama-cli — интерактивная командная строка, а llama-bench измеряет пропускную способность. Сейчас проект выпускает релизы с семантическим версионированием (MAJOR.MINOR.PATCH), и версия v0.7.0, опубликованная 15 октября 2026 года, была последней на 27 октября 2026 года. Ночные сборки с номерами билдов по-прежнему выходят параллельно, по несколько штук в день, и новейшей на 27 октября 2026 года была b11913.
Ollama — это программа на Go. Фоновый демон, запускаемый командой ollama serve, загружает модели и отвечает на HTTP-запросы, а клиент командной строки взаимодействует с этим демоном. За обоими компонентами стоит реестр на ollama.com, содержащий готовые к использованию модели. Ollama использует семантические версии. Версия v0.32.5 вышла 27 июля 2026 года, а v0.40.12 была выпущена 27 октября 2026 года в 00:07 UTC. ollama pull загружает файл GGUF вместе с шаблоном промпта и набором параметров по умолчанию, а затем сохраняет его в /usr/share/ollama/.ollama/models в Linux. Эти файлы располагаются на корневом диске и занимают по несколько гигабайт каждый, поэтому на VPS с корневым разделом объемом 25 GB стоит знать что остается после команды pull и как перенести директорию с моделями в другое место, прежде чем третья загрузка заполнит диск.
Эта упаковка — единственное различие. Ollama определяет квантование, шаблон и длину контекста за вас, предоставляя одно имя для запоминания. llama.cpp предоставляет эти параметры в виде флагов, автоматически подставляя значения по умолчанию для настроек, которые вы не указали.
Ось 1: управление моделью и квантованием
Квантование хранит веса в меньшем количестве бит, чем 16 или 32 бита исходной модели; типичные сборки GGUF в среднем используют около 4, 5 или 8 бит на вес. Точность распределена по файлу неравномерно. В исходном коде квантователя llama.cpp (прочитано 27 октября 2026 года) сборка Q4_K_M сохраняет большинство тензоров в 4-битном формате, но для выходного слоя, а также для тензоров значений внимания (attention value) и тензоров понижения прямой связи (feed-forward down) примерно в половине слоев используется 6-битный формат Q6_K, в то время как небольшие тензоры, такие как нормы, не квантуются вовсе. Именно это позволяет модели с 8 миллиардами параметров поместиться в оперативной памяти обычного VPS. Именование GGUF легко читается, если знать закономерность: Q4_K_M означает 4-битное K-квантование, средний размер. Более высокое число сохраняет больше точности, но требует больше памяти.
Данные, на которых построен график
[
{
"label": "Q2_K",
"file_size_gib": 2.96
},
{
"label": "Q3_K_M",
"file_size_gib": 3.74
},
{
"label": "Q4_K_M",
"file_size_gib": 4.58
},
{
"label": "Q5_K_M",
"file_size_gib": 5.34
},
{
"label": "Q6_K",
"file_size_gib": 6.14
},
{
"label": "Q8_0",
"file_size_gib": 7.95
}
]Это опубликованные размеры файлов в репозитории bartowski/Meta-Llama-3.1-8B-Instruct-GGUF на Hugging Face, данные получены 2 августа 2026 года и переведены из байтов в ГиБ. Доступно 6 сборок одной модели, самая маленькая из которых занимает 2.96 ГиБ, а самая большая — 7.95 ГиБ. Стандартный вариант по умолчанию, Q4_K_M, занимает 4.58 ГиБ. На VPS с 4 ГиБ оперативной памяти этот выбор определяет, загрузится ли модель вообще. Размер — это лишь половина решения, так как вариант, который вы можете себе позволить, не обязательно является лучшим выбором, и то, во что на самом деле обходятся Q4, Q8 и fp16 в плане качества ответов — это то, что подскажет, стоят ли дополнительные гигабайты того, чтобы вы заметили разницу.
В llama.cpp вы указываете имя файла, поэтому выбираете этот вариант самостоятельно.
llama-server -m ~/models/Meta-Llama-3.1-8B-Instruct-Q4_K_M.gguf \
-c 4096 -t 4 --host 127.0.0.1 --port 8080-c — это размер контекста в токенах, -t — количество потоков, а -ngl задает, сколько слоев переносится на GPU (0 для сервера только с CPU). У не заданных параметров есть значения по умолчанию, а --fit включен по умолчанию для подстройки не заданных аргументов под объем памяти устройства.
В Ollama квантование привязано к тегу, который вы скачиваете, а ollama ls показывает, что именно у вас на диске. Если в реестре нет нужной сборки, импортируйте GGUF самостоятельно. Создайте Modelfile:
FROM ./Meta-Llama-3.1-8B-Instruct-Q4_K_M.gguf
PARAMETER num_ctx 4096Затем выполните сборку и проверьте результат:
ollama create llama31-q4 -f ./Modelfile
ollama lsДлина контекста — это параметр, на котором часто ошибаются. Ollama выбирает значение по умолчанию исходя из доступной VRAM, и сервер без GPU попадает в самую маленькую категорию: 4096 токенов. Если отправить ему документ на 20 000 токенов, лишние токены будут отброшены до того, как модель их увидит, поэтому ответ будет уверенно неверным относительно файла, который она прочитала лишь наполовину. Увеличьте это значение с помощью OLLAMA_CONTEXT_LENGTH в демоне или с помощью PARAMETER num_ctx в Modelfile. Если только одна задача требует большего окна, num_ctx можно задать для каждого запроса, а не для всего сервера, что позволит не расходовать лишний кэш на все остальные задачи, выполняемые демоном. У llama.cpp также нет значений по умолчанию, которым стоит доверять. Явно задавайте -c и знайте, что именно вы установили.
Арифметика памяти, о которой обычно умалчивают
Файл модели — это не единственная статья расходов. KV cache (кэш ключей и значений) хранит по одной записи на каждый слой для каждого токена контекста, и его объем растет вместе с диалогом.
Рассчитаем это для Llama 3.1 8B. Модель имеет 32 слоя, 8 голов ключей/значений и размерность головы 128. Каждый токен сохраняет ключ и значение по 2 байта каждое в формате f16, итого 2 x 8 x 128 x 2 = 4096 байт на слой. Для 32 слоев это составляет 128 KiB на токен. Таким образом, контекст в 4096 токенов требует 512 MiB, а контекст в 32,768 токенов — 4 GiB.
Следовательно, модель Q4_K_M 8B с контекстом 4k требует примерно 4.58 GiB для весов, плюс около 0.5 GiB для кэша, плюс ресурсы самого рантайма. Она не поместится в 4 GiB RAM. Она поместится в 8 GiB с запасом для работы. Увеличьте контекст до 32k на той же машине с 8 GiB, и один только кэш поглотит весь свободный объем. Отслеживайте использование в реальном времени с помощью free -h во время загрузки модели и не доверяйте оценкам, которые не проверили самостоятельно. Если вы подбираете конфигурацию для моделей значительно больше 8B, та же арифметика, примененная для модели 27B на VPS только с CPU, показывает, что на самом деле вмещает каждый уровень от 8 до 64 GB.
Ollama умножает эти показатели. Параметр OLLAMA_NUM_PARALLEL по умолчанию равен 1, и объем памяти, необходимый модели, масштабируется пропорционально этому числу, умноженному на длину контекста. Увеличьте оба параметра одновременно, и демон незаметно потребует в несколько раз больше RAM, чем вы ожидали. Эта же арифметика определяет ваш предел по количеству одновременных пользователей, так как каждый параллельный запрос требует свою долю KV cache, что и является причиной, по которой сервер, работающий нормально для одного человека, зависает при пяти.
Ось 2: демон, которым вам предстоит управлять
Скрипт установки Ollama создает unit-файл systemd, создает системного пользователя ollama и включает службу. Вы получаете управление жизненным циклом без необходимости писать его самостоятельно. Конфигурация осуществляется через systemd:
sudo systemctl edit ollama[Service]
Environment="OLLAMA_CONTEXT_LENGTH=8192"
Environment="OLLAMA_KEEP_ALIVE=30m"sudo systemctl daemon-reload
sudo systemctl restart ollama
journalctl -e -u ollamaOLLAMA_KEEP_ALIVE имеет большее значение на CPU VPS, чем где-либо еще. Модели по умолчанию удерживаются в памяти в течение 5 минут, после чего выгружаются. Следующий запрос вынуждает систему снова загружать весь файл перед ответом. Если ядро все еще удерживает файл в page cache, это происходит быстро, но только свободная оперативная память позволяет это сделать. Как только другие задачи вытеснят данные, файл будет считываться с диска, поэтому перезагрузка 4.58 GiB превращает двухсекундный ответ в тридцатисекундный на медленных накопителях. Длительный keep-alive устраняет задержку, но постоянно занимает RAM. Оба варианта имеют свою цену. Выберите тот, который менее критичен. Если вы решите, что модель должна оставаться в памяти постоянно, настройка keep_alive для сохранения модели во время простоя и после перезагрузок займет пару строк и избавит вас от необходимости прогревать модель вручную после каждого перезапуска сервера.
llama.cpp не предоставляет демона или системного пользователя, поэтому вы настраиваете их самостоятельно. Из каталога llama.cpp, в котором вы выполняли сборку, установите бинарный файл и его библиотеки в /usr/local, создайте пользователя llama и предоставьте ему копию модели:
sudo cmake --install build
sudo ldconfig
sudo useradd --system --no-create-home --shell /usr/sbin/nologin llama
sudo install -d -o llama -g llama /srv/models
sudo install -o llama -g llama -m 644 ~/models/Meta-Llama-3.1-8B-Instruct-Q4_K_M.gguf /srv/models/model-Q4_K_M.ggufЕсли вы использовали архив с релизом вместо сборки из исходного кода, укажите ExecStart путь к llama-server внутри него, так как архив хранит библиотеки рядом с бинарным файлом. Затем создайте unit-файл /etc/systemd/system/llama-server.service:
[Unit]
Description=llama.cpp server
After=network-online.target
[Service]
ExecStart=/usr/local/bin/llama-server -m /srv/models/model-Q4_K_M.gguf -c 4096 -t 4 --host 127.0.0.1 --port 8080
Restart=always
RestartSec=3
User=llama
[Install]
WantedBy=multi-user.targetВключите его с помощью sudo systemctl enable --now llama-server. Процесс будет удерживать модель в памяти в течение всего времени своей работы. По умолчанию ничего не выгружается при простое, но добавление --sleep-idle-seconds включает автоматическую выгрузку и загрузку без остановки службы. Если написание unit-файлов для вас в новинку, это делается по тому же шаблону, что и запуск собственных служб под управлением systemd на VPS.
Ось 3: API, с которым будет взаимодействовать ваше приложение
Эта ось значительно сузилась. Оба проекта теперь поддерживают формат чата OpenAI, поэтому большинство клиентских библиотек работают с любым из них после простой смены базового URL.
Ollama прослушивает порт 127.0.0.1:11434. Его совместимый с OpenAI маршрут — http://localhost:11434/v1/chat/completions, а параллельно он предоставляет собственный API по адресу /api/chat. Также документирован маршрут, совместимый с Anthropic. Ни один из этих маршрутов не позволяет модели самостоятельно искать информацию. Поэтому, если приложению нужны ответы, содержащие более новые сведения, чем данные обучения модели, предусмотрите подключение веб-поиска через API Ollama, Open WebUI или короткий цикл вызова инструментов.
curl -X POST http://localhost:11434/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{"model": "llama31-q4", "messages": [{"role": "user", "content": "Say this is a test"}]}'При запуске с указанными выше флагами llama-server ожидает запросы на 127.0.0.1:8080. По умолчанию он теперь использует порт 9931 (проверено 27 октября 2026 года), поэтому сохраняйте --port в командной строке, если ваше приложение ожидает 8080. Он обслуживает /v1/chat/completions, /v1/completions и /v1/embeddings, а также собственный эндпоинт /completion и встроенный веб-интерфейс. Он также предоставляет операционные маршруты, которых нет в Ollama: /health для проверки готовности (readiness probe), /props для настроек загруженной модели, /slots для отслеживания состояния каждого слота запросов и /metrics в формате Prometheus после добавления --metrics, так как этот эндпоинт по умолчанию отключен. Если вы планируете мониторить этот сервис, это различие, вероятно, станет решающим фактором.
Ни один из серверов не включает аутентификацию автоматически. Оба по умолчанию привязаны к loopback-интерфейсу, и это оправдано. Обращайтесь к ним через SSH-туннель или из-за reverse proxy, и никогда не открывайте порты 11434 или 8080 для доступа из Интернета.
На что реально способен VPS только с CPU
VPS без GPU медленно запускает небольшие модели. Это честное резюме, а полезная часть заключается в понимании границ возможностей. Проведите измерения, прежде чем проектировать что-либо на этой основе:
llama-bench -m ~/models/Meta-Llama-3.1-8B-Instruct-Q4_K_M.gguf -p 512 -n 128Столбец pp — это скорость обработки промпта, а столбец tg — скорость генерации токенов, оба значения указаны в токенах в секунду. На тарифе с общим vCPU модель 8B в квантовании Q4_K_M обычно выдает значения tg в пределах нескольких единиц. Обработка промпта — наиболее затратная часть: весь промпт обрабатывается до появления первого выходного токена, поэтому длинный системный промпт добавляет ожидание к каждому запросу. Длину ответа можно контролировать, и это важно: при скорости три токена в секунду модель, которая генерирует 600 токенов, занимает ресурсы сервера на 200 секунд — более трех минут только на генерацию. Поэтому ограничение вывода через num_predict — самый простой способ предотвратить таймаут из-за слишком длинного ответа.
На CPU можно использовать: модели от 1B до 4B для классификации, извлечения данных, кратких резюме или маршрутизации. Ответы приходят за секунды, а объем памяти соответствует стандартному тарифу. Пример работы с моделью такого размера, а не диапазона, приведен в статье Nemotron 3.5 Lightning: загрузка и замеры на VPS, где указаны точный тег, реальные требования к RAM и скорость без GPU. Непригодно для CPU: интерактивный чат со скоростью чтения, помощники по программированию, работа с длинными документами или любые задачи с циклом агента, выполняющим множество последовательных вызовов. Цикл, делающий двенадцать вызовов по четыре секунды каждый, потребует минуты перед получением результата. Если вы планировали использовать помощника по программированию, настройка агента на собственную модель поможет определить, в каких задачах небольшая локальная модель выигрывает, а в каких — лучше использовать внешнее API.
Если цифры вас не устраивают, есть два пути. Если проблема в конкурентности (много пользователей одновременно обращаются к одной модели), нужно менять движок, и сравнение Ollama и vLLM для конкурентного обслуживания поможет в этом разобраться. Если проблема в чистой скорости, решение — VPS с подключенным GPU, где показатель -ngl начинает иметь значение. Прежде чем переходить к любому из вариантов, получите базовые показатели самого оборудования, так как пропускная способность диска и памяти влияют на время загрузки не меньше, чем CPU. Повторяемый бенчмарк для VPS стоит потраченного на него часа.
Установка llama.cpp с фиксацией версии сборки
Оба проекта обновляются еженедельно, поэтому фиксируйте версию, которую вы развернули. Официальная команда в одну строку устанавливает текущую сборку:
curl -LsSf https://llama.app/install.sh | sh
llama serve -hf ggml-org/Qwen3.5-0.8B-GGUFЧтобы зафиксировать конкретную сборку, используйте готовый архив (tarball) со страницы релизов. Проект теперь также выпускает версии с семантической нумерацией: v0.7.0 была последней на 27 октября 2026 года, а страница этого релиза указывает на ночную сборку b11669 для бинарных файлов. Версия v0.8.0 вышла 28 октября 2026 года, страница её релиза указывает на ночную сборку b11960. В командах ниже используется b10224, актуальный тег на 2 августа 2026 года; замените его на тот тег, который вы протестировали:
curl -LO https://github.com/ggml-org/llama.cpp/releases/download/b10224/llama-b10224-bin-ubuntu-x64.tar.gz
tar xf llama-b10224-bin-ubuntu-x64.tar.gz
find . -type f -name 'llama-server'Либо соберите этот же тег из исходного кода:
sudo apt update && sudo apt install -y build-essential cmake git libssl-dev
git clone https://github.com/ggml-org/llama.cpp
cd llama.cpp
git checkout b10224
cmake -B build
cmake --build build --config Release -j $(nproc)libssl-dev является документированной зависимостью для функций HTTPS. Компиляция занимает несколько минут и требует больше оперативной памяти, чем доступно на минимальных тарифных планах, поэтому выполняйте сборку на более мощном сервере и копируйте бинарные файлы, если на маленьком сервере не хватает ресурсов.
Установка Ollama с фиксацией версии
curl -fsSL https://ollama.com/install.sh | OLLAMA_VERSION=0.32.5 sh
ollama -vСкрипт считывает OLLAMA_VERSION, поэтому вы можете зафиксировать проверенный релиз вместо того, чтобы устанавливать последнюю версию, вышедшую сегодня. Версия v0.32.5 была опубликована 27 июля 2026 года. Также существует ручной способ установки, если вы не хотите передавать скрипт напрямую в оболочку:
sudo rm -rf /usr/lib/ollama
curl -fsSL https://ollama.com/download/ollama-linux-amd64.tar.zst | sudo tar x -C /usr
ollama -vРучной способ не создает unit-файл systemd и системного пользователя, поэтому их нужно добавить самостоятельно. В руководстве Полное руководство по установке Ollama на VPS этот этап настройки сервиса описан пошагово.
Режимы сбоев и сообщения, которые вы увидите
Ollama отказывается загружать модель. В старых версиях Ollama размер проверялся перед загрузкой, и ollama run возвращал строку такого вида:
Error: model requires more system memory (5.6 GiB) than is available (3.2 GiB)В текущем исходном коде Ollama этого сообщения больше нет (проверено 27 октября 2026 года). Теперь Ollama передает процесс загрузки в llama-server, поэтому модель, которая не помещается в память, вызывает ошибку runner, начинающуюся примерно так:
llama-server reported out-of-memory during startup
llama-server process has terminatedВ любом случае решение одинаково. Перейдите на одну ступень квантования ниже, уменьшите длину контекста или выберите модель меньшего размера.
llama.cpp не выдает ошибку, но работает крайне медленно. По умолчанию llama.cpp использует memory-mapping для GGUF, поэтому файл, размер которого превышает объем RAM, все равно запускается. В этом случае ядро постоянно выгружает и загружает веса с диска при генерации каждого токена, из-за чего скорость падает до секунд на токен, а нагрузка на диск достигает 100 процентов. Используйте --load-mode none, чтобы отключить memory mapping. Эта опция заменила --no-mmap, которая помечена как устаревшая в закрепленной сборке b10224 и больше не встречается в текущих сборках (проверено 29 октября 2026 года). Когда ядро начинает ограничивать процесс, dmesg показывает причину:
Out of memory: Killed process 1234 (llama-server)Файл модели не загружается вовсе. GGUF, созданный для семейства моделей, которое новее вашего движка, вызывает ошибку с указанием архитектуры, которую движок не распознает, где <arch> — это имя, записанное в метаданных файла:
llama_model_load: error loading model: unknown model architecture: '<arch>'Решение заключается в обновлении движка, а не в поиске другого файла. Это цена фиксации версий, и именно поэтому нужно записывать номер сборки. Вы должны знать, с какой версии вы обновляетесь.
API отвечает локально, но не отвечает из вашего приложения. Ollama привязывается к 127.0.0.1:11434, поэтому другой хост получает ошибку connection refused. Устанавливайте OLLAMA_HOST=0.0.0.0:11434 через systemctl edit ollama только в том случае, если порт находится за межсетевым экраном или в частной сети, так как API не имеет встроенной аутентификации.
Первый ответ после паузы очень медленный. Произошла выгрузка модели из-за 5-минутного простоя, и теперь она загружается заново — с диска, если она не сохранилась в page cache. ollama ps, запущенная непосредственно перед запросом, показывает, что ничего не загружено, что подтверждает это. Увеличьте OLLAMA_KEEP_ALIVE.
Что именно стоит запускать?
Запускайте Ollama, если вам нужно автоматическое управление моделями и готовый API-интерфейс, совместимый с OpenAI, без дополнительных настроек. Это оптимальный вариант по умолчанию для первого развертывания и для случаев, когда вы планируете часто менять модели.
Запускайте llama.cpp напрямую, если объем оперативной памяти ограничен и вам необходимо самостоятельно выбирать уровень квантования, если вам нужны /health, /slots и /metrics для мониторинга или если требуется флаг, который не поддерживается в Ollama. Это оправданный выбор для VPS, где модель едва помещается в память, так как параметры для оптимизации использования ресурсов в этом случае требуют ручного подбора, который Ollama выполняет автоматически.
Использование обоих инструментов — обычная практика. Ollama подходит для экспериментов, а llama.cpp — для модели, которую вы переводите в промышленную эксплуатацию и не планируете менять.
FAQ
Ollama — это просто обертка над llama.cpp?
Почти, но эта обертка выполняет реальную работу. В README проекта Ollama указано, что llama.cpp используется в качестве бэкенда для инференса (проверено 27 октября 2026 года). Поверх него Ollama добавляет реестр моделей, шаблоны промптов для преобразования сообщений чата в запрос, набор параметров сэмплирования по умолчанию, демон с функцией выгрузки простаивающих моделей и HTTP API. При сравнении количества токенов в секунду с идентичными настройками вы сравниваете один и тот же движок. Выбор на самом деле идет между уровнями управления.
Что работает быстрее на VPS без GPU?
Они используют один и тот же движок, поэтому при одинаковом файле модели, квантовании, размере контекста и количестве потоков результаты будут близки. Разница, о которой сообщают пользователи, обычно связана с различными настройками по умолчанию (чаще всего это длина контекста и количество потоков), а не с самим движком. Измерьте производительность с помощью llama-bench -m <file> -p 512 -n 128 и сравните столбец tg на своем сервере, прежде чем доверять опубликованным цифрам.
Можно ли использовать свой файл GGUF с Ollama?
Да. Разместите файл на сервере, создайте Modelfile, первой строкой в котором укажите FROM ./your-model.gguf, добавьте необходимые строки PARAMETER, например num_ctx, а затем выполните ollama create your-name -f ./Modelfile. ollama ls отобразит вашу модель в списке наряду с теми, что были загружены из реестра. Это способ использовать квантование, которого нет в официальном реестре.
Сколько оперативной памяти нужно для модели 8B?
Рассчитывайте объем исходя из размера файла, KV-кэша и среды выполнения. Сборка Q4_K_M для Llama 3.1 8B занимает около 4.58 GiB на диске, а контекст в 4096 токенов добавляет примерно 512 MiB кэша, поэтому 8 GiB RAM будет достаточно, а 4 GiB — недостаточно. Кэш масштабируется вместе с контекстом: та же модель при контексте в 32,768 токенов потребует около 4 GiB только под кэш. При работе с Ollama помните, что требования также зависят от OLLAMA_NUM_PARALLEL.