
Как развернуть LLM на арендованном GPU с vLLM
Запуск Qwen на виртуальной машине с GPU
Чтобы развернуть LLM через vLLM на Qudata.ai, арендуйте виртуальную машину (ВМ) с Linux и NVIDIA GPU. Внутри ВМ запустим Docker-контейнер с Qwen2.5-7B-Instruct и отправим первый запрос к модели через SSH-туннель.
Выберите виртуальную машину до аренды
В каталоге Qudata.ai выберите ВМ с NVIDIA GPU и проверьте, что она поддерживает подключение по SSH. Для примера возьмите одну GPU с поддержкой BF16 и 24 ГиБ видеопамяти. Веса модели займут около 14,2 ГиБ, остальная память понадобится vLLM и запросам. При выборе диска учтите место под образ Docker и файлы модели. Сверьте тип инстанса, GPU и диск до оплаты.
Если вы уже арендовали Docker-инстанс, запустить этот сценарий внутри него нельзя. Чтобы перейти на ВМ, сохраните нужные файлы, удалите Docker-инстанс, когда это позволяют условия аренды, и отдельно арендуйте ВМ. Запущенный Docker-инстанс нельзя преобразовать в ВМ.
Возьмите адрес, имя пользователя и порт из данных ВМ. Подключитесь к ВМ по SSH и выполните команды на самой машине. Для них нужны установленный Docker и NVIDIA Container Toolkit.
nvidia-smi
docker version --format '{{.Server.Version}}'
docker run --rm --gpus all ubuntu:24.04 nvidia-smiПервая команда проверяет драйвер на сервере, третья — передачу GPU в контейнер. Если видеокарта видна только на хосте, проверьте настройку NVIDIA Container Toolkit. Для схемы ниже используйте Docker Engine 28.0.0 или новее и драйвер, совместимый с CUDA 12.9 в выбранном образе vLLM.
Запустите vLLM в Docker
Создайте на ВМ каталог для кэша Hugging Face и запустите контейнер. Тег образа закреплён, чтобы повторный запуск использовал ту же версию vLLM. Порт контейнера публикуется только на loopback-интерфейсе сервера. Дополнительные параметры образа описаны в официальном руководстве vLLM по Docker.
mkdir -p "$HOME/.cache/huggingface"
docker run -d --name qudata-vllm --gpus all --shm-size=2g \
-p 127.0.0.1:8000:8000 \
-v "$HOME/.cache/huggingface:/root/.cache/huggingface" \
vllm/vllm-openai:v0.30.0-cu129 \
--model Qwen/Qwen2.5-7B-Instruct --served-model-name qwen-demo \
--host 0.0.0.0 --port 8000 --dtype bfloat16 \
--max-model-len 4096 --max-num-seqs 4 \
--gpu-memory-utilization 0.90
docker logs --tail 80 -f qudata-vllm--host 0.0.0.0 задаёт адрес внутри контейнера. За доступ снаружи отвечает -p 127.0.0.1:8000:8000. Лимит 4096 включает входные и выходные токены, а --max-num-seqs 4 ограничивает число последовательностей, которые движок обрабатывает одновременно. Первый запуск скачивает веса. Когда сервер готов, выйдите из просмотра журнала с помощью Ctrl+C. Контейнер продолжит работу.
Отправьте первый запрос через SSH
Откройте отдельный терминал на своём компьютере. Замените user@your-gpu-host данными для подключения к ВМ. Если Qudata указала отдельный SSH-порт, добавьте -p с этим номером. Оставьте туннель открытым и выполните запросы в другом локальном терминале.
ssh -N -o ExitOnForwardFailure=yes \
-L 127.0.0.1:18000:127.0.0.1:8000 user@your-gpu-hostcurl -fsS http://127.0.0.1:18000/v1/models
curl -fsS http://127.0.0.1:18000/v1/chat/completions \
-H 'Content-Type: application/json' \
-d '{"model":"qwen-demo","messages":[{"role":"user",
"content":"Объясни, зачем нужен KV-кэш, одним предложением."}],
"max_tokens":64,"temperature":0}'В первом ответе найдите модель qwen-demo, во втором — текст в choices[0].message.content. Для клиента, который поддерживает Chat Completions, базовый URL будет http://127.0.0.1:18000/v1. Этот стенд рассчитан на доверенный сервер и доступ по SSH. Для общего доступа настройте аутентификацию, TLS и ограничения запросов на входном прокси.
Если модель не запускается или заканчивается память
Посмотрите журнал контейнера и вывод nvidia-smi. Если сервер сообщает, что контекст не помещается в KV-кэш, начните с --max-model-len 2048. Если память заканчивается под нагрузкой, снизьте --max-num-seqs до 1 и увеличивайте лимит после замеров. Чтобы применить параметры, остановите и удалите тестовый контейнер командами docker stop qudata-vllm и docker rm qudata-vllm, затем запустите его снова. Кэш в смонтированном каталоге сохранится. Если движок не может загрузить сами веса, проверьте занятость GPU и выберите меньшую модель, совместимый квантизованный чекпоинт или GPU с большей памятью.
Если curl не соединяется, сначала проверьте curl -fsS http://127.0.0.1:8000/v1/models в SSH-сеансе на сервере. Если там запрос проходит, проверьте туннель и локальный порт. По окончании теста остановите контейнер командой docker stop qudata-vllm и отдельно завершите аренду ВМ в Qudata, если он больше не нужен. Сохраните необходимые данные перед завершением. На Qudata.ai также можно арендовать LLM вместе с GPU и подключиться к готовому OpenAI-совместимому API.