CP 多芯片桥 A1 实现计划
基于:discuss 共识(含独立对抗修正)+ G5-计算算子建模方法分层设计规格 顺序约束"修错带宽域先于加算子"步。无专属 A1 spec(A1 是该 spec 顺序步的实现、无新抽象,设计源自 discuss 共识——记为风险)。 日期:2026-06-22 状态:Done
目标
CP 的跨 rank 通信从「run_g5_pipeline → simulate_single_chip → 片内 SDMA(src=dst=0,错带宽域)」改为「rank-aware 桥 → simulate_multi_chip → 真 c2c(topology_path_key 路由)」,带宽域修对。只做 A1:overlap 仍聚合 max(不碰 DepEngine::Cdma=>0 硬核,那是 A2)。
Dependencies
- 现有多芯片栈
simulate_multi_chip(chips_dict, MultiChipProgram, network_graph, routing_strategy)可用;comm_primitive_pipeline.py是现成调用模板。已核实(setup.rs:174-199 + multi_chip.rs:132-143):simulate_multi_chip 通用执行每芯片非空 CoreProgram(逐 chip load_instructions + try_issue_all + 处理 TiuFinish/DmaFinish/HauFinish),不只纯通信——A1 的真 compute + comm 同跑成立。 - DistributedModel 已有
DistributedOp.chip_ids/rank_map/ COMM 节点topology_path_key(c2c/b2b/intra_noc)/deps(A1 不用 deps)。 - Rust 改后
maturin build --release+ pip install + 覆盖根目录g5_rs.cp314-win_amd64.pyd(根目录副本遮蔽,见记忆 project_g5_pyd_shadowing)。
文件变更概览
| 文件 | 改动 |
|---|---|
perfmodel/mapping/g5/multi_chip_bridge.py(新增) | rank-aware 桥:DistributedModel → MultiChipProgram(按 chip_id 分组 per-chip CoreProgram + COMM 节点仅转 CommOp、排除出 SDMA emit) |
perfmodel/mapping/g5/instruction_emitter.py | 抽出 per-chip 的 COMPUTE op emit 逻辑供桥按芯片复用(现 emit 塌单核) |
perfmodel/evaluation/g5/pipeline.py | run_g5_pipeline 路由:多芯片(network_graph + >1 chip)走桥 + simulate_multi_chip;否则单芯片(现路径) |
tests/evaluation/g5/test_cp_multichip_e2e.py(新增) | CP prefill/decode 走多芯片、跨 rank 通信走 c2c 非 SDMA、G5×组合法差分 |
Rules Compliance
- no-backward-compat:CP 路由改成多芯片是替换 CP 路径,不写
if old_single_chip分叉;非 CP(单芯片场景)本就走单芯片,不是兼容分支。 - config 禁默认值:桥读 DistributedModel 字段缺失(COMM 节点 chip_ids 空 / participants<2)raise 带 op_id,不兜底。
- strict 无容差:差分/守恒断言严格相等(项目 feedback)。
- 不碰
DepEngine::Cdma=>0:A1 边界,overlap 聚合 max。 - Rust 改后 maturin 重建 + 覆盖根目录 pyd。
无 Complexity Tracking 偏离。
实现步骤
Task 1 [Sequential,基础] — rank-aware 桥(DistributedModel → MultiChipProgram)
新建 multi_chip_bridge.py:把 DistributedModel 按 rank 拆成多芯片程序。
- 分组:按
DistributedOp.chip_ids把 COMPUTE 节点分组,每 chip_id 一个 CoreProgram。 - per-chip COMPUTE emit:抽 emitter 的单核 emit 为公开
emit_single_chip(ops_for_chip) -> CoreProgram,cmd_id 每 chip 独立从 0(现 emit 硬编 core_id=0 + cmd_id 全局自增,要改)。 - COMM 节点 → CommOp:COMM 节点只转 CommOp(participants=chip_ids、comm_type、data_bytes=comm_bytes),绝不进 per-chip COMPUTE emit——现 emitter 会把 COMM 节点 emit 成 SDMA,桥分组时必须排除 COMM,否则同一通信被双算(SDMA + CommOp)。
- 带宽域 c2c 由 simulate_multi_chip 路由保证:CommOp 无 topology_path_key 字段;c2c 带宽域由 simulate_multi_chip 把 participants 经 network_graph + routing_strategy 路由到 tier6 C2C/PAXI 自动成立,桥只需填对 participants。
- 组装
MultiChipProgram{chip_programs: {chip_id: CoreProgram}, comm_ops: [CommOp]}+ chips_dict。 - 校验门:COMM 节点
chip_ids为空或 participants<2 → raise 带 op_id(不硬编兜底)。
Acceptance:给一个 cp=4 的 CP DistributedModel,桥产出 4 个 chip 的 CoreProgram(各含本 rank 的 compute、cmd_id 各自从 0)+ comm_ops(pass-KV);COMM 节点不出现在任何 CoreProgram 的 SDMA 里(无双算);comm 字节守恒(总 = Σ per-rank)。单测直接构造 DistributedModel 验证桥输出结构。
Task 2 [Sequential,依赖 1] — run_g5_pipeline 路由到多芯片
pipeline.py:CP/多芯片时走桥 + simulate_multi_chip。
- 判据:network_graph 非 None 且参与 chip 数 > 1(多芯片)→ 走桥 +
engine.simulate_multi_chip(chips_dict, program, network_graph, routing_strategy);否则现单芯片路径。 - chips_dict = {chip_id: chip}(参与芯片)。
- 复用 comm_primitive_pipeline 的 simulate_multi_chip 调用模板(progress/cancel)。
Acceptance:CP(cp>1)评估路由到 simulate_multi_chip;单芯片场景(cp=1 或无 network_graph)仍走 simulate_single_chip。加单测验证路由分支。
Task 3 [Sequential,依赖 1,2] — CP 端到端 + 带宽域验证
test_cp_multichip_e2e.py:CP 走多芯片真路径的端到端 + 差分。
- 通信侧严格无容差:跨 rank 通信走 tier6 C2C、无 src=dst=0 的 SDMA;通信字节守恒(总 = Σ per-rank,严格相等)。
- compute 侧相对一致(非绝对):组合法 compute 是解析扫 R、G5 多芯片是真 matmul cycle,绝对加速比不必相等——验"加速比随 cp 单调性",不做绝对加速比严格相等(否则口径不匹配伪红)。
- prefill + decode 都跑通多芯片路径。
Acceptance:CP prefill/decode 走多芯片;通信侧严格(走 c2c、无 SDMA、字节守恒);compute 侧加速比随 cp 单调下降与组合法方向一致。
实施落点(test_cp_multichip_e2e.py):prefill 守恒全 0(T3.1/T3.2/T3.4)+ decode 走多芯片守恒全 0(T3.5)+ compute_time 随 cp(2/4/8) 严格单调下降(T3.3,无容差)。
容量墙位置数值对比降级为局限:A1 overlap 聚合 max,comm 被算力隐藏(实测 comm≈0),组合法又走未标定 R 解析扫,二者绝对口径不可比;数值匹配须引容差 + R 标定 = 伪测试,故不做。该对比留 A2(真 overlap 涌现 + 真机标定 R)后再做。
Task 4 [Sequential,依赖 2] — 回归
- 组合法路径(docs/validation/上下文并行收益验证)不破。
- comm-primitive 多芯片基准不破。
- 单芯片 LLM 其他场景(非 CP)不破。
Acceptance:cargo test 全绿 + pytest tests/evaluation/g5/ 全绿 + 组合法/comm-primitive 抽样跑通。
验证计划
- 单元:桥输出结构(Task 1)、路由分支(Task 2)。
- 集成:CP 多芯片端到端 + 带宽域走 c2c(Task 3)。
- 差分:通信侧守恒/带宽域=c2c 严格相等;compute 侧加速比单调性/容量墙位置与组合法相对一致(不做绝对加速比严格相等,因组合法解析扫 R vs G5 真 matmul cycle 口径不同)。
- 回归:组合法/comm-primitive/单芯片 LLM 不破(Task 4)。
- 改 Rust(若 emitter 抽取涉及 Rust)后 maturin 重建 + 覆盖根目录 pyd。
风险与回退
| 风险 | 缓解 |
|---|---|
| 桥反向 import emitter 私有逻辑 | Task 1 先抽 per-chip COMPUTE emit 为公开方法 |
| COMM 节点被双算(SDMA + CommOp) | Task 1 分组时排除 COMM 出 per-chip COMPUTE emit,COMM 只走 CommOp |
| COMM 节点 chip_ids 空 / participants<2 | 桥 raise 带 op_id,停下报告 |
| 路由判据误把单芯片场景路由到多芯片 | Task 2 判据 = network_graph 非 None 且 chip 数 >1,单测覆盖 cp=1 |
| overlap 聚合 max 被误读为真 overlap | A1 边界明确:不碰 DepEngine::Cdma=>0;门控 unvalidated;差分用相对(加速比/容量墙)非绝对 |
| G5×组合法差分不一致 | 若不一致进 iforge-debug 查根因(可能桥的带宽域/字节口径与组合法不一致),不加容差 |