Ollama на VPS: запускаем небольшие LLM без GPU

Боты, ИИ и автоматизация
Ollama на VPS: запускаем небольшие LLM без GPU

Своя языковая модель на сервере — это приватность (данные не уходят в чужие API), предсказуемые расходы и полный контроль. Ollama сделала запуск LLM почти таким же простым, как установку обычного пакета: одна команда — и модель отвечает по HTTP API. GPU-серверы стоят дорого, но для небольших квантованных моделей на 3–8 миллиардов параметров хватает обычного CPU-сервера с достаточным объёмом RAM. В этой статье честно разберём, что реально работает на процессоре, как это настроить и на какую скорость рассчитывать.

Сразу честно: что даёт CPU без GPU

Начнём с главного, чтобы не было завышенных ожиданий. На GPU у нас нет — вся генерация идёт на процессоре, и это накладывает ограничения:

  • Скорость умеренная. Небольшая квантованная модель на CPU генерирует порядка единиц токенов в секунду — ответ на абзац текста занимает десятки секунд, а не доли секунды, как в облачных API. Точная цифра зависит от модели, квантования и длины контекста.
  • Размер моделей — 3–8B. Модели на 3–8 миллиардов параметров в 4-битном квантовании — рабочий диапазон для CPU. Модели на 30B+ технически могут запуститься при достаточной RAM, но скорость станет непригодной для практики.
  • RAM решает. Квантованная модель целиком загружается в оперативную память. 8B-модель в кванте Q4 занимает около 5 ГБ, плюс контекст, плюс сама система.

Для каких задач этого достаточно: чат-бот с небольшим потоком сообщений, суммаризация текстов по расписанию, классификация и разметка данных, генерация черновиков, локальный ассистент по документации. Для чего не хватит: продакшн-чат с сотнями одновременных пользователей и задачи, где ответ нужен за секунду.

Выбор сервера

Ориентируемся на память и ядра. Берём тариф Ultra за 1500 ₽/мес: 20 vCPU, 32 ГБ RAM, 192 ГБ NVMe — это VPS на KVM-виртуализации в Москве. Почему именно он:

ТарифvCPURAMNVMeЦенаПодходит для LLM?
Start68 ГБ96 ГБ450 ₽Только модели ~3B, впритык
Pro1216 ГБ128 ГБ750 ₽Модели до 7–8B, без запаса
Ultra2032 ГБ192 ГБ1500 ₽Модели 3–8B комфортно, с запасом на контекст

32 ГБ RAM позволяют держать в памяти 8B-модель с большим контекстом и параллельно гонять само приложение — бота, API-обёртку, базу. 20 vCPU дают llama.cpp (движку под капотом Ollama) достаточно потоков для генерации. NVMe важен на этапе загрузки модели с диска в память: файлы по 4–5 ГБ подгружаются быстро. Подробнее о том, как считать память под разные задачи, — в статье сколько RAM нужно серверу.

KVM-виртуализация здесь принципиальна: ресурсы выделены честно, и долгая 100%-я загрузка CPU при генерации — штатный режим, а не повод для санкций, как бывает на контейнерной виртуализации.

Установка Ollama

Сервер выдаётся за 45–60 секунд. Подключаемся по SSH и ставим Ollama официальным скриптом:

curl -fsSL https://ollama.com/install.sh | sh

# Проверяем, что сервис поднялся
systemctl status ollama
ollama --version

Скрипт создаёт systemd-сервис ollama, который слушает 127.0.0.1:11434. По умолчанию API доступен только локально — это правильно, наружу его открывать без аутентификации не стоит.

Полезные переменные окружения задаются через systemd:

systemctl edit ollama

В открывшемся файле:

[Service]
# Сколько моделей держать в памяти одновременно
Environment="OLLAMA_MAX_LOADED_MODELS=1"
# Сколько параллельных запросов обрабатывать
Environment="OLLAMA_NUM_PARALLEL=1"
# Не выгружать модель из RAM 30 минут после запроса
Environment="OLLAMA_KEEP_ALIVE=30m"

На CPU-сервере параллелизм лучше держать равным 1: два одновременных запроса не ускорят друг друга, а замедлят оба. OLLAMA_KEEP_ALIVE избавляет от повторной загрузки модели с диска — первая генерация после простоя иначе будет заметно дольше.

systemctl daemon-reload && systemctl restart ollama

Какие модели брать

Правило для CPU: 4-битное квантование (Q4_K_M — разумный баланс качества и размера) и 3–8 миллиардов параметров. Ориентиры по семействам небольших моделей:

МодельПараметрыRAM (квант Q4)Сильные стороны
llama3.2:3b3B~3 ГББыстрая, хороший общий уровень
phi3:mini3.8B~3–4 ГБРассуждения, код
qwen2.5:7b7B~5 ГБХорошо работает с русским языком
mistral:7b7B~5 ГБУниверсальная рабочая лошадка
llama3.1:8b8B~5–6 ГБКачество ответов, длинный контекст

Загружаем и пробуем:

# Скачает квантованную модель (~5 ГБ) и запустит интерактивный чат
ollama run qwen2.5:7b

# Или без чата — просто скачать заранее
ollama pull llama3.2:3b

# Список локальных моделей и занятого места
ollama list

Практический совет: начните с 3B-модели. Если качество ответов устраивает — вы получили в 1,5–2 раза больше скорости бесплатно. Переходите на 7–8B, только когда маленькая модель ощутимо не справляется с вашей задачей.

