多模态模型推理加速:何时采用 EPD 分离
EPD(Encode-Prefill-Decode)分离是一种面向多模态模型的推理优化技术,将视觉编码器阶段与 prefill、decode 阶段解耦。它在图片密集型提示、短至中等长度输出以及量化 MoE 模型上效果最为显著。
本文介绍如何借助 NVIDIA Dynamo 在合适的场景下使用 EPD 分离,实现 TTFT(首 token 时间)最多提速 5 倍、端到端响应时间最多提速 7 倍,同时也说明了哪些场景下不建议采用 EPD 分离。
Dynamo 是一个面向分布式环境的开源推理框架,支持 EPD 分离——将各阶段拆分为可独立伸缩的模块,而非像传统聚合部署那样以紧密耦合的调度和伸缩模式一起运行。专用 encoder worker 能够改善批处理效率、内存利用率以及整体吞吐量。
为什么需要 EPD 分离?
多模态请求在 LLM prefill 开始前还有额外工作要做:serving 层必须先对媒体数据做预处理,再运行视觉 Transformer(ViT)生成 embedding。在聚合式部署中,视觉编码、LLM prefill 和 decode 共用同一个 worker 和同一套调度域。当媒体处理仅占整体负载的一小部分时,这种简单架构尚能应付。
当请求包含更多图像或视频时,这种平衡就会改变。视觉编码可能耗时数百毫秒甚至更长。由于编码器和 LLM 共享同一块 GPU,媒体密集的请求不仅会拖慢自己的 prefill,还会与并发的 prefill 和 decode 任务抢占资源。反过来,在混合负载下,纯文本请求即使不需要视觉编码,也可能排在多模态请求之后等待。
Dynamo 通过将编码器和 PD worker 角色分离来实现 EPD serving,同时不固定它们的硬件位置。编码器 worker 负责生成视觉 embedding,PD worker 则消费这些 embedding 并运行 LLM。这样各阶段就可以独立地进行批处理、调度和扩缩容。图 2 对比了聚合式 serving 和 EPD serving,其中编码 worker 通过 NVIDIA Inference Transfer Library (NIXL) 将 embedding 传递给 PD worker。
Encode 分离化只能在特定场景下降低 TTFT 并提升同等 SLO 下的 goodput。分离出的 encode 计算量必须足够大,才能抵消 worker 间协调和 embedding 传输带来的额外开销。Encode worker 可以与 PD 共享 GPU,也可以部署在独立的 GPU 层级上,由此产生不同的部署方案。下面我们来分析 encode worker 的各种部署选项及其在不同场景下的收益。
三种 encode 部署拓扑
图 3 对比了聚合式服务与两种 encoder 分离化拓扑——共部署和全分离:
- 聚合式:每块 GPU 上运行一个聚合 worker,其调度器将视觉编码、LLM prefill 和 decode 统一纳入同一请求生命周期管理。
- 共部署 encoder:每块 GPU 上运行一个或多个 encoder worker,同时搭载一个 PD worker。这样既能让各 worker 共享 GPU 算力,又保持独立的请求队列和批处理。在齐集群上,共部署 encoder 通常是更优选择。视觉 encoder 相对于 LLM 很轻量,若整块同规格 GPU 都留给 encode,利用率会偏低。共部署在保持 worker 逻辑隔离的同时,避免了为 encoder 独占一整块 GPU。
- 分离式编码器:当集群中存在一个成本更低的 GPU 层级且该层级更适合运行编码器负载,而主 GPU 层级承载 PD 节点时,分离式编码器方案就具有吸引力。Dynamo 通过 NIXL 将生成的视觉嵌入传递到 PD 层级。在我们的测试环境中,编码器节点运行在两块 NVIDIA RTX 6000D GPU 上,PD 节点运行在四块 NVIDIA GB200 GPU 上。这样的部署让较轻的编码器负载留在 RTX GPU 上,将 GB200 GPU 留给计算和内存需求更高的 LLM 负载。需要注意的是,本分析未涵盖同构 GPU 的分离式部署,因为其性能始终不如共置编码器方案。
硬件可用性决定了编码器能部署在哪里,而负载特征则决定了分离部署是否划算。
哪些因素决定了 EPD 分离式的收益?
EPD 的收益取决于视觉编码、LLM prefill 和 decode 之间的工作分配。当视觉编码占请求处理时间的较大比例或成为吞吐瓶颈时,EPD 最有价值。媒体密集型请求容易产生这种情况,但仅凭媒体负载并不能决定最终效果。输出长度、模型规模与精度、流量构成同样会改变这一平衡。
| 因素 | 对 EPD 的影响 | EPD 何时产生收益 |
|---|---|---|
| 输入媒体负载 | 媒体负载越重,产生的视觉 token 越多,编码器工作也越重。EPD 允许独立扩展编码器,避免编码瓶颈。 | 多张图片、高分辨率图片或视频输入会产生更多视觉 token。 |
| 输出序列长度(OSL) | OSL 越长,总延迟中解码占比越高。EPD 带来的 TTFT 提升依然成立,但端到端(E2E)的收益会缩小。 | 短 OSL:E2E 收益保持;长 OSL:E2E 收益逐渐消失 |
| 模型规模 / 精度 | ViT 的计算量基本固定,而 LLM 的计算量会随有效参数减少和精度降低而下降。因此小型、MoE 和量化 LLM 的 ViT 与 LLM 计算量之比更高。 | 更小、MoE 和低精度的模型从 EPD 中获益更多,大型稠密模型收益较小。 |
| 混合流量(文本 + 多模态) | 混合 prefill 批次可能让文本请求等待 ViT。EPD 将编码器工作隔离,使文本请求无需等待编码器。 | 多模态流量较重且与延迟敏感的文本请求混合的场景。 |
测试环境
除精度消融实验外,所有基准测试均使用 Qwen3.5 122B A10B NVFP4。我们使用四块 GB200 GPU(分离部署时另加 RTX 6000D GPU):
- 聚合部署:每块 GB200 运行一个 TP1 聚合 worker
- 同机 EPD:每块 GB200 运行两个编码器 worker 加一个 PD worker
- 分离 EPD:RTX 节点作为编码层,GB200 作为 PD
视觉 embedding 传输采用基于 UCX RC/TCP 以太网的 NIXL,实测峰值带宽 20 Gbps。前端使用 Dynamo,并启用了前端并行媒体解码。goodput SLO 为 token 间延迟(ITL)低于 100 ms。
图像密集型负载示例
我们用以下请求对比了聚合部署与编码器分离部署:每个请求包含十张图片(每张上限 256 token),OSL 为 1024,以模拟视觉负载较重且输出序列较长的场景。结果如图 4 所示。
encoder 与 prefill 同节点部署时 TTFT 下降 58%,异构分层部署时下降 50%。端到端延迟改善有限,因为 OSL 为 1024 意味着模型需生成 1024 个 token,而 Encoder 分离并不能缩短 decode 时间。更显著的收益体现在 goodput 上:异构分层在相同延迟 SLO 下可多承载 70% 的流量,因为新增的 encoder 算力没有占用 GB200 的预算。
图片数量与 OSL 如何影响性能收益?
我们在多组实验中分析了 5 至 50 张图片、每张图片分别使用 128 或 256 token 预算时对 TTFT 和端到端延迟的影响,OSL 保持恒定。结果表明,在 encoder 聚合部署的场景下,TTFT 和端到端延迟均随图片数量增加而恶化;而两种分离式拓扑的性能则基本保持稳定。
接下来,我们将 OSL 从 128 逐步调整到 2,048,图片负载固定为 5 张。随着 OSL 增大,TTFT 基本不变,但 decode 时间占端到端延迟的比重越来越大。因此,异构 EPD 相对聚合部署的端到端收益从 20.3% 收窄至 5.2%。同节点部署的 encoder 则从 11.8% 的收益转为 2.5% 的性能退化,因为其额外的 encoder worker 与 PD worker 共享同一组 GPU。OSL 越大、decode 压力越强,GPU 争用对 encoder 解耦收益的抵消乃至反转就越显著。
图 7 和图 8 分别展示了在不同 OSL 和图片负载下,TTFT 和端到端延迟相对聚合(baseline)的百分比改善。在几乎所有场景下,输入媒体负载越高,encoder 解耦带来的收益越显著。而在 OSL 较高、图片负载较低的场景中,将 encoder 解耦反而会损害性能。
模型规模和精度如何影响 EPD 收益?
随着模型规模增大,LLM 在服务负载中的占比越来越高,而视觉编码器的大小基本不变。为量化其对 EPD 的影响,我们在 Qwen3.5 4B、Qwen3.5 9B 和 Qwen3.5 27B 上做了模型规模消融实验。ViT 参数占比从 4B 时的 7.2% 降至 9B 时的 4.7%,27B 时进一步降到 1.7%。同址 EPD 呈现相同趋势,其有效吞吐分别为聚合部署的 2.62 倍、1.50 倍和 0.65 倍。
参数占比只是一个间接指标,真正起决定作用的是 ViT forward、LLM prefill 和 decode 三者在运行时的耗时是否均衡。当 ViT forward 在请求处理中占比较大时,EPD 的收益更明显;一旦 prefill 和 decode 成为主要耗时环节,可供优化的 encoder 工作就相应减少。在我们的 27B 配置下,colocated 部署中 LM 的开销已经超过了将 encoder 独立出来所带来的收益。
我们测量了 LLM 精度对 EPD 增益的影响。当视觉 encoder 和 LLM 均使用 BF16 时,colocated EPD 的 goodput 达到 aggregated serving 的 1.78 倍。仅将激活的 LM 权重量化为 NVFP4 后,这一增益进一步提升至 2.64 倍。
NVFP4 加速了 LLM 的 prefill 和 decode 阶段,而 ViT 前向推理仍保持 BF16,这使得请求时间中编码器工作占比更大。EPD 因此获得了更大的调度空间,可以将编码器负载与 PD worker 独立编排。
EPD 如何助力混合模态请求
生产环境中,纯文本请求和多模态请求经常混在一起,两者可能被调度到同一批 prefill。在聚合式服务中,一个 worker 同时负责视觉编码和 LLM prefill。一旦批次中混入多模态请求,worker 就必须先完成媒体预处理和 ViT 前向,再开始 prefill。纯文本请求本身不需要这些步骤,却只能被动等待,TTFT 因此被拉长。
EPD 通过把视觉编码放到独立的 encoder worker 上,解除了这种依赖。前端将两类请求都路由到 prefill worker,但只有缺少 embedding 的多模态请求才会触发 encoder 池。纯文本请求可以直接进入 prefill,编码器则独立处理多模态请求,从而消除了两类请求之间的队头阻塞。
为了量化这一收益,我们在持续混合文本与图片流量的条件下,对比了聚合式服务(编码器共置)的表现。
编码器分离部署将文本请求的平均 TTFT 从 92.3 ms 降至 53.3 ms,降幅 42.2%;图像请求的 TTFT 从 289.9 ms 降至 200.6 ms,降幅 30.8%。图像请求仍需承担编码器延迟,而文本请求无需等待视觉编码完成即可开始 LLM prefill,这就是文本请求 TTFT 相对改善更大的原因。
如何选择最优的编码器拓扑
编码器的最佳部署位置取决于请求耗时分布在哪一环节。当视觉编码在请求处理中占比较大时,EPD 带来的收益最为明显,例如媒体内容较多的输入、短到中等长度的输出、较小或量化后的模型,以及混合流量场景。而当媒体处理负载较轻或长解码序列主导延迟时,聚合服务依然是合适的选择。
硬件条件也会影响部署决策。在同构集群上,同机部署编码器可以在不必为相对轻量的视觉模型独占整块 GPU 的情况下,实现编码器调度和批处理的分离。而在异构硬件上,独立编码器层更为实用,可让低配 GPU 运行编码器,高端 GPU 专注 PD。
需要注意的是,vLLM 和 SGLang 都已将 EPD 的进一步开发列入路线图。
开始使用 EPD 分离部署
如需复现本文中的实验,请参考 ai-dynamo/dynamo 的 GitHub 指南。
如图 1 所示,TTFT 中有 43% 的时间消耗在 ViT 启动之前,EPD 对这些阶段无能为力。以下列出的 Dynamo 其他优化手段可以分别针对技术栈的不同环节。
并行媒体解码将下载和解码从 worker 移到 Dynamo 前端,由前端把解码后的像素数据直接发送给后端。在单台 GB200、两个编码 worker、30×256 分辨率的纯 encoder 基准测试中,同等吞吐下平均 encoder 请求延迟降低 26%(281.3 ms → 207.0 ms),P99 降低 23%(752.1 ms → 581.7 ms)。通过 --frontend-decoding 启用。
Embedding 缓存将已计算的 embedding 存储在 CPU DRAM 中,避免重复媒体被重新编码。当同一多模态内容(如图片或视频)出现在多个请求中时,系统直接复用缓存的 embedding,而非再次运行视觉 encoder。
多模态 KV 路由在 Dynamo 的 KV-aware 路由器中,将媒体内容与文本一起参与哈希计算,使共享同一媒体的请求被调度到已持有相关 KV blocks 的 worker 上。缺少这一机制时,每张图片在路由器眼里都只是同一个占位 token。
致谢
感谢 Inferact 联合创始人 Roger Wang 对本文的反馈意见,以及 NVIDIA 团队中 Alexandre Milesi、Ayush Agarwal、Guan Luo、Indrajit Bhosale、J Wyman、Kris Hung、Krishnan Prashanth、Qi Wang 和 Zhongdao Ren 在 Dynamo 多模态支持方面的核心工作。