跳到主要内容

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.pyrun_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_idsCOMPUTE 节点分组,每 chip_id 一个 CoreProgram。
  • per-chip COMPUTE emit:抽 emitter 的单核 emit 为公开 emit_single_chip(ops_for_chip) -> CoreProgramcmd_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)不破。

Acceptancecargo 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 被误读为真 overlapA1 边界明确:不碰 DepEngine::Cdma=>0;门控 unvalidated;差分用相对(加速比/容量墙)非绝对
G5×组合法差分不一致若不一致进 iforge-debug 查根因(可能桥的带宽域/字节口径与组合法不一致),不加容差