# SGLang disaggregated prefill: как разделить обработку запроса

Источник: https://modelium.tech/zhurnal/sglang-disaggregated-prefill/

SGLang PD disaggregation разделяет обработку входного текста (prefill) и генерацию ответа (decode) между двумя процессами с отдельными GPU. Между ними передаётся промежуточное состояние модели — KV-кеш; запрос проходит через маршрутизатор. Это инженерная настройка для серверной нагрузки, а не способ ускорить один ответ на домашнем компьютере. Ниже — сверенный с документацией сценарий проверки; Modelium его не запускал.

**Инженерный уровень, не домашний рецепт.** Этот сценарий требует Linux, двух совместимых NVIDIA GPU, CUDA 13-совместимого драйвера и работающей среды Python; необходимость совместимого транспорта NIXL/UCX проверяется на стенде. Минимум RAM, VRAM и места для конкретной нагрузки первоисточники не гарантируют. Инструкция сверена с закреплённой документацией SGLang на ревизии `7760d526` и карточкой Qwen на ревизии `c1899de`; связку PD + Qwen редакция **не запускала**. Установка и первая загрузка модели требуют сети. После подготовки локальные адреса в примере не доказывают отсутствие иных сетевых обращений. [s1](#src-s1) [s3](#src-s3) [s4](#src-s4) [s5](#src-s5)

## Зачем разделять обработку входа и ответа?

Представьте сервис, которому одновременно присылают длинные документы и задают короткие вопросы. **Prefill** — обработка входного текста, **decode** — поочерёдная генерация частей ответа. Когда оба этапа делят один сервер, длинный вход может мешать выдаче текущих ответов. Режим **PD disaggregation** выделяет им разные процессы; между ними нужно передать **KV-кеш**, то есть внутреннее состояние, вычисленное по входу. Эта передача тоже занимает время: выигрыш по задержке заранее не обещан. [s1](#src-s1)

В статье один путь: два процесса SGLang на одной Linux-машине, каждый на своей GPU, и **SGLang Model Gateway** как один адрес для запросов. Это не режим `data parallel`: там обрабатывают независимые запросы на полных копиях модели, а здесь два процесса выполняют разные этапы **одного** запроса. Многомашинный DeepSeek-стенд из документации не требуется для первого теста. [s1](#src-s1) [s2](#src-s2)

## Что подготовить до запуска?

Сначала по [базовому гайду SGLang](/zhurnal/sglang/) запустите **один обычный сервер** с `Qwen/Qwen3-0.6B` и дождитесь готовности, затем проверьте ответ. Именно эту модель приводит официальный Quickstart; у её закреплённой карточки стоит лицензия Apache-2.0. Это не заявление, что Modelium проверил её совместимость именно с PD. Убедитесь через `nvidia-smi`, что видны две совместимые видеокарты; оцените память **запуском**, не по размеру файлов весов. Не заменяйте модель на другую без проверки прав, формата и совместимости. [s3](#src-s3) [s4](#src-s4) [s5](#src-s5)

Для отдельного окружения документация SGLang предлагает `uv venv --python 3.12`, `source .venv/bin/activate`, `uv pip install --prerelease=allow sglang`. Дополнительно для выбранного способа переноса установите `uv pip install nixl` и `uv pip install sglang-router` — пакеты и модель скачиваются из сети. NIXL по умолчанию использует UCX; его совместимость и сетевой транспорт на конкретной машине нужно проверить, а не предполагать. Одинаковые версии SGLang и модельных файлов на обоих процессах обязательны для честного сравнения; показанный ID Hugging Face сам по себе **не фиксирует ревизию загруженных весов**. [s1](#src-s1) [s2](#src-s2) [s3](#src-s3) [s5](#src-s5)

## Как проверить маршрут одного запроса?

- На одной Linux-машине в **первом терминале** с активным окружением запустите обработчик входа: `CUDA_VISIBLE_DEVICES=0 python -m sglang.launch_server --model-path Qwen/Qwen3-0.6B --disaggregation-mode prefill --disaggregation-transfer-backend nixl --host 127.0.0.1 --port 30000 --enable-metrics`. Дождитесь готовности; если NIXL/модель не загрузились, дальше не продолжайте. Имена портов и выбор GPU адаптированы для учебного стенда из официального примера с двумя процессами, а не проверены на железе Modelium. [s1](#src-s1) [s4](#src-s4) [s6](#src-s6)

- Во **втором терминале** активируйте то же окружение и запустите выдачу ответа на другой карте: `CUDA_VISIBLE_DEVICES=1 python -m sglang.launch_server --model-path Qwen/Qwen3-0.6B --disaggregation-mode decode --disaggregation-transfer-backend nixl --host 127.0.0.1 --port 30001 --enable-metrics`. Документация вместо ограничения видимости GPU использует `--base-gpu-id 1`; перед тестом сверьте `nvidia-smi` и журналы обоих процессов — нельзя незаметно запустить оба на одной карте. [s1](#src-s1) [s6](#src-s6)

- В **третьем терминале** активируйте окружение и запустите маршрутизатор: `python -m sglang_router.launch_router --pd-disaggregation --prefill http://127.0.0.1:30000 --decode http://127.0.0.1:30001 --host 127.0.0.1 --port 8000`. Он должен увидеть оба процесса. Порт `8000` здесь открыт только на loopback; публикация интерфейса в сети требует отдельной аутентификации и защиты. [s1](#src-s1) [s2](#src-s2)

- В **четвёртом терминале** направьте короткий запрос **только через **`**8000**`: `curl -sS http://127.0.0.1:8000/v1/chat/completions -H 'Content-Type: application/json' -d '{"model":"Qwen/Qwen3-0.6B","messages":[{"role":"user","content":"Встреча в четверг. Назови день встречи одним словом."}],"max_tokens":64}'`. Проверьте HTTP-ответ: нет поля `error`, а `choices[0].message.content` непустой и соответствует входу. Конкретный ответ модели мы не получали; слово «четверг» — критерий для вашего сравнения, не журнал запуска редакции. [s2](#src-s2) [s4](#src-s4) [s5](#src-s5)

## Как отличить передачу данных от кажущегося успеха?

Сохраните журналы **prefill, decode и маршрутизатора** для одного запроса: проверьте, что не было тайм-аута передачи KV-кеша, а ответ пришёл через `8000`; наличие двух живых процессов само по себе не доказывает передачу. Отдельно снимайте счётчики `/metrics` на `30000` и `30001` до и после теста, если они доступны в установленной версии: ищите операции на обоих процессах, не складывайте разные типы счётчиков как одну скорость. При ошибке handshake/UCX зафиксируйте текст ошибки, версии и доступные устройства; не объявляйте тест успешным из-за одного HTTP 200 от маршрутизатора. [s1](#src-s1) [s2](#src-s2) [s6](#src-s6)

Чтобы проверить смысл настройки, сопоставьте на **собственном** стенде время до первого **токена**, интервалы между последующими токенами, долю успешных запросов и задержку целиком при одинаковых модели, длинах входа и ответа, числе клиентов, версии и бюджете GPU. Не принимайте время до HTTP-заголовков за время до первого токена; для этого нужен клиент, который фиксирует поток ответа, либо подходящие метрики вашей версии маршрутизатора. Сравнение одной и двух GPU без указания разного бюджета не доказывает пользу PD. У Modelium нет такого замера. [s1](#src-s1) [s2](#src-s2)

Если одна GPU не видна или нет памяти — возвращайтесь к обычному серверу и меньшей модели. Если не работает NIXL, проверьте UCX/транспорт и совместимость версий; если маршрутизатор не видит обработчик, сверяйте адреса и его журнал. Остановите учебные процессы через `Ctrl+C` в трёх терминалах. **Следующий шаг:** [разобрать метрики каждого SGLang-процесса](/zhurnal/sglang-metrics-prometheus/) до оптимизации. [s1](#src-s1) [s2](#src-s2) [s3](#src-s3)

## Источники

1. [SGLang: PD Disaggregation, закреплённая документация](https://raw.githubusercontent.com/sgl-project/sglang/7760d5264ac16b85392aefb1bf5c13ce38d9632e/docs/docs/advanced_features/pd_disaggregation.mdx) — получено 2026-10-08
2. [SGLang: Model Gateway, закреплённая документация](https://raw.githubusercontent.com/sgl-project/sglang/7760d5264ac16b85392aefb1bf5c13ce38d9632e/docs/docs/advanced_features/sgl_model_gateway.mdx) — получено 2026-10-08
3. [SGLang: Installation, закреплённая документация](https://raw.githubusercontent.com/sgl-project/sglang/7760d5264ac16b85392aefb1bf5c13ce38d9632e/docs/docs/get-started/install.mdx) — получено 2026-10-08
4. [SGLang: Quickstart, закреплённая документация](https://raw.githubusercontent.com/sgl-project/sglang/7760d5264ac16b85392aefb1bf5c13ce38d9632e/docs/docs/get-started/quickstart.mdx) — получено 2026-10-08
5. [Qwen/Qwen3-0.6B: карточка автора, закреплённая ревизия](https://huggingface.co/Qwen/Qwen3-0.6B/resolve/c1899de289a04d12100db370d81485cdf75e47ca/README.md) — получено 2026-10-08
6. [SGLang: аргументы сервера и режим передачи PD](https://raw.githubusercontent.com/sgl-project/sglang/7760d5264ac16b85392aefb1bf5c13ce38d9632e/docs/docs/advanced_features/server_arguments.mdx) — получено 2026-10-08
