news 2026/9/2 22:31:19

SGLang GPU 利用率优化:量化、批处理与多卡并行的 6 个实战场景

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SGLang GPU 利用率优化:量化、批处理与多卡并行的 6 个实战场景

SGLang GPU 利用率优化:量化、批处理与多卡并行的 6 个实战场景

【免费下载链接】sglangSGLang is a high-performance serving framework for large language models and multimodal models.项目地址: https://gitcode.com/GitHub_Trending/sg/sglang

用 SGLang 部署 LLM 推理服务时,GPU 经常"半闲置":利用率上不去,请求排队,KV 缓存占着显存却被反复回收。本文给出一条最短的跑通路径,再按单卡、多卡、长文本、高并发四个场景逐个拆解该动哪些参数,最后附参数速查表和常见报错的处置方法。

🚀 5 分钟跑通一个推理服务

先建立信心:一条命令起服务,一条命令发请求。

pip install --upgrade pip pip install -e "python" # 在仓库根目录执行;或 pip install sglang python3 -m sglang.launch_server --model-path qwen/qwen2.5-0.5b-instruct --host 0.0.0.0 --port 30000

执行后应看到终端打印The server is fired up and ready to roll!,表示服务就绪。另开终端向http://127.0.0.1:30000/generate发一条 POST 请求(body 里放一个text字段),返回包含生成内容的 JSON 就算验证通过。

小模型、低负载时利用率数据没什么参考价值,真正的优化空间在下面的四个场景里。

💾 单卡省显存:把权重和 KV 缓存都压小

单卡场景的核心矛盾是显存不够分:模型权重、KV 缓存、激活值要共用一块显存。两件事最有用。

权重量化。优先选离线量化好的现成权重(GPTQ、AWQ、FP8 检查点),加载时 SGLang 会自动读取模型配置里的量化信息,不需要额外参数:

python3 -m sglang.launch_server \ --model-path <你的AWQ或FP8检查点> \ --port 30000

只有当你手里只有高精度原始权重时,才用--quantization fp8做在线量化,让 SGLang 在加载时动态计算缩放因子。注意:已经量化的检查点不要再加--quantization,两者叠加会出错。

KV 缓存量化。给--kv-cache-dtype fp8_e4m3加一个参数,KV 缓存体积直接减半,同显存下能多跑一倍长度的上下文。代价是精度有轻微损失,长文本任务建议先对比几组输出再决定是否开启。

验证方法:启动日志里找max_total_num_tokens这一行,它代表 KV 缓存池能容纳的 token 总量。量化前后对比这个数字,涨了多少就说明并发能力多了多少。

🖥️ 多卡并行怎么配

先分清两种并行:TP(张量并行)是把一个模型拆到多张卡上算,解决"单卡装不下";DP(数据并行)是每个 worker 各跑一份完整模型,解决"单卡装得下但吞吐不够"。

  • 模型显存超过单卡容量 → 上 TP,--tp 2--tp 4逐档往上加;
  • 模型能装进单卡 → 优先 DP,内存充裕时吞吐明显更好;
  • MoE 模型 → 再加专家并行--ep-size,让不同卡承载不同专家,配合--moe-runner-backend triton使用。
# 装不下:张量并行 python3 -m sglang.launch_server --model-path <模型> --tp 4 --port 30000 # 装得下:数据并行,配合网关做负载均衡 python3 -m sglang_router.launch_server --model-path <模型> --dp 4 --port 30000

执行后应看到每卡显存占用大致均衡。验证方法:nvidia-smi里各卡利用率差值小于 20%,说明切分合理;某张卡明显偏低,通常说明 TP 切法或路由有问题。

📄 长文本:别让一次 prefill 把显存打爆

长 prompt 的请求在进入 decode 前会先做一次性 prefill,token 数越多,这一瞬的激活值越大,OOM 最常发生在这里。

对策是把 prefill 切成小块:

python3 -m sglang.launch_server --model-path <模型> \ --chunked-prefill-size 4096 --mem-fraction-static 0.85 --port 30000

--chunked-prefill-size限制单个 prefill 块的 token 数,OOM 时从 8192 往 4096、2048 降。代价是长 prompt 的首 token 延迟略升,但换来的是稳定。

--mem-fraction-static决定"权重 + KV 缓存池"占显存的比例(公式:(权重+KV池)/显存总量)。官方调法:看启动日志里available_gpu_mem——落在 5~8 GB 区间说明分配合适;剩 10 GB 以上就往上加 0.01;剩得太少则往下调,防止后面 OOM。

⚡ 高并发:让调度器别"留手"

请求密集到达时,有两个参数直接决定吞吐。

--schedule-conservativeness(默认 1.0)控制调度器敢不敢继续收新请求:

  • 日志里token usage长期低于 0.9、且#queue-req > 0→ 调度器太保守,降到 0.3;
  • 反复出现KV cache pool is full. Retract requests.→ 太激进,升到 1.3。偶尔出现(约每分钟一次)属正常。

--max-running-requests是同时在跑的请求上限。decode 阶段 OOM 时优先降它,比降mem-fraction-static损失小。

调参结束后建议压测一轮,确认gen throughput (token/s)token usage都达到预期再上线。

📊 关键参数速查表

