公司动态
SGLang+B300:图像生成推理延迟优化实战解析
做模型推理服务的人可能都遇到过这种矛盾模型已经跑起来了本机测试看着也不错但线上一次请求的返回时间就是压不下去。尤其是图像生成这类任务一张 1024×1024 的图后端要迭代几十步每一步都卡在显存访问上。你在本地用一张 A100 或 H100 出图感觉挺流畅可一旦服务上线并发一起来延迟曲线立刻变得很难看。最近我注意到一个值得拆解的优化案例Baseten 用 SGLang 配合英伟达 B300把 Qwen-Image 的图像生成推理延迟降低了 42.3%。单看数字你可能会觉得这只是“换了一代卡”的结果。但如果你把整个优化链路拆开会发现真正的改进来自三个层次的重叠推理框架的调度能力、GPU 硬件的带宽提升、以及推理平台本身的排队和批处理策略。接下来我会把这三层拆开讲最后给出一套可以复用的优化路径以及复现时需要特别小心的几个坑。1. 为什么图像生成推理的延迟比你想的更难压缩1.1 一次生成背后都是几十次迭代图像生成模型的推理过程和文本模型完全不同。文本模型生成 200 个 token往往只需要一次前向传播然后逐 token 输出。而扩散模型或流匹配模型要把一张图片从纯噪声逐渐还原成清晰图像通常需要 20 到 50 步迭代。Qwen-Image 这类大规模图像生成模型参数规模达到百亿级别每一步迭代都要把中间特征在显存里反复读写。所以图像生成的延迟天然就“难压缩”。算法层面哪怕只减少一步迭代最终效果也会被放大很多倍但反过来如果你单步迭代只优化了 3%总延迟可能只下降 2% 出头。量化地看一张图跑 30 步去噪哪怕每步只省下 20 毫秒最终也能省出 0.6 秒。这正是为什么所有做图像服务的人都在盯着“单步延迟”和“总迭代数”这两个指标。1.2 图像推理瓶颈不在算力而在显存带宽和调度很多团队把延迟问题归结为“GPU 算力不够”这是一个常见误区。对于大规模图像生成模型实际瓶颈往往不在浮点运算而在显存带宽。一次去噪迭代通常是数据密集型任务模型参数、中间特征、扩散步的状态都要从显存读到计算单元里。如果显存带宽不够GPU 的算力再高也会空转。这也解释了为什么在新一代显卡上图像生成任务的提升幅度往往比纯文本任务更明显因为新卡的显存带宽变化是这几代硬件里最直观的升级点之一。除了硬件带宽调度也会显著影响延迟。多个请求同时到达时如果推理框架没有做连续的动态批处理GPU 利用率会很不均衡请求只能在队列里等着P99 延迟很快就会变坏。很多团队调完了模型参数却发现线上延迟还是高其实就是卡在调度这一层。1.3 单张卡片快不代表线上服务快用一张显卡推理某一个单请求测出来的延迟是“黄金路径”。线上服务会遇到并发、排队、显存碎片、环境干扰这时候单卡延迟和线上 P99 完全是两个概念。Baseten 这次优化真正有价值的地方就在于它是在平台层面做的完整链路优化而不只是换了模型或换了卡。请求怎么排队、显存怎么复用、批处理怎么组合、模型并行怎么切分每一步都被重新调整了一遍。这也是为什么这类优化案例的参考价值远大于单纯的“某张卡跑某模型很慢或很快”的评测。2. SGLang 和 vLLM 的竞争里为什么 SGLang 更适合这个场景2.1 从“只是 LLM 框架”到覆盖多模态SGLang 最初是大语言模型推理引擎主打结构化生成和高效调度。不过它的定位逐渐扩展成了“一个覆盖多种生成模型的通用推理框架”像图像生成这类非文本模型也被纳入进来。这就和 vLLM 形成了有意思的对比。vLLM 是生态更成熟、社区更大的开源推理引擎很多生产环境都在用。它对常见 LLM 的支持非常完善部署文档也丰富。但在适配新模型形态尤其是图像生成、多模态生成模型时SGLang 的反应速度往往更快。原因不复杂SGLang 的开发方向就是“把更多模型塞进同一个运行时”所以它对新模型的适配往往更激进一些。对比维度vLLMSGLang社区生态更大企业级用户多快速成长开发节奏激进模型覆盖以 LLM 为主多模态逐步增加对多模态、图像生成模型适配更快核心机制PagedAttention成熟稳定RadixAttention统一调度适用场景成熟的 LLM 生产环境新模型、多模态、愿意做更多调优的团队需要说明的是这不是说 vLLM 不能跑 Qwen-Image而是如果目标是深度优化一个新模型的推理延迟SGLang 因为设计更集中能更快地针对新模型暴露可调参数和调度策略。2.2 SGLang 的 RadixAttention 到底解决了什么问题RadixAttention 是 SGLang 里一个很关键的设计。它把过去请求的 KV cache 按树形结构缓存下来如果新请求和之前某个请求有相同前缀新请求可以直接复用之前的中间结果而不是重新计算。放到 Qwen-Image 场景里最直接的收益会出现在文本编码阶段。如果你的业务里很多用户共用同样的系统提示词、统一商品标签或反复出现的视觉描述这部分前缀内容会被反复计算。RadixAttention 能把这类重复计算省掉。不过要冷静看待这个能力。图像生成模型的延迟大头在扩散迭代阶段文本编码只是比较小的一段。所以 RadixAttention 在图像生成场景里更多是锦上添花而不是延迟下降的主要原因。真正影响更大的是 SGLang 对整个生成过程的调度编排和显存管理。2.3 高并发下的连续批处理和显存隔离图像模型单请求的显存占用很高。如果没有好的批处理策略一个请求占满整张卡的显存其他请求只能排队等待。SGLang 的运行时强调动态连续批处理在显存和算力允许时多个请求被组合到一个 batch 里执行。这样 GPU 的利用率可以保持在一个较高水平吞吐量上去了请求队列长度下来了用户侧的等待时间自然也就降下来了。对百亿参数级别的图像模型来说批处理策略的收益非常直接。尤其在高并发场景下如果框架没有这个能力哪怕 B300 硬件再好显存被单请求占满其他请求也进不来延迟和成本都会非常难看。3. B300 这一代硬件给推理优化留出了新空间3.1 显存容量与带宽的变化是怎么影响图像模型的B300 是英伟达 Blackwell 这一代面向推理场景的重要产品。对图像生成模型来说最关键的提升其实不是算力数字而是显存容量和显存带宽。图像模型权重本身就非常大如果单张卡显存不够就需要做模型并行或量化。模型并行会引入数据通信的开销量化则可能带来精度损失。B300 这一代在显存容量上给足了空间因此很多图像模型可以直接在单卡上部署避免了跨卡通信带来的额外延迟。这一点经常被忽略。举个例子一张图跑 30 步去噪每一小步都需要把参数和中间状态从显存读到计算单元。显存带宽越高这一步的平均耗时就越短。30 步累加下来最终用户感知到的时间差异会非常明显。3.2 为什么“上一代”也能跑但延迟差异会拉得很大上一代 H100/H200 跑 Qwen-Image 也能出图但差异通常集中在两个细节显存带宽和显存容量。显存带宽决定了每一步去噪迭代的速度上限。如果新一代显卡的带宽提高了图像模型的单步迭代延迟就会随之下降。同时显存容量决定了你能放多大的 batch或者能不能开更大的中间状态缓存。缓存空间足够框架层面才有更大的优化空间。用一个简单的类比来说模型权重和中间特征就像摆在你面前的一堆书。每一轮去噪你都把这些书从书架上搬到桌面上看一遍。带宽越好搬书越快书架越大你一次能放下的书越多。图像模型恰恰是最吃“搬书速度”的那类任务所以硬件升级的收益会成倍放大到用户延迟上。3.3 从 A100/H100 迁移到 B300 时的现实问题迁移到 B300 不单单是换一张卡的问题。几个现实障碍特别常见驱动和 CUDA 版本必须匹配。新卡一般需要较新的 Linux 驱动和 CUDA 版本旧镜像可能直接无法启动。SGLang 版本要跟着升级。老版本不一定支持新卡的新特性需要关注官方 release notes。如果虚拟化平台或容器环境限制了 GPU 资源B300 的大显存未必能发挥出来。我建议在迁移前先用下面这个检查表过一遍检查项说明驱动版本确认满足 B300 的最低驱动要求CUDA 版本确认 PyTorch 和 SGLang 依赖的 CUDA 版本匹配框架版本确认 SGLang 支持 Qwen-Image并且是基于新架构适配的版本显存规划模型权重、中间状态、批处理显存三者不能超过单卡或节点总显存并行方案单卡能放则优先单卡部署放不下再考虑张量并行这类前置检查看似琐碎做不好却会让后面的调优工作全部白费。4. 42.3% 的延迟下降是如何被切出来的4.1 拆解一次请求的时间线一次 Qwen-Image 请求大致可以分成三个阶段文本编码阶段把用户输入的 prompt 转成模型需要的 embedding。扩散迭代阶段模型做几十步去噪这是时间的大头。VAE 解码阶段把最后的 latent 还原成图片。三个阶段里扩散迭代阶段占的时间最长。任何延迟优化本质上都是在“压缩第二阶段”上做文章。4.2 最大化命中缓存很多人以为只有完全相同的 prompt 才能复用缓存。实际上像 SGLang 这类框架可以复用公共前缀。如果你的业务里提示词有稳定结构比如“商品图xxx白色背景高光细节丰富”那么“商品图”这部分的文本编码结果后续请求就可以直接复用。这种优化对业务收益的贡献取决于你的 prompt 分布。如果提示词千奇百怪、几乎没有重复结构缓存命中率就会很低如果业务里提示词高度模板化这层优化就能节省不少重复计算。不过正如前面所说对图像生成模型来说文本编码在整个请求里的耗时占比有限所以缓存命中更多属于“额外收益”不是主干。4.3 工程化组合框架、硬件、平台调度的三层叠加42.3% 的延迟下降按我的理解大概率不是某一个开关带来的而是三层同时优化的结果SGLang 负责把请求调度、显存缓存、批处理做干净B300 负责提供更高的显存带宽和容量Baseten 作为推理平台负责把模型加载、请求排队、实例扩缩容管理好。这类组合优化有一个特点它不是“压测时加一个参数”那么简单而是把整条链路重新打磨了一遍。从请求进入平台到模型执行再到结果返回每一步都可能被优化掉几毫秒到几十毫秒。这些时间叠加起来最终就是 42.3% 这个看似惊人的数字。4.4 为什么这个数字不能直接搬运到你的环境如果你对着 42.3% 这个数字做对比测试很可能结果完全不同。差异可能来自几个方面你的 prompt 分布不同缓存命中率不同你的并发模型不同批处理收益也不同你的模型版本、图像分辨率、采样步数和对方的测试配置可能完全不一样。所以我不建议你把 42.3% 当作一个可复现的指标而建议把它当成判断组合优化上限的参考。要复现先做自己的基线测试再逐项验证。5. 想复现这个效果先跑通再优化5.1 环境准备驱动、CUDA、SGLang 版本如果你用的是 B300第一步就要确认驱动版本足够新。旧驱动可能连卡都识别不了更别提跑推理。接下来是 CUDA 版本和 PyTorch 版本。安装 SGLang 的常见方式有两种# 常见安装方式具体版本以官方仓库 README 为准 pip install sglang[all]如果你想跑 GitHub 上的最新代码源码安装更常见pip install -e python[all]装完之后先确认版本python -c import sglang; print(sglang.__version__)这一步能帮你避免很多莫名其妙的版本兼容问题。5.2 用 SGLang 启动 Qwen-Image 的最小流程启动服务的方式常见写法类似这样python -m sglang.launch_server \ --model-path Qwen/Qwen-Image \ --port 30000 \ --mem-fraction-static 0.8这里的--mem-fraction-static表示分配多少比例的显存作为静态缓存。你可以根据后续请求的并发量调高或调低。太低了支持不了大的 batch太高了留给动态请求的余量反而不足。需要注意Qwen-Image 的生成接口不同于普通 LLM 的文本输入输出。请求时一般需要传 prompt、图像尺寸、采样步数等参数。具体请求格式请以 SGLang 仓库里 Qwen-Image 的示例为准不要照抄旧版 LLM 请求格式。5.3 测量基线别上来就盯着延迟曲线我见过很多团队部署完之后第一件事就是拿一两个请求看延迟看到数值觉得“还可以”然后就宣布优化完成。这种做法很容易误判。建议先做一个规范的基线测试写一个请求脚本连续发送 50 到 100 个请求。记录每个请求的总时间、成功率和错误类型。统计 p50、p95、p99。p99 比平均值更能反映线上体验。再跑多组并发比如 1、4、8、16 个并发分别观察延迟变化。先测基线再谈优化。如果基线还没建立所有参数调整都是没有依据的。5.4 逐项调优的顺序与常见坑调优顺序建议这样安排先保证“输出正确”用基准请求确认生成出来的图片和 diffusers 基线一致。再开启缓存类特性观察缓存命中率是否上升。再调整批量处理和并发参数观察吞吐量和显存占用。最后再考虑量化、模型并行等更激进的手段。常见坑也一并列出来显存爆掉图像生成的显存占用不恒定和图像尺寸、batch、采样步数都有关。你要在最高负载场景下压测而不是只在默认测试场景下看。版本不匹配SGLang 和 PyTorch 都在快速迭代新版 API 变动频繁老教程里的参数可能已经废弃。误以为批处理是免费的批处理提升吞吐量但也会让单请求的 P99 变差。你需要在“吞吐”和“延迟”之间做取舍。基准配置不一致如果你测 A100 时采样步数是 50测 B300 时悄悄改成 30那结果就完全没有可比性。6. 这类优化的适用边界和真正值得长期投入的事6.1 适合我么不同团队的判断清单任何优化方案都有适用边界。SGLang B300 这套组合不是所有团队都应该立刻跟进。如果你的服务是面向外部用户的高并发图像 API值得投入。如果你的任务只是离线批量生成图片延迟不是核心关注点没必要追逐最新卡和框架。如果你的团队只有一两个人没有专职推理优化经验先跑通标准方案再考虑深度调优。如果你的业务里 prompt 高度模板化SGLang 的缓存收益会比较明显。如果你的业务量大但预算敏感成本与延迟的平衡比极致延迟更重要。说到底优化的前提是团队有交付能力、有线上监控、有足够的测试样本。否则硬件再新框架再好也发挥不出来。6.2 框架更新快代码要写得“可迁移”SGLang 目前处于快速迭代阶段vLLM 也在不断更新。我的建议是不要把你的业务代码和某个框架的私有 API 绑定太死。把模型服务调用层好好封装一下让底层框架对你尽量透明。这样下个季度如果又有新框架出现你还能快速验证一下再决定要不要切换。这类封装看起来初期会多写一点代码实际上能省掉未来迁移的巨大成本。你要知道自己真正关心的不是“SGLang 怎么写”或者“vLLM 怎么写”而是“我的图像生成服务应该怎么稳定、低成本地对外提供能力”。6.3 单一指标导向的误区延迟降了成本呢42.3% 的延迟下降会吸引很多关注但任何一个做过服务治理的人都会接着问另外三个问题吞吐量有没有变好单位成本有没有变高稳定性有没有变差有时候延迟降低靠的是换了一张很贵的卡或者把 batch 调到很小。如果业务量很大单位成本反而可能是更重要的指标。所以我建议用四个维度建立评估框架评估维度核心问题延迟p50 / p95 / p99 是否下降是否稳定吞吐量同样时间内能完成多少张图像成本单张图片的推理成本变化稳定性并发高压下是否出现 OOM、超时或排队飙升只看延迟不看另外三个维度很容易做出一个“演示完美但无法长期跑”的方案。6.4 回到更底层的经验这类组合优化案例最有价值的参考不是 42.3% 这个数字本身而是背后的方法论先测量再分层优化最后工程化。任何推理优化本质上都是先搞清楚瓶颈在第几层再把对应层修复好。SGLang、B300、Qwen-Image都只是这套方法在当前时间点上的具体载体。模型会换代框架会更新硬件会升级但“理解瓶颈在哪一层”这个能力不会过时。下次再看到一个惊人的优化数字你就能更快判断哪些可以直接参考哪些只是特定环境下的偶然结果。