Работаем через API

Ollama даёт REST API, совместимый по духу с привычными LLM-API. Проверяем из консоли:

curl http://127.0.0.1:11434/api/generate -d '{
  "model": "qwen2.5:7b",
  "prompt": "Объясни в двух предложениях, что такое реверс-прокси.",
  "stream": false
}'

Из Python удобнее официальная библиотека:

# pip install ollama
import ollama

client = ollama.Client(host="http://127.0.0.1:11434")

response = client.chat(
    model="qwen2.5:7b",
    messages=[
        {"role": "system", "content": "Ты лаконичный технический ассистент. Отвечай по-русски."},
        {"role": "user", "content": "Напиши bash-однострочник: найти 10 самых больших файлов в /var."},
    ],
    options={
        "temperature": 0.3,
        "num_ctx": 4096,   # длина контекста; больше контекст — больше RAM и медленнее
    },
)
print(response["message"]["content"])

Для длинных ответов включайте стриминг — пользователь видит текст по мере генерации, и умеренная скорость CPU ощущается гораздо комфортнее:

stream = client.chat(
    model="qwen2.5:7b",
    messages=[{"role": "user", "content": "Составь чек-лист переезда сайта на новый сервер."}],
    stream=True,
)
for chunk in stream:
    print(chunk["message"]["content"], end="", flush=True)

Эта же связка — основа для практических проектов: можно собрать Telegram-бота с ИИ, который отвечает силами локальной модели, или построить RAG-бота по своим документам — тогда модель будет отвечать на вопросы по вашей базе знаний, а не из общих сведений. Для RAG понадобится векторная база — например, Qdrant для векторного поиска, и 32 ГБ RAM тарифа Ultra как раз позволяют разместить всё на одном сервере.

Тюнинг производительности на CPU

Несколько настроек, которые реально влияют на скорость:

# Число потоков генерации — по числу физически доступных ядер
curl http://127.0.0.1:11434/api/generate -d '{
  "model": "qwen2.5:7b",
  "prompt": "тест",
  "options": {"num_thread": 20, "num_ctx": 2048}
}'
  • **num_thread** — по умолчанию Ollama сама выбирает число потоков, но стоит поэкспериментировать: иногда значение чуть меньше числа vCPU даёт лучший результат, потому что системе тоже нужны ресурсы.
  • **num_ctx** — не ставьте контекст больше, чем нужно задаче. Контекст 8192 вместо 2048 заметно увеличивает потребление RAM и замедляет обработку промпта.
  • Квантование — если модель доступна в нескольких квантах, Q4_K_M почти всегда оптимум для CPU. Q8 качественнее, но в полтора-два раза тяжелее и медленнее.
  • Одна модель в памяти — не держите загруженными несколько моделей, если RAM впритык: выгрузка в swap убьёт скорость полностью.

Мониторить нагрузку удобно через htop (загрузка ядер при генерации должна быть равномерно высокой) и free -h (следите, чтобы не начался swap).

Частые вопросы

Насколько медленно это будет на самом деле?

На CPU небольшая квантованная модель выдаёт порядка единиц токенов в секунду. Абзац ответа — десятки секунд. Для чат-бота с умеренным потоком сообщений, фоновой суммаризации, классификации и ночных батч-задач это рабочий режим. Для сценариев «ответ нужен мгновенно и многим сразу» CPU-сервер не подойдёт — тут либо GPU, либо облачные API.

Можно ли запустить модель на 13B или 30B параметров?

В 32 ГБ RAM 13B-модель в кванте Q4 формально поместится, но скорость генерации упадёт до уровня, при котором пользоваться ей всерьёз тяжело. 30B+ на CPU — только ради эксперимента. Практический потолок для комфортной работы на процессоре — 7–8B.

Хватит ли тарифа Start или Pro вместо Ultra?

На Start (8 ГБ RAM) уместится только ~3B-модель, и почти без запаса под ваше приложение. Pro (16 ГБ) потянет 7–8B, но впритык, особенно с длинным контекстом. Ultra с 32 ГБ RAM и 20 vCPU — вариант, при котором модель, контекст и ваш сервис (бот, API, база) живут на одном сервере без борьбы за память.

Безопасно ли открывать Ollama API наружу?

По умолчанию API слушает только localhost — и так и должно оставаться. У Ollama нет встроенной аутентификации, поэтому наружу его выставляют только через реверс-прокси (nginx) с авторизацией или используют изнутри сервера — из вашего бота или бэкенда.

Есть ли тестовый период, чтобы проверить скорость на моей задаче?

Триала нет. Но сервер выдаётся за 45–60 секунд, помесячная оплата — можно взять Ultra на месяц, прогнать свои промпты на паре моделей и принять решение на реальных цифрах, а не на чужих бенчмарках.

Запустите свою LLM за пару минут

Ollama на CPU — это честный компромисс: умеренная скорость в обмен на приватность, контроль и фиксированную цену без оплаты за токены. Тариф Ultra за 1500 ₽/мес — 20 vCPU, 32 ГБ RAM и 192 ГБ NVMe на KVM в Москве — комфортно тянет квантованные модели 3–8B вместе с вашим приложением. Выдача сервера за 45–60 секунд. Закажите VPS на https://cheap-host.onl/ — и уже через несколько минут ваша первая локальная модель ответит на первый промпт.

Читайте также