从0到跑通:SGLang部署与高并发调优的完整路径
【免费下载链接】sglangSGLang is a high-performance serving framework for large language models and multimodal models.项目地址: https://gitcode.com/GitHub_Trending/sg/sglang
凌晨高峰,线上LLM服务的TTFT(首token延迟)从200ms涨到8s,新请求开始排队甚至超时。你排查后发现瓶颈不在模型本身,而在推理服务框架的调度、显存分配和并发配置上。SGLang就是干这个的:面向LLM和多模态模型的高性能serving框架,RadixAttention前缀缓存、连续批处理、PD分离这些能力开箱即用。这篇文章覆盖从零部署到显存/延迟调优,适用于NVIDIA GPU为主的单机到多机场景。
五种部署路径怎么选
| 路径 | 适用场景 | 复杂度 | 关键依赖 | 推荐程度 |
|---|---|---|---|---|
| pip/uv安装 | 开发验证、单机调试 | 低 | CUDA环境 | 起步首选 |
| Docker容器 | 生产单机、环境一致性 | 低 | Docker + GPU驱动 | 生产首选 |
| 源码编译 | 定制kernel、性能极限优化 | 中 | CUDA/ROCm工具链 | 有定制需求再上 |
| Kubernetes | 多副本、自动扩缩容 | 高 | K8s集群 | 多副本生产 |
| CPU镜像 | 无GPU环境、纯CPU推理 | 中 | Intel Xeon | 特殊场景 |
起步阶段直接走pip或Docker,源码编译和K8s只有在遇到明确瓶颈或规模要求时再考虑。
最小可行路径:pip安装到服务可用
三步跑通,每步都有明确目的。
# 安装:uv比pip快,[all]带上推理所需依赖 pip install --upgrade pip pip install uv uv pip install "sglang[all]>=0.5.3rc0"# 起服务:默认端口30000,/health端点用于确认就绪 python -m sglang.launch_server \ --model-path meta-llama/Llama-3.1-8B-Instruct \ --host 0.0.0.0 \ --port 30000# 压测:100条随机请求验证吞吐和延迟 python -m sglang.bench_serving \ --dataset-name random \ --random-input-len 1024 \ --random-output-len 1024 \ --num-prompts 100 \ --request-rate 10如果安装时卡在CUDA编译环节,设置export CUDA_HOME=/usr/local/cuda-<你的版本>再重试,这是编译kernel时找不到nvcc的典型原因。安装细节见 安装文档。
分场景进阶
Docker生产部署
仓库自带的compose文件已经配好健康检查、GPU预留、--ipc=host和内存锁定,直接基于它改模型路径即可,不要自己从零写:
# docker/compose.yaml 关键配置 services: sglang: image: lmsysorg/sglang:latest restart: always ipc: host ulimits: memlock: -1 healthcheck: test: ["CMD-SHELL", "curl -f http://localhost:30000/health || exit 1"] deploy: resources: reservations: devices: - driver: nvidia count: 1 capabilities: [gpu]memlock: -1是NCCL多卡通信的硬性要求,漏掉它多卡会报IB/NCCL错误。
单卡GPU延迟优化
# 单卡调优:CUDA图+FP8 KV缓存降TTFT python -m sglang.launch_server \ --model-path meta-llama/Llama-3.1-8B-Instruct \ --attention-backend flashinfer \ --enable-cuda-graph \ --kv-cache-dtype fp8_e5m2FP8 KV缓存把KV显存占用砍半,换来的容量提升通常比精度损失更划算;fp8_e5m2和fp8_e4m3都支持,数值范围敏感的场景用e4m3。
多卡张量并行
# 2卡TP:模型切到2个GPU,attention默认后端即可 python -m sglang.launch_server \ --model-path meta-llama/Llama-3.1-8B-Instruct \ --tp 2 \ --host 0.0.0.0 --port 30000CPU服务器
用仓库里的专用Dockerfile构建,别用通用镜像硬跑:
# 构建Xeon专用镜像并启动 git clone https://gitcode.com/GitHub_Trending/sg/sglang cd sglang/docker docker build -t sglang-cpu:main -f xeon.Dockerfile .CPU场景延迟天然比GPU高一个量级,别按GPU指标设预期。
接入Prometheus监控
examples/monitoring下有现成的compose配置,Prometheus直接抓30000端口的metrics,cd examples/monitoring && docker-compose up -d即可,配置见 examples/monitoring/prometheus.yaml。
关键参数速查
| 参数 | 作用 | 常见取值 | 踩坑提示 |
|---|---|---|---|
--tp | 张量并行卡数 | 1/2/4/8 | 必须整除模型层切分粒度,显存够就别开 |
--attention-backend | attention kernel选择 | flashinfer/ 默认 | 不同后端算力和显存表现差异明显 |
--mem-fraction-static | 静态显存占比 | 0.7~0.85 | 启动OOM先降它,别急着加卡 |
--chunked-prefill-size | prefill分块token数 | 4096~8192 | 长输入TTFT高就调小 |
--kv-cache-dtype | KV缓存精度 | fp8_e5m2/fp8_e4m3/bf16 | 非GPU80及以上硬件部分选项不可用 |
--max-running-requests | 最大并发batch | 按显存调 | 显存余量少时适当下调 |
--schedule-policy | 请求调度策略 | fcfs等 | 长短请求混合场景再考虑改 |
--stream-interval | 流式输出间隔 | 1 | 调大减少flush次数,客户端体感变差 |
排障与决策树
- 如果启动时显存分配失败:先确认是模型加载OOM还是KV池分配OOM,前者降
--mem-fraction-static或开--tp,后者开--kv-cache-dtype fp8_e5m2。 - 如果TTFT随输入变长急剧上升且decode正常:是prefill阻塞了decode,把
--chunked-prefill-size从默认调小到4096,让prefill分批进batch。 - 如果decode吞吐偏低且TP已开:先确认
--attention-backend是否为flashinfer,再确认--enable-cuda-graph生效;两者都缺时收益最明显。 - 如果压测显示P99延迟高但P50正常:高概率是长尾大batch,降
--max-running-requests让batch更小更稳。 - 如果多卡报NCCL/IB相关错误:检查容器是否有
ipc: host、memlock未限制,这是compose里已经配好的两项,手搓启动命令最容易漏。 - 如果FP8 KV缓存报错:先查GPU是否Hopper/Blackwell架构,老架构退回
bf16。
边界与延伸
这篇文章覆盖的是单机到多卡的部署和调参,PD分离、HiCache多级缓存、专家并行这些分布式进阶特性没展开,规模上去之后再补。延伸阅读:服务器参数全表、量化说明。先把最小路径的三步跑通,再用bench_serving拿到自己机器的基线数字,然后才回来对着速查表逐个调参数——没有基线的调参都是盲调。
【免费下载链接】sglangSGLang is a high-performance serving framework for large language models and multimodal models.项目地址: https://gitcode.com/GitHub_Trending/sg/sglang
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考