跳转至

分离式编码器

分离式编码器是指将大语言模型(LLM)的视觉(多模态)编码器阶段,与语言模型的 prefill 和 decode 阶段运行在相互独立的 vLLM 进程/实例中。

类似地,分离式 prefill 将提示词处理(KV cache 计算)与自回归 token 生成(decode 阶段)隔离在不同的 vLLM 实例中。

这种分离允许针对每个阶段进行硬件和资源优化,从而能够精确调整首 Token 时间(TTFT)与 Token 间延迟(ITL)之间的平衡。因此,它提升了高负载服务期间的整体吞吐量和资源利用率。

Prefill-Decode(PD)分离是这一机制的总体架构。在此配置中,专用 prefill 实例计算 KV cache,并通过 MooncakeLayerwise 等专用连接器将其传输到 decode 实例以进行 token 生成。

在 vLLM 等框架(包括 Ascend Hardware Plugin)中,PD 分离通常与多模态模型的 Encoder-Prefill-Decode(EPD)架构集成,同时支持带分布式负载均衡的多节点配置。

最终,这些架构模式通过应对各阶段截然不同的计算特征来最大化推理效率:编码和 prefill 是计算密集型且突发性的,而 decode 是内存密集型且持续性的。

为什么使用分离式编码器?

分离式编码器在多模态 LLM 中运行视觉编码器阶段,其进程独立于 prefill / decoder 阶段。将这两个阶段部署在独立的 vLLM 实例中可带来三个实际好处:

  1. 独立、细粒度扩展

  2. 视觉编码器较轻量,而语言模型大几个数量级。

  3. 可以并行化语言模型,而不影响编码器集群。
  4. 可以独立添加或移除编码器节点。

  5. 更低的首 Token 时间(TTFT)

  6. 纯语言请求完全绕过视觉编码器。

  7. 编码器输出仅在所需的注意力层注入,缩短 prefill 关键路径。

  8. 跨进程复用和缓存编码器输出

  9. 进程内编码器将复用限制在单个 worker 中。

  10. 远程共享缓存允许任何 worker 获取现有嵌入,消除冗余计算。

设计文档:https://docs.google.com/document/d/1aed8KtC6XkXtdoV87pWT0a8OJlZ-CpnuLLzmR8l9BAE/edit


使用

当前参考路径是 ExampleConnector。 以下可直接运行的脚本展示了工作流:

1 个 Encoder 实例 + 1 个 PD 实例: examples/online_serving/disaggregated_encoder/disagg_1e1pd/

1 个 Encoder 实例 + 1 个 Prefill 实例 + 1 个 Decode 实例: examples/online_serving/disaggregated_encoder/disagg_1e1p1d/


开发

alt text

分离式编码通过运行两个部分来实现:

  • Encoder 实例 – 用于执行视觉编码的 vLLM 实例。
  • Prefill/Decode(PD)实例 – 运行语言 prefill 和 decode。
    • PD 可以是单个普通实例中的(E + PD),也可以是分离实例中的(E + P + D)

连接器将 encoder-cache(EC)嵌入从 encoder 实例传输到 PD 实例。
所有相关代码位于 vllm/distributed/ec_transfer 下。

关键抽象

  • ECConnector – 用于获取由 encoder 生成的 EC cache 的接口。

    • Scheduler 角色 – 检查 cache 是否存在并调度加载。
    • Worker 角色 – 将嵌入加载到内存中。
  • EPD Load Balancing Proxy

    • 多路径调度策略 - 动态地将多模态请求或文本请求分流到对应的推理路径
    • 实例级动态负载均衡 - 基于最少负载策略分派多模态请求,使用优先级队列在各实例间平衡活跃 token 工作负载。

我们使用来自 vllm_ascend/distributed/kv_transfer/kv_p2p/mooncake_layerwise_connector.py 的 MooncakeLayerwiseConnector 创建示例配置,并参考 examples/disaggregated_prefill_v1/load_balance_proxy_layerwise_server_example.py 以促进 P 和 D 之间的 kv 传输。有关 Mooncake 的分步部署和配置,请参阅以下指南:
https://docs.vllm.ai/projects/ascend/en/latest/tutorials/features/pd_disaggregation_mooncake_multi_node.html

对于 PD 分离部分,当使用 MooncakeLayerwiseConnector 时:请求首先进入 Decoder 实例,Decoder 通过 Metaserver 反向触发远程 prefill 任务。Prefill 节点随后执行推理,并将 KV Cache 逐层推送到 Decoder,使计算与传输重叠。传输完成后,Decoder 无缝继续后续的 token 生成。 docs/source/developer_guide/Design_Documents/disaggregated_prefill.md 简要介绍了分离式 prefill 的思路。

限制

  • 如果希望使用跨进程缓存,请禁用 --mm-processor-cache-gb 0

  • 对于 PD 分离部分,请参阅 PD 分解的限制

本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 vl/vllm-ascend