Как развернуть 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 7B v0.3 на видеокарте NVIDIA RTX 3090 с 24 ГБ видеопамяти. В левой части интерфейса заданы входные данные, включая максимальную длину контекста в 32 768 токенов и тип квантизации BF16. Справа отображаются результаты вычислений, согласно которым общий объем занятой VRAM составит 20.9 ГБ, что равняется 87% от емкости GPU и оценивается системой как хороший показатель. Здесь же приведена подробная разбивка расхода памяти на веса модели, KV-кэш и активации, а также прогнозные метрики производительности со скоростью генерации 64.6 токена в секунду.

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

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

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

Скриншот показывает пустой раздел «Облачные серверы» в панели управления хостинг-провайдера Selectel для региона Москва. В верхней части интерфейса расположены поисковая строка, фильтры по регионам и пулам, а также кнопка «Создать сервер». По центру страницы находится фирменная иллюстрация с тираннозавром, выглядывающим из картонной коробки, под которой отображается информационный текст «В регионе Москва пока нет серверов». В самом низу по центру расположена большая кнопка «Создать сервер», предлагающая пользователю развернуть виртуальную машину.

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

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

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

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

Скриншот панели управления Selectel демонстрирует процесс выбора конфигурации облачного сервера во вкладке «GPU». На левой панели активен блок фиксированной конфигурации с одной видеокартой NVIDIA RTX A5000 (24 ГБ VRAM), 8 виртуальными ядрами (vCPU) и 32 ГБ оперативной памяти (RAM). Справа в окне калькулятора цен отображается детальная почасовая детализация стоимости каждого компонента: процессора, оперативной памяти, видеокарты, сети и универсального SSD-диска объемом 100 ГБ. Итоговая стоимость выбранной конфигурации составляет 91,94 рубля в час, а сразу под расчетом находятся кнопки «Создать сервер» и «Отменить».

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

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

Скриншот из панели управления Selectel демонстрирует шаг выбора операционной системы в блоке «Источник» при создании сервера. В сетке доступных дистрибутивов выделена плитка ОС Ubuntu, а ниже, в выпадающем списке «Версия», выбран готовый образ Ubuntu 24.04 LTS 64-bit с предустановленным драйвером GPU Driver 580 Open. Рядом с версией отображается фиолетовый маркер «GPU optimized», а под ней расположено синее информационное окно, сообщающее автоматическом переключении на образ, оптимизированный для работы с видеокартами.

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

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

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

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


      ssh root@

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


      nvidia-smi
Скриншот показывает вывод консольной утилиты nvidia-smi в терминале Linux, отображающий текущее состояние графического процессора NVIDIA. В верхней строке таблицы указана версия драйвера (580.126.09) и версия CUDA (13.0). Основная часть таблицы содержит данные о видеокарте NVIDIA RTX A5000: она работает при температуре 30°C, вентиляторы вращаются на 30%, текущее энергопотребление составляет 57W из 230W, а утилизация GPU равна 2%. В графе «Memory-Usage» указано, что занято 0 из 24564 МиБ видеопамяти, а нижний блок «Processes» пуст и содержит строку «No running processes found», что подтверждает отсутствие активных задач на видеокарте.
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 (процесс APIServer с PID 20771) в консоли терминала. В логах фиксируется обработка входящих HTTP-запросов и периодический вывод технических метрик производительности движка Engine 000.

Среди записей видны два успешных сетевых POST-запроса к эндпоинту генерации текста /v1/chat/completions с локального адреса 127.0.0.1, завершившихся со статусом 200 OK (выделено зеленым цветом). Строки с метриками отображают скорость обработки промта (Avg prompt throughput), скорость генерации токенов (Avg generation throughput), число активных и ожидающих запросов, процент использования KV-кэша видеокарты, а также эффективность кэширования префиксов (Prefix cache hit rate), которая на скриншоте колеблется в диапазоне от 20.2% до 40.7%.

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
Скриншот показывает вывод консольной утилиты nvidia-smi, фиксирующий состояние графического процессора NVIDIA после запуска инференс-сервера. В отличие от предыдущего холостого состояния, здесь в нижнем блоке «Processes» запущен активный вычислительный процесс VLLM::EngineCore (PID 20812) с типом нагрузки «C» (Compute). Данный процесс практически полностью занял доступную память видеокарты NVIDIA RTX A5000: в графе «Memory-Usage» отображается расход 22 380 МиБ из общих 24 564 МиБ VRAM. При этом текущая температура графического чипа составляет всего 26°C, энергопотребление находится на уровне 15W, а общая утилизация ядер GPU временно равна 0%, так как модель загружена в память и ожидает входящих запросов на генерацию.
Появился процесс, память занята моделью.

Проверка 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, представляющий ответ от OpenAI-совместимого API инференс-сервера vLLM с метаданными о доступной нейросети. В текстовом объекте содержатся пары «ключ-значение», где в полях id и root указан точный идентификатор загруженной языковой модели — mistralai/Mistral-7B-Instruct-v0.3. Кроме того, в структуре данных зафиксирован владелец сервиса ("owned_by": "vllm") и критически важный технический параметр конфигурации инференса — "max_model_len": 32768, который определяет максимальную длину контекста (в токенах) для обрабатываемых моделью запросов.

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


      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 с ответом:

Скриншот демонстрирует полный ответ от OpenAI-совместимого API инференс-сервера vLLM в формате JSON, полученный в результате тестового запроса (smoke-теста) к модели mistralai/Mistral-7B-Instruct-v0.3.

Внутри массива choices в поле content содержится сгенерированный нейросетью ответ на английском языке, оформленный в виде трех нумерованных пунктов, которые детально объясняют назначение и функции инференс-сервера в промышленной среде разработки. В нижней части структуры данных расположен блок статистики usage, отражающий точный расход вычислительных ресурсов на этот запрос: на обработку промта ушло 17 токенов (prompt_tokens), модель сгенерировала ровно 120 токенов (completion_tokens), а суммарный объем операции составил 137 токенов (total_tokens). Ограничение генерации подтверждается параметром "finish_reason": "length".

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

Для 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 — делитесь своими замерами и впечатлениями в комментариях.