Как развернуть Mistral 7B на GPU-сервере через vLLM

Как развернуть Mistral 7B на GPU-сервере через vLLM

Пошаговая инструкция по развертыванию языковой модели Mistral 7B на облачном GPU-сервере с использованием фреймворка vLLM для создания OpenAI-совместимого API.

В этой инструкции развернем Mistral-7B-Instruct-v0.3 на облачном GPU-сервере и запустим модель через vLLM. На выходе получим инференс-эндпоинт в формате OpenAI-compatible API и проверим его работу запросом из терминала.

Mistral-7B-Instruct-v0.3 — инструкционная версия модели Mistral 7B от Mistral AI. Она предназначена для задач, где модель должна следовать пользовательским инструкциям: отвечать на вопросы, объяснять текст, суммаризировать информацию, генерировать черновики или работать как основа для внутреннего ассистента.

Модель достаточно компактная по меркам LLM: ее удобно использовать для первого self-hosted-развертывания, потому что она не требует нескольких GPU и позволяет быстро проверить полный контур инференса.

В статье мы пройдем путь от создания пустого сервера до первого ответа модели: выберем конфигурацию с одной видеокартой NVIDIA RTX A5000 24 ГБ, проверим, что система видит GPU, подготовим Python-окружение, установим vLLM, запустим модель и отправим тестовый запрос через API.

Сначала соберем воспроизводимый сценарий установки, а после запуска снимем базовые метрики, которые помогают оценить выбранную конфигурацию.

На скриншоте ниже — расчет для одиночного запуска на NVIDIA RTX 3090 24 ГБ. Он нужен как ориентир по требованиям к видеопамяти: при выбранных параметрах модель помещается в 24 ГБ VRAM. В облаке развернем ее на сервере с NVIDIA RTX A5000 24 ГБ и после запуска проверим фактическую занятость VRAM, доступность API, время до первого токена и базовую скорость генерации.

Интерфейс калькулятора видеопамяти для языковой модели Mistral.

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

Подбор сервера

Заходим в панель управления SelectelПродуктыОблачные серверы.

Пустой раздел облачных серверов в панели Selectel.

В разделе серверов кликаем на Создать сервер.  На странице создания сервера выберите локацию: ru-3b, ru-7a или ru-7b. Актуальную информацию о доступности по локациям можно узнать в документации

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

Итак, берем сервер с одной NVIDIA RTX A5000 24 ГБ. Ее достаточно для воспроизводимого запуска модели 7B-класса. Да и по предварительному расчету модель помещается в 24 ГБ VRAM.

Прокрутите страницу вниз до выбора конфигурации и перейдите во вкладку GPU

Выбор конфигурации и расчет стоимости сервера с GPU.

Для системных ресурсов возьмем 8 vCPU, 32 ГБ RAM. На диске лучше оставить запас. 

Помимо операционной системы, место понадобится для Python-зависимостей, кэша Hugging Face, файлов модели и временных файлов, которые могут появляться при установке и первом запуске. Для этой инструкции берем 100 ГБ SSD — этого достаточно для выбранной модели и окружения.

Выбор операционной системы Ubuntu с оптимизированным GPU-драйвером.

В качестве образа используем GPU Optimized Ubuntu. Такой образ сокращает подготовительный этап: сервер уже создается с окружением, рассчитанным на работу с GPU NVIDIA. После подключения останется проверить видеокарту через nvidia-smi, установить зависимости и запустить vLLM.

Если вы подбираете сервер для продакшен-нагрузки, нужно отдельно учитывать длину контекста, число параллельных запросов, требуемую задержку, пропускную способность, параметры vLLM, prefix caching, формат весов и стоимость одного млн токенов.

Подготовка окружения

После создания сервера подключаемся к нему по SSH:


      ssh root@

Проверяем, что сервер видит GPU:


      nvidia-smi
Вывод команды nvidia-smi для пустой видеокарты RTX A5000.
GPU видна корректно: NVIDIA RTX A5000, 24 ГБ VRAM, процессов на GPU пока нет.

После проверки GPU обновляем системные пакеты. Это снижает риск конфликтов при установке Python-зависимостей и вспомогательных утилит:


      apt update && apt upgrade -y

Ставим базовые утилиты:


      apt install -y python3 python3-pip python3-venv python3.12-dev build-essential git \
curl htop tmux

tmux пригодится, если позже вы захотите оставить vLLM работать после разрыва SSH-сессии. В этой инструкции запускаем сервер в активном терминале, чтобы видеть логи загрузки модели. Здесь важно не пропустить python3.12-dev и build-essential. При первом запуске vLLM может компилировать вспомогательные CUDA/Triton-модули.

Создаем рабочую директорию:


      mkdir -p /opt/mistral-vllm
cd /opt/mistral-vllm

Все дальнейшие команды будем выполнять из директории /opt/mistral-vllm.

Создаем виртуальное окружение:


      python3 -m venv venv
source venv/bin/activate

Виртуальное окружение помогает изолировать зависимости vLLM и упростить повторяемость установки.

Обновляем pip командой:


      pip install --upgrade pip

Свежая версия снижает вероятность ошибок при установке крупных ML-библиотек и их зависимостей.

