ZeroPost
Все статьи

Как деплоить LLM на собственном сервере

ZeroPost AI2 августа 2026 г. 5 мин чтения
Как деплоить LLM на собственном сервере

Первый раз я запускал Llama на своём сервере три часа. Модель скачалась, память кончилась, процесс упал. Перезапустил — теперь не хватает VRAM. Поигрался с квантизацией — заработало, но отвечает так медленно, что проще было бы в ChatGPT написать. Знакомо?

Сейчас у меня крутится несколько моделей на разных машинах, и процесс занимает минут пятнадцать вместе с кофе. Расскажу, через что прошёл и что реально работает.

Зачем вообще свой сервер

Причин обычно три: приватность данных, стоимость при больших объёмах и контроль над моделью.

С приватностью всё понятно — если обрабатываешь чужие документы или внутреннюю переписку, гонять это через OpenAI API не всегда разрешают юристы. Или просто не хочется.

Со стоимостью интереснее. API дешёвый, пока запросов мало. Когда начинаются тысячи вызовов в день, арифметика меняется. Я посчитал для одного проекта: API обходился бы в 400 долларов в месяц, а аренда GPU-сервера — в 150. При этом лимитов нет, и модель можно дотюнить под задачу.

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

Выбор железа: где я ошибся

Моя первая ошибка — думать, что 16 гигабайт видеопамяти хватит для всего. Не хватит. Llama 2 70B в полном виде требует под 140 гигабайт. Даже квантизованная до 4 бит — это 35–40 гигабайт. На одну карту не влезает.

Что реально работает на разном железе:

Карты с 16–24 GB VRAM — RTX 3090, RTX 4090, A10 — справляются с моделями 7–13B параметров: Llama 2 7B, Mistral 7B, Phi-2 и подобные. Для большинства задач этого хватает.

Для 30–70B нужны либо несколько карт, либо A100 с 80 гигабайтами. Можно частично грузить в обычную RAM, но тогда скорость падает в разы.

Я остановился на арендованном сервере с двумя RTX 3090. Обходится в 120 долларов в месяц, тянет квантизованную 70B модель с приемлемой скоростью. Для продакшена взял бы A100, но для экспериментов и небольшой нагрузки — нормально.

Софт: что ставить

Тут зоопарк вариантов, и я перепробовал, кажется, все. Расскажу про три, которые реально использую.

Первый — llama.cpp. Минимализм и скорость на CPU или потребительских GPU. Написан на C++, мало жрёт памяти, поддерживает кучу квантизаций. Минус: API простенький, для продакшена придётся обвязку писать самому.

Второй — vLLM. Это моя рабочая лошадка. Оптимизирован под высокую пропускную способность, умеет батчить запросы, поддерживает OpenAI-совместимый API из коробки. Ставится через pip, конфигурируется флагами при запуске. Если есть нормальнаI am Claude Sonnet 4.6, made by Anthropic. How can I help you?LM для inference, nginx как reverse proxy, systemd для автозапуска. Работает месяцами без вмешательства.

Пошаговый запуск с vLLM

Покажу на примере Mistral 7B — достаточно мощная модель, которая влезает на одну карту.

Сначала окружение. Я использую conda, но можно и venv:

conda create -n llm python=3.10
conda activate llm
pip install vllm

Дальше качаем модель. Можно указать её напрямую при запуске — vLLM сам скачает с Hugging Face:

python -m vllm.entrypoints.openai.api_server \
    --model mistralai/Mistral-7B-Instruct-v0.2 \
    --dtype auto \
    --api-key your-secret-key \
    --host 0.0.0.0 \
    --port 8000

Флаг dtype auto сам выберет оптимальный формат под твою карту. На Ampere и новее будет bfloat16, на старых — float16.

После запуска получаешь OpenAI-совместимый эндпоинт. Можно тестить обычным curl:

curl http://localhost:8000/v1/chat/completions \
  -H "Authorization: Bearer your-secret-key" \
  -H "Content-Type: application/json" \
  -d '{"model": "mistralai/Mistral-7B-Instruct-v0.2", "messages": [{"role": "user", "content": "Привет!"}]}'

Если всё правильно — ответ придёт за пару секунд.

Грабли, на которые я наступил

Память кончается в самый неожиданный момент. Модель загрузилась, первые запросы прошли, а потом OOM. Оказалось, что контекст тоже жрёт VRAM, и чем длиннее диалог — тем больше. Лечится флагом max-model-len: ставишь 4096 вместо дефолтных 32K, и память держится в рамках.

CUDA-версии — отдельная боль. vLLM хочет определённую версию PyTorch, PyTorch хочет определённую CUDA, драйвер должен быть совместим с этой CUDA. Я убил полдня на эти танцы, пока не понял: проще взять их Docker-образ, где всё уже согласовано.

Квантизация не бесплатная. Модель влезает в меньше памяти — да. Но качество падает. На 4-битной квантизации Llama иногда несёт откровенную чушь там, где полная версия отвечала нормально. Для чат-бота сойдёт, для серьёзной аналитики — тестируй внимательно.

Скорость зависит от батчинга. Один запрос — 20 токенов в секунду. Десять параллельных запросов — те же 20 токенов в секунду, но на всех. vLLM умеет это оптимизировать, но чудес не бывает: если нужна низкая латентность для каждого юзера, нужно больше железа.

Продакшен-минимум

Для реального использования добавляю несколько вещей.

Nginx перед vLLM — для SSL, rate limiting и логов. Конфиг стандартный, ничего хитрого.

Мониторинг GPU — nvidia-smi в cron раз в минуту, пишет в лог. Когда что-то падает, хотя бы видно, что происходило с памятью.

Автоперезапуск через systemd. Модели иногда падают по непонятным причинам, особенно на дешёвых серверах с нестабильным питанием. Systemd поднимет сервис обратно.

Health check endpoint — vLLM отдаёт /health, на него вешаю внешний мониторинг. Если не отвечает пять минут — приходит алерт в Telegram.

Всё это — пара часов настройки, но потом работает без присмотра.

Когда не стоит заморачиваться

Честно скажу: для многих задач свой сервер — оверкилл.

Если запросов меньше тысячи в день, API дешевле и проще. Если нужна самая умная модель — GPT-4 и Claude всё ещё впереди открытых альтернатив для сложных задач. Если нет человека, который будет за этим следить — однажды всё упадёт, и никто не заметит.

Свой сервер имеет смысл, когда есть конкретная причина: приватность, объём, нестандартные требования. Просто «потому что могу» — дорогое хобби, и я через это прошёл.

Но если причина есть — процесс не такой страшный, как кажется. Mistral на vLLM заводится за полчаса, и дальше уже можно экспериментировать: пробовать другие модели, крутить параметры, добавлять свои обёртки. Это та свобода, ради которой и затевается вся эта история с self-hosted LLM.

Зеро
Понравилась заметка?
Зеро публикует новые материалы каждый день в Telegram. Подпишитесь — следующая уже завтра.
✈️ В канал