Prefill Context Parallel (PCP) 与跨节点 PCP
概述
Prefill Context Parallel (PCP) 是将长序列的 prefill 计算切分到多个设备上并行执行的策略,用于支持超长上下文场景。PyMotor 完整集成了 PCP 以及跨节点的 PCP 编排能力。
- 单节点 PCP:PCP rank 全部在同一节点的多张 NPU 上,PyMotor 通过
engine_config中的prefill-context-parallel-size参数自动将配置透传给 vLLM 引擎。 - 跨节点 PCP:PCP rank 分布在多个节点的 NPU 上,PyMotor 自动化处理节点注册、主从分配、通信地址注入等全流程。
关于 vLLM Ascend 跨节点 PCP 的底层原理与参数说明,请参考 vLLM 社区文档: 👉 长序列上下文并行的多节点部署
跨节点 PCP 在 PyMotor 中的使用
用户配置
用户只需在 engine_config 中添加 nnodes 和 master-port 两个字段,其余参数由 PyMotor 自动管理:
{
"motor_engine_prefill_config": {
"engine_type": "vllm",
"engine_config": {
"model": "/mnt/weight/your_model",
"tensor_parallel_size": 16,
"data_parallel_size": 1,
"prefill-context-parallel-size": 2,
"cp-kv-cache-interleave-size": 128,
"nnodes": 2,
"master-port": 7001
}
}
}
| 字段 | 说明 |
|---|---|
nnodes |
PCP 组包含的节点数。每个 PCP 组内 nnodes 个节点协同完成跨节点上下文并行 |
master-port |
PCP 主节点(node_rank=0)的通信端口 |
prefill-context-parallel-size |
全局 PCP 并行度。PyMotor 会自动计算每节点贡献的 PCP rank 数 |
cp-kv-cache-interleave-size |
CP KV cache 交错粒度,控制 PCP rank 间 KV cache 的分片大小 |
PyMotor 自动管理的参数
以下 vLLM 原生参数由 PyMotor 自动推导和注入,无需用户手动配置:
| 参数 | 自动管理方式 |
|---|---|
node-rank |
Controller 按 NodeManager 注册顺序分配(每 nnodes 个节点为一组,组内从 0 开始编号) |
master-addr |
自动复用首注册节点(node_rank=0)的 IP 地址 |
headless |
node_rank != 0 的从节点自动追加,跳过 API 服务器启动 |
data-parallel-rank |
由 Endpoint ID 决定 |
data-parallel-address |
由 Controller 根据组装结果确定 |
控制面流程
- 注册:各节点 NodeManager 启动后向 Controller 注册,携带
nnodes参数 - 组装:Controller 等待
dp_size × nnodes个节点全部注册完成 - 主从分配:按注册顺序每
nnodes个节点为一组,组内首个为主节点(node_rank=0),其余为从节点 - 启动命令下发:Controller 向各 NodeManager 下发差异化 StartCmdMsg,包含各自的
node_rank和master_dp_ip - 引擎拉起:主节点启动完整 EngineCore + API Server;从节点仅启动 Worker 进程(headless 模式)
DP 叠加 PCP
支持 data_parallel_size > 1 与跨节点 PCP 组合使用。例如 DP=4、PCP=2、每节点 16 卡时,总共需要 4 × 2 = 8 个节点。Controller 会等待全部 8 个节点到齐后统一组装并下发启动命令。
从节点 SimInference 处理
跨节点 PCP 的从节点不启动 API 服务器(headless 模式),MgmtEndpoint 的 /status 健康检查通过 NPU AICore 使用率监控实现,虚拟推理请求自动禁用。
调度模式(Coordinator 侧)
推荐使用 MooncakeConnectorV1(非 layerwise)+ cpcd_separate 调度模式。 Layerwise connector 在 CP 场景下存在 KV transfer 的 block 切分兼容性问题,不推荐使用。
"motor_coordinator_config": {
"scheduler_config": {
"deploy_mode": "cpcd_separate"
}
}
| KV Connector | 调度模式 | 推荐? | 说明 |
|---|---|---|---|
MooncakeConnectorV1 |
cpcd_separate |
✅ 推荐 | 非 layerwise connector 配合 CPCD 调度模式,block 切分与 CP 场景兼容 |
MooncakeLayerwiseConnector |
pd_separate |
❌ 不推荐 | Layerwise 按层拆分 KV 传输,与 CP 场景存在兼容性问题 |
注意:若使用
MooncakeConnectorV1时配为pd_separate,会走SeparateCDPRouter路由,其 KV transfer 的 block 切分逻辑与 CP 场景不兼容,导致两类断言失败:
- Prefill 侧:
assert len(selected_p_cp_groups) == len(selected_d_cp_groups)— CP group 数量不匹配- Decode 侧:
assert num_external_tokens == 0—remote_block_ids为空但num_external_tokens > 0,非 layerwise connector 的 block 分配与 CDP 调度不一致
引擎配置映射
CLI 参数与 engine_config 键名的完整映射关系详见: