Запуск vLLM на GPU: установка, API и Docker
vLLM обслуживает поддерживаемые модели через API и распределяет вычисления на GPU. В этой инструкции используется Qwen/Qwen2.5-7B-Instruct в BF16, контекст 4 096 токенов и одна активная последовательность для первого запуска.
Нужен Linux-инстанс с NVIDIA GPU, SSH и совместимым драйвером. Видеокарта с 24 ГБ — разумный кандидат для этого примера с 7,61 млрд параметров, но не гарантия вместимости, подтверждённая замером. При меньшей VRAM выберите поддерживаемый квантованный checkpoint или вариант Ollama. Только BF16-веса занимают примерно 15,2 ГБ в десятичных единицах.
Установите отдельное окружение
На сервере проверьте nvidia-smi. Если нет uv, установите его по официальной инструкции, затем:
uv venv --python 3.12 --seed .venv-vllm
source .venv-vllm/bin/activate
uv pip install 'vllm==0.30.0' --torch-backend=auto
mkdir -p "$HOME/llm-data/huggingface"
export HF_HOME="$HOME/llm-data/huggingface"
vllm --version
Автоматический выбор PyTorch backend не гарантирует совместимость любой архитектуры и драйвера. Сначала разберите ошибку установки. В контейнере управление драйвером хоста обычно недоступно.
Запустите API с ограничениями
export VLLM_API_KEY="$(python3 -c 'import secrets; print(secrets.token_urlsafe(32))')"
vllm serve Qwen/Qwen2.5-7B-Instruct \
--host 127.0.0.1 \
--port 8000 \
--served-model-name qwen-local \
--dtype bfloat16 \
--max-model-len 4096 \
--max-num-seqs 1 \
--gpu-memory-utilization 0.85
Оставьте терминал открытым. Переменная окружения включает проверку API-ключа; сохраните её значение для клиента до закрытия shell. Не помещайте ключ в открытый репозиторий или скриншот. Первый запуск может долго загружать файлы и выделять память до готовности API.
Лимит контекста включает вход и ответ. --gpu-memory-utilization задаёт бюджет движка, но не резервирует память на уровне системы от других процессов.
Проверьте API на сервере
Во второй shell задайте VLLM_API_KEY с тем же значением:
curl --fail-with-body http://127.0.0.1:8000/v1/models \
-H "Authorization: Bearer $VLLM_API_KEY"
curl --fail-with-body http://127.0.0.1:8000/v1/chat/completions \
-H "Authorization: Bearer $VLLM_API_KEY" \
-H 'Content-Type: application/json' \
-d '{"model":"qwen-local","messages":[{"role":"user","content":"Explain a database index in three sentences."}],"max_tokens":128,"temperature":0}'
Для проверки русского языка замените текст запроса, например на «Объясни индекс базы данных в трёх предложениях». Сохраняйте один и тот же запрос при сравнении конфигураций.
Дождитесь готовности сервера, не перезапускайте его постоянно во время загрузки. Ошибка 401 связана с ключом; ошибка модели — с идентификатором или запросом; отказ подключения — с отсутствующим или ещё не готовым listener.
Подключитесь со своего компьютера
Подставьте SSH-порт, адрес и пользователя из карточки инстанса:
ssh -N -o ExitOnForwardFailure=yes -p SSH_PORT \
-L 127.0.0.1:18000:127.0.0.1:8000 root@GPU_HOST
В клиенте укажите base URL http://127.0.0.1:18000/v1, модель qwen-local и сохранённый ключ. Локальный listener и SSH-туннель позволяют обойтись без публичного порта инференса.
Альтернатива: Docker
Этот путь подходит хосту с работающими Docker, NVIDIA Container Toolkit и доступом контейнеров к GPU. Не запускайте его параллельно с нативным сервером на порту 8000. Сначала задайте VLLM_API_KEY, как выше.
mkdir -p "$HOME/llm-data/huggingface"
docker run --rm --gpus all --shm-size 4g \
-p 127.0.0.1:8000:8000 \
-v "$HOME/llm-data/huggingface:/root/.cache/huggingface" \
-e VLLM_API_KEY \
vllm/vllm-openai:v0.30.0 \
Qwen/Qwen2.5-7B-Instruct \
--served-model-name qwen-local \
--host 0.0.0.0 --port 8000 \
--dtype bfloat16 --max-model-len 4096 \
--max-num-seqs 1 --gpu-memory-utilization 0.85
Внутри контейнера сервер слушает сетевой интерфейс, но Docker публикует порт хоста только на loopback. Bind mount сохраняет кеш после завершения контейнера. При удалении диска инстанса этот кеш тоже исчезнет.
Увеличивайте нагрузку после первого результата
До изменения --max-num-seqs проверьте типичный длинный запрос. Затем постепенно добавляйте параллельные запросы и следите за ошибками и временем ответа. Если не помещаются сами веса, уменьшение контекста не сожмёт их: нужна меньшая модель, поддерживаемое квантование или другое оборудование.
Далее: оценка памяти, диагностика ошибок.
Источники: vLLM quickstart, Docker, ограничение памяти, карточка Qwen.
Готовы запустить?
Запустить GPU-сервер