vLLM data parallel: две копии модели для одновременных запросов
На странице · 5 разделов
Data parallel в vLLM запускает отдельную копию модели на каждом из двух GPU и распределяет между ними независимые запросы. Это полезно, когда модель уже помещается на одной карте, но нужно обслуживать несколько пользователей; если она не помещается, нужен другой способ распределения. Ниже — сценарий для Linux и двух совместимых NVIDIA GPU, сверенный по документации, но не воспроизведённый редакцией.
Инженерный сценарий, не домашний рецепт. Нужны Linux, два совместимых NVIDIA GPU (видеокарты) и навыки работы с терминалом. Сведения сверены с документацией vLLM на Git-ревизии
a5105dbи карточкой Qwen на ревизииa09a354; Modelium не запускал сервер или модель. Для установки и первого скачивания весов нужна сеть. Запросы к127.0.0.1после подготовки идут на локальный API (адрес сервера для запросов), но без отдельного сетевого теста это не доказательство полностью офлайн-системы. s1 s3 s5
Зачем нужны две копии модели?
Представьте двух сотрудников, которые одновременно просят локального помощника кратко изложить разные заметки. Data parallel (DP) запускает две копии одной модели и направляет независимые запросы в разные рабочие процессы; с --data-parallel-size 2 у сервера один адрес API и внутреннее распределение. Это вариант для модели, которая уже помещается на одном GPU. Если веса и рабочий контекст не помещаются на одной карте, tensor parallel (TP) делит одну копию между картами: это другая задача. s1 s2
Что понадобится перед запуском?
Для этого маршрута нужны Linux, Python 3.10–3.13, uv, две видимые NVIDIA CUDA-карты с compute capability от 7.5 и совместимые драйверы. Размер видеопамяти, оперативной памяти и свободного диска для этой пары модель + нагрузка источники не задают универсальным минимумом: выясните его в однокарточном пробном запуске, не выводите из названия модели или размера файла. Если одной карте не хватает памяти, не переходите сразу к DP=2 — сначала разберите TP или выберите меньшую модель. s2 s3 s4
Для примера выбрана конкретная instruction-модель Qwen/Qwen2.5-7B-Instruct; карточка автора рекомендует vLLM и помечает лицензию Apache-2.0. Зафиксированная ревизия карточки — a09a35458c702b33eeacc393d103063234e8bc28, но команда с именем репозитория не закрепляет скачиваемые веса: для повторяемого измерения укажите локальный snapshot нужной ревизии и запишите её вместе с версией vLLM и драйвера. Не публикуйте токены доступа или документы пользователей. s5
Как получить первый ответ с двумя репликами?
- Проверьте обе карты командой
nvidia-smi --query-gpu=index,name,memory.total --format=csv. Должны появиться две строки с ожидаемыми устройствами; если карта не видна, остановитесь до установки модели. Сверьте драйвер и CUDA с базовым руководством vLLM и документацией установки. s3 s4 - В отдельной рабочей папке установите
uvпо его документации, затем выполнитеuv venv --python 3.12 --seed,source .venv/bin/activate,uv pip install vllm --torch-backend=autoиvllm --version. Последняя команда должна вывести реально установленную версию; не считайте совпадение Git-ревизии документации и версии пакета гарантированным. s3 s4 - Сначала проверьте, что выбранный checkpoint работает на одной карте и хватает памяти:
CUDA_VISIBLE_DEVICES=0 vllm serve Qwen/Qwen2.5-7B-Instruct --host 127.0.0.1 --max-model-len 2048. Дождитесь готовности API, откройтеhttp://127.0.0.1:8000/v1/modelsи убедитесь, что ID модели присутствует. Сокращённый контекст — настройка первого теста, а не заявленный минимум памяти. Остановите серверCtrl+Cперед следующим шагом. Если одна копия не загрузилась, этот DP-сценарий пока не подходит. s2 s3 - Теперь запустите
CUDA_VISIBLE_DEVICES=0,1 vllm serve Qwen/Qwen2.5-7B-Instruct --data-parallel-size 2 --host 127.0.0.1 --max-model-len 2048. Ожидайте готовности того же/v1/modelsи двух рабочих движков в журнале;--data-parallel-size 2создаёт две реплики и один входной HTTP-порт. При иной версии сначала проверьтеvllm serve --help; модели с MoE-экспертами могут вести себя сложнее, чем этот пример с обычной моделью. s1 s3 - Во втором терминале отправьте короткий запрос:
curl -sS http://127.0.0.1:8000/v1/chat/completions -H 'Content-Type: application/json' -d '{"model":"Qwen/Qwen2.5-7B-Instruct","messages":[{"role":"user","content":"Заметка: Во вторник Оля отправит список вопросов. Назови человека и действие, без придуманной даты."}],"max_tokens":80}'. Ожидается JSON с непустымchoices[0].message.content; сверьте имя и действие с заметкой, а не принимайте наш ожидаемый смысл за реально полученный редакцией ответ. Один запрос показывает только доступность API, не распределение нагрузки. s3 s5
Как проверить распределение, а не только два процесса?
Пока сервер запущен, сохраните исходный снимок curl -sS http://127.0.0.1:8000/metrics -o metrics-before.txt. Из второго терминала на том же Linux-компьютере отправьте четыре одновременных запроса: for i in 1 2 3 4; do curl -sS http://127.0.0.1:8000/v1/chat/completions -H 'Content-Type: application/json' -d '{"model":"Qwen/Qwen2.5-7B-Instruct","messages":[{"role":"user","content":"Назови один шаг проверки локального ответа."}],"max_tokens":80}' -o "reply-$i.json" & done; wait. Должны появиться четыре файла reply-1.json…reply-4.json с непустым полем choices, если запросы завершились успешно. Это лишь малый учебный опыт: при коротких запросах он может не успеть загрузить обе реплики. Затем снимите curl -sS http://127.0.0.1:8000/metrics -o metrics-after.txt. Сравните ряды по индексу движка, особенно счётчик vllm:request_success_total, до/после для обоих индексов; также смотрите процессы и память обеих карт. Проверьте фактические имена меток в установленной версии. Если оба индекса не видны или растёт только один, не объявляйте распределение доказанным: повторите на достаточной одновременной нагрузке с руководством по бенчмарку ниже. Две аллокации GPU доказывают загрузку, но не равномерную маршрутизацию. s1 s3 s6
Затем сравните DP=1 и DP=2 на одной модели, одинаковом наборе запросов и длине контекста. Зафиксируйте число одновременных клиентов, среднюю и хвостовую задержку, число завершённых запросов и загрузку каждого GPU; для этого есть отдельное руководство по vllm bench serve. Не обещайте удвоения скорости: реальные показатели зависят от памяти, очередей и профиля запросов. Внутренний балансировщик vLLM учитывает выполняемые и ожидающие запросы; лимит --max-num-seqs задаётся на каждую реплику, а ограничения общей очереди — на весь API-сервер. s1
Если тест не получился
- Нет второго GPU в
nvidia-smiили ошибка CUDA: проверьте видимость устройств, драйвер, совместимость GPU и установленной сборки; Linux-путь NVIDIA не переносите на AMD, Mac или Windows без отдельных инструкций. s3 s4 - Однокарточный запуск завершился ошибкой нехватки памяти: не ожидайте, что DP поделит модель; вернитесь к распределению одной модели между картами или другой модели. s1 s2
/v1/modelsотвечает, но нет генерации: проверьте ID в запросе, JSON-ошибку и журнал. Для сравнения двух режимов не меняйте одновременно модель, контекст и число клиентов. s3
Следующий шаг: сравните задержку при DP=1 и DP=2 на одинаковой нагрузке. Остановите учебный сервер через Ctrl+C; публичный доступ к API отдельно не открывайте без продуманной защиты.
Источники
- vLLM — Data Parallel Deployment, закреплённый Git commit — revision a5105dba05616d74dde5d40267fc500a4422b3db. Получено 07.10.2026.
- vLLM — Parallelism and Scaling, закреплённый Git commit — revision a5105dba05616d74dde5d40267fc500a4422b3db. Получено 07.10.2026.
- vLLM — Quickstart, установка и локальный API — revision a5105dba05616d74dde5d40267fc500a4422b3db. Получено 07.10.2026.
- vLLM — NVIDIA CUDA installation requirements — revision a5105dba05616d74dde5d40267fc500a4422b3db. Получено 07.10.2026.
- Qwen/Qwen2.5-7B-Instruct — карточка автора, закреплённая ревизия — revision a09a35458c702b33eeacc393d103063234e8bc28. Получено 07.10.2026.
- vLLM — Production Metrics, закреплённый Git commit — revision a5105dba05616d74dde5d40267fc500a4422b3db. Получено 07.10.2026.