参数推荐取值一句话作用
--quantization fp8仅高精度原始权重时用加载时在线量化权重,省显存
--kv-cache-dtype fp8_e4m3长上下文场景开KV 缓存体积减半,换更高并发
--chunked-prefill-size4096(OOM 时降到 2048)把长 prefill 切块,削平显存峰值
--mem-fraction-static0.85 起步,日志余量 5~8 GB 为准权重 + KV 池的显存占比上限
--max-running-requests按 decode 阶段余量下调限同时在跑的请求数
--schedule-conservativeness0.3~1.3,默认 1.0调度器收/放请求的松紧程度
--tp单卡装不下才用张量并行,拆分模型
--dp单卡装得下时优先数据并行,提吞吐
--ep-sizeMoE 模型,卡数整除专家并行,分摊专家计算
--attention-backend不指定由 SGLang 自动选选 FA3/FlashInfer/Triton 等注意力内核
--enable-metrics生产环境必开暴露 Prometheus 指标

注意力后端不用死记:不指定时 SGLang 会按硬件和模型结构自动挑最快的。需要 MLA 或滑窗注意力时再按 docs/docs/advanced_features/attention_backend.mdx 的支持矩阵显式指定。

🛠️ 高频报错与处置

现象处理动作
OSError: CUDA_HOME environment variable is not set导出CUDA_HOME=/usr/local/cuda-<你的版本>后重启
prefill 阶段 OOM--chunked-prefill-size降到 4096/2048;--mem-fraction-static降到 0.8
decode 阶段 OOM--max-running-requests,再考虑降--mem-fraction-static
加载量化检查点时报 quantization 冲突去掉--quantization,预量化模型不需要在线量化
KV cache pool is full. Retract requests.刷屏--schedule-conservativeness升到 1.3
端口被占用(30000/9090/3000)换端口,或lsof -i :30000找出占用进程

🎯 落地建议

个人开发机:小模型 + 全默认参数跑通即可,别过早调参;要省显存就加--kv-cache-dtype fp8_e4m3

小团队:固定一条基线命令(模型路径 +--mem-fraction-static 0.85+--enable-metrics),之后只允许一次动一个参数并记录吞吐变化,避免多人同时改配置互相干扰。

生产环境:必开--enable-metrics,接上 examples/monitoring 里现成的 Prometheus + Grafana 栈(cd examples/monitoring && docker compose up即可),盯住 token usage、队列长度和 GPU 利用率三条曲线,按上表的阈值做增减。

延伸阅读:量化方法全表见 docs/docs/advanced_features/quantization.mdx,调参判断依据(日志怎么看)见 docs/docs/advanced_features/hyperparameter_tuning.mdx。

今天就先做一件事:把你当前服务启动命令里加上--enable-metrics,用curl http://127.0.0.1:30000/metrics拉一次指标,对照上表把token usage#queue-req两个数字记下来,这就是你下一步调参的起点。

【免费下载链接】sglangSGLang is a high-performance serving framework for large language models and multimodal models.项目地址: https://gitcode.com/GitHub_Trending/sg/sglang

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/2 22:29:42

嵌入式开发必知:STM32启动流程与中断向量表深度剖析

嵌入式开发里有一个很常见的现象&#xff1a;程序烧进去之后&#xff0c;板子不按预期跑&#xff0c;甚至一上电就死机。很多人习惯性地打开 main 函数从头查&#xff0c;查了好几遍逻辑都没问题&#xff0c;最后才发现问题根本不在 main 里&#xff0c;而在 main 跑起来之前的…

作者头像 李华
网站建设 2026/9/2 22:28:12

shadPS4 完整配置指南:从构建到运行你的第一款 PS4 游戏

shadPS4 完整配置指南&#xff1a;从构建到运行你的第一款 PS4 游戏 【免费下载链接】shadPS4 PlayStation 4 emulator for Windows, Linux, macOS and FreeBSD written in C 项目地址: https://gitcode.com/GitHub_Trending/sh/shadPS4 shadPS4 是一个基于 C 编写、支持…

作者头像 李华
网站建设 2026/9/2 22:27:52

用AI构建Shopify商店:Liquid模板与Admin API实战指南

之前在一个跨境电商项目里做 Shopify 独立站&#xff0c;最耗时的并不是在后台点几下创建店铺&#xff0c;而是商品文案、页面模板和视觉细节的反复返工。几百个商品要逐个优化标题和描述&#xff0c;首页模板每换一次风格就要同步改样式&#xff0c;SEO 信息还要手工核对&…

作者头像 李华
网站建设 2026/9/2 22:27:05

ESP-01S烧录教程:基于Arduino IDE的完整环境搭建

最近很多做物联网、DIY 智能家居和毕业设计的同学都开始接触 ESP8266 系列模块&#xff0c;其中 ESP-01S 因为体积小、成本低、自带 WiFi 能力&#xff0c;成为很多入门项目的首选。不过很多初学者第一次拿到 ESP-01S 时&#xff0c;往往不是卡在代码上&#xff0c;而是卡在“怎…

作者头像 李华
网站建设 2026/9/2 22:26:40

从回测到实盘:用Ptrade量化平台告别手动炒股

你有没有过这样的连续动作&#xff1a;盘前打开行情软件&#xff0c;翻一遍自选股&#xff0c;凭感觉判断今天的强势板块&#xff1b;盘中盯着分时线&#xff0c;看到一根大阳线就点买入&#xff1b;收盘后累了&#xff0c;关掉软件&#xff0c;第二天接着重复前一天的流程。等…

作者头像 李华
网站建设 2026/9/2 22:26:18

Herdr API分层选择:skill、CLI、raw socket何时用哪个完整指南

Herdr API分层选择&#xff1a;skill、CLI、raw socket何时用哪个完整指南 【免费下载链接】herdr the runtime your coding agents live on 项目地址: https://gitcode.com/GitHub_Trending/her/herdr &#x1f411; Herdr 是一款面向 AI 编程代理的终端工作区管理器&a…

作者头像 李华