SGLang на GPU-сервере: что понадобится
Чтобы развернуть SGLang на GPU-сервере, установите его через uv или возьмите официальный Docker-образ, запустите sglang serve с моделью Hugging Face на 127.0.0.1:30000 под защитой API-ключа и отправляйте запросы в формате OpenAI на /v1. Подключайтесь к серверу через SSH-туннель или публикуйте через TLS-прокси только /v1/. Для GPU NVIDIA нужен драйвер с поддержкой CUDA 13 — серии 580 или новее (Драйверы NVIDIA и CUDA); на AMD MI355X работают образы SGLang для ROCm.
Если при заказе вы выбрали SGLang на шаге «ПО», он уже установлен вместе с выбранной моделью; это руководство описывает, как установить и запустить его самостоятельно. Сравнение SGLang с vLLM, Ollama и llama.cpp — в статье vLLM, Ollama, llama.cpp или SGLang: что выбрать, а о vLLM — в разделе Инференс-сервер. В примерах используются две модели из нашего каталога:
| Модель | Официальные веса | Память GPU (по нашему правилу) | Самый дешёвый сервер (по нашему правилу) |
|---|---|---|---|
| gpt-oss-120b | 65 ГБ, MXFP4 | 78 ГБ | 1× RTX PRO 6000 |
| Qwen3.8 27B | 56 ГБ, BF16 | 67 ГБ; 34 ГБ в FP8 | 1× RTX PRO 6000 |
Правило добавляет к весам 20% на KV-кэш и считает доступными 92% памяти GPU — так же, как на страницах наших моделей, где перечислены все подходящие серверы. Длинным контекстам и большому числу одновременных запросов нужно больше. Оба чекпоинта находятся в свободном доступе; для моделей с ограниченным доступом нужна переменная окружения HF_TOKEN.
Установка SGLang через uv или Docker
Выполняйте команды из этого руководства от имени root. SGLang нужен Python 3.11 или новее (в Ubuntu 22.04 поставляется 3.10), поэтому uv устанавливает Python 3.12 в /opt, откуда его сможет читать служебная учётная запись, которую мы создадим ниже (руководство по установке):
nvidia-smi # в заголовке: CUDA Version 13.0 или выше
curl -LsSf https://astral.sh/uv/install.sh | sh # затем откройте новую оболочку, чтобы uv появился в PATH
export UV_PYTHON_INSTALL_DIR=/opt/uv-python
uv venv --python 3.12 --managed-python /opt/sglang
source /opt/sglang/bin/activate
uv pip install --prerelease=allow sglang
sglang version
Не убирайте --prerelease=allow: некоторые зависимости выходят только в виде предварительных версий, и без этого флага uv версий ниже 0.12.0 молча устанавливает SGLang 0.5.9. Для Docker установите сам Docker и NVIDIA Container Toolkit (Контейнеры) и используйте тег выпуска, а не latest: при проверке 20 октября 2026 г. самым новым был v0.5.22 (теги на Docker Hub).
Запуск сервера командой sglang serve
Создайте API-ключ, разместите кэш моделей на NVMe-диске (Хранилище и данные) и запустите сервер внутри tmux (Доступ по SSH). При первом запуске SGLang скачивает модель:
export SGLANG_API_KEY=$(openssl rand -hex 32)
echo "$SGLANG_API_KEY" # сохраните его для своих клиентов
export HF_HOME=/data/hf
sglang serve --model-path openai/gpt-oss-120b \
--host 127.0.0.1 --port 30000 --api-key "$SGLANG_API_KEY" \
--reasoning-parser gpt-oss --tool-call-parser gpt-oss
Дождитесь строки The server is fired up and ready to roll! в журнале. 127.0.0.1 и порт 30000 — значения по умолчанию: здесь они указаны явно, а в командах ниже опущены. Старая команда python3 -m sglang.launch_server принимает те же аргументы и по-прежнему работает, но теперь рекомендуемая точка входа — sglang serve; sglang serve --help выводит все флаги (аргументы сервера).
В Docker сервер слушает все интерфейсы внутри контейнера; -p 127.0.0.1:30000:30000 привязывает опубликованный порт к loopback-интерфейсу хоста, поскольку правила портов Docker обходят ufw:
docker run -d --name sglang --restart unless-stopped \
--gpus all --ipc=host --shm-size 32g \
-v /data/hf:/root/.cache/huggingface \
-p 127.0.0.1:30000:30000 \
lmsysorg/sglang:v0.5.22 \
sglang serve --model-path openai/gpt-oss-120b --host 0.0.0.0 --port 30000 \
--api-key "$SGLANG_API_KEY" --reasoning-parser gpt-oss --tool-call-parser gpt-oss
docker logs -f sglang
Проверьте из второй оболочки на сервере, экспортировав тот же ключ:
curl -s http://127.0.0.1:30000/v1/models -H "Authorization: Bearer $SGLANG_API_KEY"
curl -s http://127.0.0.1:30000/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $SGLANG_API_KEY" \
-d '{"model": "openai/gpt-oss-120b", "messages": [{"role": "user", "content": "Say hello in five words."}]}'
Поле model должно совпадать с --model-path, если только вы не задали более короткое имя через --served-model-name. С этим API работает любой клиент OpenAI: укажите base_url="http://127.0.0.1:30000/v1" и api_key, равный вашему ключу.
SGLang на нескольких GPU: тензорный параллелизм, параллелизм экспертов и данных
# одна модель, разделённая на 2, 4 или 8 GPU
sglang serve --model-path openai/gpt-oss-120b --tp 2 --api-key "$SGLANG_API_KEY"
# MoE-модель (смесь экспертов): распределить по GPU ещё и экспертов
sglang serve --model-path deepseek-ai/DeepSeek-R1-0528 --tp 8 --ep 8 \
--reasoning-parser deepseek-r1 --api-key "$SGLANG_API_KEY"
# модель помещается на один GPU: по копии на каждый GPU
sglang serve --model-path openai/gpt-oss-20b --dp-size 8 --api-key "$SGLANG_API_KEY"
- Тензорный параллелизм (
--tp) разбивает каждый слой между GPU, которые обмениваются данными на каждом шаге, поэтому сильнее всего выигрывает от NVLink или Infinity Fabric. Если запуск завершается ошибкой «peer access is not supported between these two devices» (на картах PCIe), добавьте--enable-p2p-check. - Параллелизм экспертов (
--ep) размещает экспертов MoE-модели на разных GPU. С бэкендом по умолчанию его размер не может превышать--tp, а DeepEP и другие бэкенды all-to-all требуют равенства этих значений (параллелизм экспертов). Модели DeepSeek-R1-0528 по нашему правилу нужно около 827 ГБ; в сборнике рецептов SGLang её веса FP8 запускаются на 8× H200 или 8× B200. - Параллелизм данных (
--dp-size) запускает несколько копий модели, доступных через один порт. Руководство SGLang по настройке отдаёт ему предпочтение ради пропускной способности, если хватает памяти, а для более крупных конфигураций рекомендует свой Model Gateway.
Проверка топологии и тесты интерконнекта — в разделе Multi-GPU.
Параметры памяти, FP8 и ошибки нехватки памяти
При запуске SGLang резервирует фиксированную долю памяти каждого GPU, --mem-fraction-static, под веса и пул KV-кэша; остальное занимают активации и буферы CUDA-графов. В строке журнала, которая выводится перед готовностью сервера, указаны max_total_num_tokens — размер пула в токенах — и available_gpu_mem: руководство SGLang по настройке советует оставлять свободными 5–8 ГБ и увеличивать долю, если остаётся больше.
| Флаг | Действие | Когда менять |
|---|---|---|
--mem-fraction-static 0.8 | Доля памяти GPU под веса и KV-кэш | Ошибки нехватки памяти: сначала 0,8, затем 0,7 (меньше одновременных запросов) |
--chunked-prefill-size 4096 | Обрабатывает длинные промпты частями по указанному числу токенов | Нехватка памяти на длинных промптах: 4096 или 2048 (префилл медленнее) |
--max-running-requests 64 | Ограничивает число запросов, декодируемых одновременно | Нехватка памяти во время генерации |
--context-length 32768 | Максимум токенов на запрос (по умолчанию — из config.json модели) | Чтобы ограничить длину запросов |
--quantization fp8 | Преобразует веса BF16 в FP8 при загрузке: примерно вдвое меньше памяти | Чекпоинта в FP8 нет |
--kv-cache-dtype fp8_e4m3 | KV-кэш в FP8: примерно вдвое меньше памяти на токен, возможна небольшая потеря точности | Запросы ждут в очереди, потому что пул KV-кэша заполнен |
SGLang рекомендует заранее квантованные чекпоинты, а не преобразование при загрузке: загружайте официальный FP8-чекпоинт от Qwen, Qwen/Qwen3.8-27B-FP8, без --quantization и никогда не добавляйте этот флаг к уже квантованному чекпоинту, такому как gpt-oss-120b (MXFP4) или DeepSeek-R1-0528 (FP8) (квантование). KV-кэш в FP8 работает быстро только с бэкендом внимания (attention backend), который его поддерживает (квантованный KV-кэш). У гибридной модели Qwen3.8 27B есть дополнительные флаги памяти (--mamba-*): на её странице в сборнике рецептов приведены полные команды для H200 и RTX PRO 6000. Ошибка «CUDA error: illegal memory access» может на деле оказаться нехваткой памяти (устранение неполадок).
SGLang и OpenAI API: структурированный вывод, вызов инструментов и рассуждения
Сервер поддерживает API OpenAI Chat Completions и Completions по пути /v1, а также совместимый с Anthropic эндпоинт /v1/messages. Если запустить модель рассуждений с подходящим парсером (reasoning parser), её рассуждения приходят в поле reasoning_content, отдельно от ответа в content; а с парсером вызовов инструментов (tool-call parser) вызовы приходят структурированными, в поле tool_calls, а не в виде сырого текста. Используйте парсеры, указанные на странице каждой модели в сборнике рецептов SGLang:
| Модель | --reasoning-parser | --tool-call-parser |
|---|---|---|
| gpt-oss-120b, gpt-oss-20b | gpt-oss | gpt-oss |
| Qwen3.8 27B | qwen3 | qwen3_coder |
| DeepSeek-R1-0528 | deepseek-r1 | deepseekv3, с шаблоном чата, приведённым на странице модели в сборнике рецептов |
Структурированный вывод ограничивает ответ JSON-схемой, регулярным выражением или грамматикой EBNF; бэкенд по умолчанию — XGrammar:
curl -s http://127.0.0.1:30000/v1/chat/completions \
-H "Content-Type: application/json" -H "Authorization: Bearer $SGLANG_API_KEY" \
-d '{"model": "openai/gpt-oss-120b",
"messages": [{"role": "user", "content": "Capital of France and its population, as JSON."}],
"response_format": {"type": "json_schema", "json_schema": {"name": "city", "schema": {
"type": "object",
"properties": {"name": {"type": "string"}, "population": {"type": "integer"}},
"required": ["name", "population"]}}}}'
SGLang советует также описывать нужный формат в самом промпте. Подробнее: структурированный вывод, парсер вызовов инструментов, парсер рассуждений.
SGLang на AMD MI355X
Для MI355X (288 ГБ памяти на GPU) страница SGLang об AMD рекомендует Docker с готовыми образами для ROCm; хосту нужен только драйвер ядра AMD (ROCm на MI355X). В тегах указаны выпуск, версия ROCm и семейство GPU; mi35x соответствует gfx950. В примечаниях к выпуску v0.5.22 указан тег v0.5.22-rocm10-mi35x; на Docker Hub есть также сборки для ROCm 7.2 (-rocm720-mi35x, -rocm724-mi35x): если контейнер не видит GPU, выберите сборку, ближайшую к версии ROCm на хосте (amd-smi version).
echo 0 > /proc/sys/kernel/numa_balancing # рекомендация со страницы AMD; действует до перезагрузки
docker run -d --name sglang --restart unless-stopped \
--device=/dev/kfd --device=/dev/dri --group-add video \
--ipc=host --shm-size 16g \
--cap-add=SYS_PTRACE --security-opt seccomp=unconfined \
-v /data/hf:/root/.cache/huggingface \
-e SGLANG_USE_AITER=0 \
-p 127.0.0.1:30000:30000 \
lmsysorg/sglang:v0.5.22-rocm10-mi35x \
python3 -m sglang.launch_server --model-path openai/gpt-oss-120b \
--host 0.0.0.0 --port 30000 --api-key "$SGLANG_API_KEY" \
--reasoning-parser gpt-oss --tool-call-parser gpt-oss
Образ по умолчанию включает ядра AITER от AMD (SGLANG_USE_AITER=1). В рецепте для GPT-OSS они отключены для gpt-oss на MI355X; для других моделей оставляйте значение по умолчанию, если на их странице в сборнике рецептов не сказано иное. Флаги --network=host и --privileged со страницы AMD нужны только для RDMA и здесь опущены. --tp и --ep работают так же, как на NVIDIA. Наши страницы моделей предлагают SGLang на MI355X только для моделей с подтверждённой поддержкой ROCm: gpt-oss-20b, gpt-oss-120b и DeepSeek-R1-0528.
Запуск SGLang как службы и безопасный доступ к нему
Чтобы SGLang перезапускался после сбоя или перезагрузки, запускайте его под управлением systemd от имени непривилегированного пользователя (в Docker это делает --restart unless-stopped). Сначала остановите копию, запущенную в tmux. Ключ хранится в файле, доступном только root, и systemd подставляет его вместо ${SGLANG_API_KEY} (systemd.service):
useradd --system --create-home --home-dir /var/lib/sglang --shell /usr/sbin/nologin sglang
mkdir -p /data/hf && chown -R sglang:sglang /data/hf
install -m 600 /dev/null /etc/sglang.env
echo "SGLANG_API_KEY=$SGLANG_API_KEY" > /etc/sglang.env # ключ, созданный выше
cat > /etc/systemd/system/sglang.service <<'EOF'
[Unit]
Description=SGLang server
Wants=network-online.target
After=network-online.target
[Service]
User=sglang
EnvironmentFile=/etc/sglang.env
Environment=HF_HOME=/data/hf
ExecStart=/opt/sglang/bin/sglang serve --model-path openai/gpt-oss-120b \
--host 127.0.0.1 --port 30000 --api-key ${SGLANG_API_KEY} \
--reasoning-parser gpt-oss --tool-call-parser gpt-oss --enable-metrics
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now sglang
journalctl -u sglang -f
SSH-туннель: для вас и небольшой команды
# на вашем компьютере; после этого API доступен по адресу http://localhost:30000/v1
ssh -N -L 30000:127.0.0.1:30000 gpu1
Caddy с TLS: для публичного эндпоинта
Направьте DNS-имя на сервер, установите Caddy из его официального репозитория и перенаправляйте только /v1/. Caddy сам получает и продлевает сертификат, как в руководстве по vLLM:
cat > /etc/caddy/Caddyfile <<'EOF'
llm.example.com {
handle /v1/* {
reverse_proxy 127.0.0.1:30000
}
handle {
respond 404
}
}
EOF
systemctl reload caddy
ufw allow 80,443/tcp
С --api-key SGLang требует ключ на всех маршрутах, кроме /health, /ready и /metrics. Его управляющие маршруты, например для сброса кэша и обновления весов, принимают тот же ключ, если вы не задали дополнительно --admin-api-key (код аутентификации), — ещё одна причина перенаправлять только /v1/. Держите SGLang на 127.0.0.1 за прокси и заменяйте ключ в случае утечки.
Мониторинг и обновление SGLang
curl -s http://127.0.0.1:30000/metrics | grep -E '^sglang:(num_running_reqs|num_queue_reqs|token_usage|cache_hit_rate)'
journalctl -u sglang -f | grep "Decode batch" # #running-req, token usage, #queue-req
nvidia-smi --query-gpu=index,utilization.gpu,memory.used,memory.total --format=csv -l 5
watch -n 2 amd-smi monitor # MI355X
Для /metrics нужен флаг --enable-metrics (метрики для продакшена). Память GPU выглядит заполненной даже в простое: веса и пул KV-кэша резервируются при запуске. Вместо этого следите за token_usage — долей занятого пула KV-кэша — и за очередью: если запросы продолжают ждать, а занятость пула держится выше 0,9, значит, всё упирается в размер пула (помогут больше GPU или KV-кэш в FP8).
Перед обновлением прочитайте примечания к выпускам: в 0.5.20 прекращена поддержка CUDA 12, а 0.5.22 требует Python 3.11 или новее.
uv pip install --python /opt/sglang/bin/python --upgrade --prerelease=allow sglang
/opt/sglang/bin/sglang version
systemctl restart sglang
Чтобы остаться на проверенной версии, замените --upgrade --prerelease=allow sglang на --prerelease=allow "sglang==0.5.22". В Docker удалите контейнер (docker rm -f sglang) и запустите его заново с новым тегом. Модели в /data/hf сохраняются при обновлениях, но не после окончания срока аренды, если он не продлён: тогда диски очищаются.
Нужна помощь с этим руководством?
Расскажите нам о своём GPU, командах, которые вы выполнили, и результате, который получили, через форму обратной связи.