Далее ставим vLLM:


      pip install vllm

vLLM выбран потому, что он подходит для server-side инференса: умеет эффективно обслуживать запросы к LLM, работать с batching и поднимать OpenAI-compatible эндпоинт. 

Создаем переменные окружения

Здесь зададим название модели и API-ключ, которым будем защищать эндпоинт. Ключ можно сгенерировать на сервере и использовать его далее.


      export MODEL_ID="mistralai/Mistral-7B-Instruct-v0.3"
export VLLM_API_KEY=$(openssl rand -hex 32)
echo "$VLLM_API_KEY"

Сохраните значение ключа: оно понадобится позже для тестовых запросов.Не публикуйте реальное значение ключа в скриншотах, логах и репозиториях.

Запускаем vLLM

При запуске сразу учтем настройки инференса:


      vllm serve "$MODEL_ID" \
--host 0.0.0.0 \
--port 8000 \
--api-key "$VLLM_API_KEY" \
--dtype auto \
--max-model-len 32768 \
--enable-prefix-caching

После запуска команда не должна завершиться. vLLM остается работать в foreground и пишет логи в терминал.

Логи инференс-сервера vLLM с метриками производительности.

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

При запуске vLLM может несколько десятков секунд прогревать модель и создавать KV-кэш. После этого API-сервер становится доступным на порту 8000. В логах в процессе также видна информация о модели: 

  • веса модели заняли 13.51 ГБ памяти GPU;
  • доступная память под KV-кэш составила 7,32 ГБ;
  • размер GPU KV-кэш — 59 936 токенов;
  • максимальная конкурентность для запросов длиной 32 768 токенов — 1,83x;

В отдельном SSH-окне можно проверить GPU:


      nvidia-smi
Загрузка видеопамяти процессом VLLM в терминале nvidia-smi.
Появился процесс, память занята моделью.

Проверка API-сервера

После запуска vLLM сначала проверим служебный эндпоинт /health:


      curl -i http://127.0.0.1:8000/health

Если сервер запущен корректно, в ответе будет статус HTTP/1.1 200 OK. Эта проверка показывает, что API-сервер vLLM поднялся и принимает запросы на порту 8000. После этого можно проверять уже модельный эндпоинт /v1/models.

Проверка, что модель доступна через API

Сначала проверим, что vLLM-сервер видит загруженную модель:


      curl -s http://127.0.0.1:8000/v1/models \
 -H "Authorization: Bearer $VLLM_API_KEY" | python3 -m json.tool

В ответе должна появиться модель:

JSON-ответ API с метаданными и конфигурацией модели Mistral.

Осталось проверить модель тестовым запросом. Создадим файл с запросом:


      cat > request.json <<'EOF'
{
"model": "mistralai/Mistral-7B-Instruct-v0.3",
"messages": [
{
"role": "user",
"content": "Return exactly three bullet points that explain what an inference server does."
}
],
"max_tokens": 120,
"temperature": 0
}
EOF

Отправим запрос в эндпоинт /v1/chat/completions:


      curl -sS http://127.0.0.1:8000/v1/chat/completions \
-H "Authorization: Bearer $VLLM_API_KEY" \
-H "Content-Type: application/json" \
-d @request.json | python3 -m json.tool

Если все настроено корректно, API вернет JSON с ответом:

Полный JSON-ответ API со сгенерированным текстом и статистикой токенов.

Тестируем работоспособность

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

  • модель загружена, 
  • OpenAI-compatible API принимает запрос, 
  • авторизация проходит,
  • сервер возвращает сгенерированный ответ. 

Оценку качества модели для конкретного языка или бизнес-сценария нужно проводить отдельно — на целевых промтах и данных.

После smoke-теста измерим базовые метрики инференса через streaming-запрос к OpenAI-compatible эндпоинту. Это не полноценный нагрузочный тест, просто контрольный прогон, который показывает порядок метрик для выбранной конфигурации.

МетрикаЗначение
GPUNVIDIA RTX A5000 24 ГБ
Модельmistralai/Mistral-7B-Instruct-v0.3
Контекст модели32 768 токенов
Prompt tokens42
Completion tokens200
Total tokens242
Total latency4.920 сек
TTFT0,479 сек
Decode time4,441 сек
Output speed
(скорость генерации выходных токенов в одиночном запросе)
45,03 токена/сек

В этом прогоне модель начала отвечать через 0,479 секунды, а затем сгенерировала 200 токенов за 4,441 секунды. Итоговая скорость генерации составила 45,03 токена/сек.

Заключение

В рамках инструкции результат достаточный: модель помещается в 24 ГБ VRAM NVIDIA RTX A5000 и комфортно себя там чувствует. Эндпоинт стабильно отвечает, а TTFT не превышает секунды. Скорость генерации в районе 45 токенов/сек на одиночном запросе — хороший показатель для конфигурации такого уровня.Этого более чем достаточно, чтобы использовать конфигурацию как тестовый стенд, прототип API или демонстрацию self-hosted LLM. 

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

А какие модели вы планируете развернуть в облаке в ближайшее время? Если уже пробовали Mistral в связке с vLLM — делитесь своими замерами и впечатлениями в комментариях.