PD分离¶
背景¶
LLM在线推理服务通常需要满足TTFT和TPOT两项性能指标,而传统的Contiguous Batching调度策略将Prefill和Decode请求混合在一起调度,导致P和D会互相抢占计算资源,影响性能指标无法最大程度的利用计算资源。为解决上述矛盾,将Prefill和Decode两阶段拆分到独立的计算资源并行执行,从而同时降低TTFT和TPOT并提升吞吐量。
功能介绍¶
xLLM PD分离功能主要通过以下三个模块实现:
- etcd: 存储实例信息等元数据
- xLLM Service: 调度请求和管理所有计算实例
- xLLM: 请求计算实例
整体架构图如下: 
功能使用示例¶
使用准备¶
安装相关依赖¶
启动PD分离服务¶
- 启动etcd
- 启动xLLM Service
-
启动xLLM
-
以Qwen2-7B为例
- 启动Prefill实例
/path/to/xllm --model=Qwen2-7B-Instruct \ --port=8010 \ --devices="npu:0" \ --master_node_addr="127.0.0.1:18888" \ --enable_prefix_cache=false \ --enable_chunked_prefill=false \ --enable_disagg_pd=true \ --instance_role=PREFILL \ --etcd_addr=127.0.0.1:12389 \ --transfer_listen_port=26000 \ --disagg_pd_port=7777 \ --node_rank=0 \ --nnodes=1 -
启动Decode实例
需要注意:/path/to/xllm --model=Qwen2-7B-Instruct \ --port=8020 \ --devices="npu:1" \ --master_node_addr="127.0.0.1:18898" \ --enable_prefix_cache=false \ --enable_chunked_prefill=false \ --enable_disagg_pd=true \ --instance_role=DECODE \ --etcd_addr=127.0.0.1:12389 \ --transfer_listen_port=26100 \ --disagg_pd_port=7787 \ --node_rank=0 \ --nnodes=1 -
PD分离需要读取
/etc/hccn.conf文件,确保将物理机上的该文件映射到了容器中 -
etcd_addr需与xllm_service的etcd_addr相同
- 启动Prefill实例
Chunked prefill的Prefill实例支持prefix cache
使用chunked-prefill PD调度器时,Prefill实例已支持prefix cache。开启后,调度器会先匹配已有prefix cache block,再计算当前chunk budget,避免重复计算已缓存的prompt block。
Decode实例开启prefix cache(推荐)
从xLLM v0.x开始,Decode实例支持开启prefix cache。当请求带 best_of > 1 时(best-of-N采样),Decode实例必须开启prefix cache,否则请求会被拒绝。开启后扩展出的候选序列会通过prefix cache复用第一条序列的prompt KV,避免重复算力与显存浪费。
PD分离下的best_of_n支持
- 必要条件:Decode实例
--enable_prefix_cache=true;任意请求best_of > 1+ Decodeenable_prefix_cache=false会被拒绝并返回错误。 - 流程:Prefill实例只对第一条序列做prefill并把KV发到Decode;Decode实例在收到first token后通过prefix cache将prompt KV共享给扩展出的
best_of-1条候选序列。 - MLU平台:暂不支持 PD + best_of_n(受
normalize_mlu限制)。 best_of != n时:流式输出仍会被强制关闭(与non-PD行为一致)。