用SRT替换HF后端解决AR模型并行冲突,结合TP for AR与SP for DiT的异构并行,配合动态批处理提升硬件利用率。Ascend团队出品。
用 SRT 替换 HF 后端以加速 AR 建模并解决并行冲突,AR 采用专用 TP,DiT 采用 SP
通过动态批处理提升硬件利用率,并为已完成的图像支持 early return
实现 one-denoiser-per-device 并行 DiT 执行,并通过缓冲 AR 结果实现 AR 与 DiT 工作流重叠
混合自回归-扩散(AR+DiT)生成是一种统一框架,将 AR 建模用于全局上下文、DiT 方法用于局部细节精化相结合。它利用 AR Transformer 捕捉长距离依赖关系,同时 DiT 模型迭代精化输出,确保更高的质量和效率。GLM-Image 是这一趋势的典型代表:一个 9B 的视觉语言模型首先从文本提示自回归生成语义先验 token,然后一个 7B 的 DiT 在 30-50 步内将这些 token 去噪成高分辨率图像。这种"先规划后绘制"的设计在知识密集型和文本密集型视觉任务(如海报、信息图和精确排版)中取得了 SOTA 成果——在这些任务上,端到端扩散模型往往表现不佳。
然而,在 SGLang 中高效地服务这种混合流水线暴露了一个根本性的矛盾。在原生部署中,AR 编码器、DiT 去噪器和 VAE 解码器链式连接在单个单体 worker 进程中,这产生了三个关键痛点:
架构耦合。AR 和 DiT 共享同一进程、权重加载生命周期和调度域。扩缩一个阶段必然带动另一个;无法独立配置资源。AR 本质上是一个 LLM-decoding 工作负载——吞吐量随 batch size 和 tensor parallelism(TP)扩展。相比之下,DiT 去噪是一种大张量、逐图像的计算,更适合跨卡的空间并行(SP),在 batch=1 时效率最高。同构部署必须选择单一策略,必然导致一个阶段始终处于次优状态。
并发下资源利用率低。没有动态批处理,并发请求被串行处理。端到端延迟几乎随请求并发量线性增长,大量可用计算资源处于空闲状态。
资源分配不匹配。DiT 在 batch=1 每设备时获得最佳单请求延迟,但将所有设备捆绑到单一单体流水线中,迫使 DiT 即使在优先吞吐量时也必须以多卡空间并行配置运行,导致硬件容量利用不足。
为解决这些问题,我们贡献了三个逐步推进的 PR,将系统从单体架构演变为完全解耦的异构分布式架构:
注意:PR #31320 尚未合并。本文采用的 commit SHA 为 4e520bd
为了降低每张图像的生成延迟,我们的分析促使我们用 SRT 替换 HF 后端,最终形成了 PR #25381。它将 AR 阶段从 diffusion worker 进程中解耦为一个独立的 SRT 服务,使 AR 和 DiT 分别加载权重、解耦调度生命周期,并可独立扩缩。同时,AR 服务器现在可以独立配置 TP,不再受 DiT SP 策略的约束。
AR 视觉语言编码器作为标准 SGLang SRT 服务启动,通过新的 --srt-encoder-url 选项由 Diffusion 流水线远程调用。AR 服务器复用 SGLang 现有的多模态 sglang serve 能力(srt/models/glm_image_vl.py + srt/multimodal/processors/glm_image.py);Diffusion 侧仅向 GlmImageAR 阶段添加一个 HTTP /generate 分支,当设置 srt-encoder-url 时,VisionLanguageEncoderLoader 仅执行 /health 检查并返回 URL,而不是调用 from_pretrained 加载权重。这种"独立服务器 + HTTP"方法将"将 VLM 重写为 SRT"这一巨型任务转化为"复用现有基础设施 + 一次 HTTP 调用",大幅降低了耦合度,最小化了对 diffusion 流水线的侵入性更改。
性能提升(请参阅 PR #25381 描述中的复现方法):
AR 阶段实现了最显著的加速:单卡 122.8s → 26.1s,4 卡上减少 78.8%。即使在 TP=1 时,SRT 的图执行、连续批处理和内存复用也带来了相较于 naive transformers generate 的 62.1% 提升。值得注意的是,基线 2-NPU 配置使用 SP 将去噪减少了 46.7%,但 AR 实际上反而慢 4.1%——在旧路径下 AR 无法从 SP 获得任何收益,甚至因通信开销而退化;只有 SRT 路径才能让 AR 真正利用多卡 TP。
分离之后,AR 和 DiT 仍然一次执行一个请求,因此在高并发下延迟仍然线性增长(issue #30634)。为提升多输入场景下的吞吐量,我们后续提交了 PR #30683。它将并发请求打包到单次前向传播中,消除了串行执行导致的空闲计算。
动态批处理适配:SGL-Diffusion 已包含通用的动态批处理基础设施(在 PR #18764 中引入);我们的工作通过实现 supports_dynamic_batching 和 supports_native_grouped_requests 接口及相关流水线逻辑,将此能力扩展到 GLM-Image。评估后,我们仅将批处理应用于 AR 阶段,因为 DiT 每步延迟随 batch size 成比例增长,不会带来净吞吐量收益。
支持 early return:我们添加了 supports_sequential_dit_inference 变量及相关函数,以支持在每个输出图像就绪时立即返回,而无需等待整个批次完成。
性能提升(请参阅 PR #30683 描述中的复现方法):
注意:¹ 处理延迟是从批次分发到单个请求完成的时间测量。对于 BS4/BS8/BS16,值表示批次内的延迟范围:第一个数字对应最快完成的请求,最后一个数字对应最慢的请求。额外的排队等待时间(本次测试中 ≤14ms)可忽略不计。
完全解耦两个阶段,使 AR 和 DiT 各自采用最适合它们的并行和部署策略。AR 编码器适合大 batch + TP(面向吞吐量);DiT 去噪在单个 NPU 上 batch=1 时无论延迟还是吞吐量都是最优的。
然后 #31320 引入了一种异构拓扑:一个批处理 AR 服务器 + 一组独立的 batch=1 去噪器。这在单节点场景下实现了全系统硬件利用率的最佳状态。
SGL-Diffusion 提供了通用的解耦框架;PR #31320 将此框架适配到 GLM-Image 的两阶段拓扑,支持并行 DiT 执行,并在 AR 生成与去噪之间实现流水线重叠。一个关键设计选择是:仅请求元数据和 CPU 端的 prior token ID 通过 ZMQ 传输——不传输大张量、latent、embedding 或 GPU 缓冲区——旨在保持极低的通信开销。
性能提升(请参阅 PR #31320 描述中的复现方法):
Huawei Ascend 团队
感谢华为 Ascend NPU 团队对 GLM-Image 优化持续做出的贡献。特别感谢 Maksim Emelin(@Makcum888e)、Artem Savkin(@OrangeRedeng)、Egor Filimonov(@ssshinigami)和 Liang Zhen(@ping1jing2)。同时感谢 CMB 的 Yuefeng Wu(@ChefWu551)和 Qianqian Zheng(@AuFlow)。他们在 Ascend 平台上为 GLM-Image 优化做出了贡献,提高了稳定性和部署效率。
SGLang 社区
感谢更广泛的 SGLang 社区,包括来自 Xiaoyu Zhang(@BBuf)的代码审查,以及 Yuhao Yang(@yhyang201)和其他贡献者的初始讨论(issue #20032)和实现(PR #18809)。
最后,感谢 SGLang 维护者和审查者的细心指导,感谢智谱 AI 团队开源 GLM-Image 模型和权重,以及所有为 SGL-Diffusion 做出贡献的人。
由于命令较长,完整复现步骤列在 issue #33526 中。