已关闭
[Requirement|需求建议]: MC2 算子官方测试套件增加 batch-invariance (BI) 测试维度 #2956
bruceligit创建于  6月6日关闭于  9月5日
bruceligit
6月6日 创建

背景

近期 PR #6373 修复了 AllGatherMatmulV2 在 V300 + MXFP8 + 变化 x2_scale 场景下的 batch-invariance (BI) 缺陷(原 issue #2872)。该缺陷的根因是 op_kernel 中存在 LOCAL 与 GATHER 两条独立 cube 路径(MatMulASWKernel + Mc2QuantBatchMatmulASWKernel),二者在 K-loop 累加调度上存在差异,导致同一逻辑输出 slot 在跨 rank 时 byte 不一致。

但在排查过程中我们发现:当前官方测试套件(UT + ATK ST)的 standard 字段只覆盖 acc(数值精度对比 reference)和 perf(性能阈值),不包含 batch-invariance 这一性质的测试。这意味着:

  1. PR #6373 修复的这类 bug 无法被现有 CI 在合入前拦截——只要 acc 在 tolerance 内 + perf 不退步就能过 ST,但用户在训练场景下仍会观察到 reproducibility 失败
  2. 后续新增的 MC2 算子(fused comm + matmul)容易复现同类 anti-pattern(2-class kernel split / 不同 SplitType template 实例化)但 CI 不报警
  3. 训练框架(如 verl/Megatron-LM)依赖 batch-invariance 做 gradient reproducibility 时,官方 release 算子的 BI 状态目前没有任何形式化保证

问题陈述

文献意义上的 batch-invariance 定义(参考 https://thinkingmachines.ai/blog/defeating-nondeterminism-in-llm-inference ):

y[i] = f(x[i], W)

输出第 i 行仅依赖于输入第 i 行 + 共享权重 W,
与同一 batch 中其他行的内容无关

这与团队内部「跨 rank/trial 一致性」(即 determinism)是 正交且更强 的性质:

  • 一个 op 可以满足 deterministic(同输入 → 同输出)但 不满足 literature-BI(行间相互影响)
  • pre-fix 的 AllGatherMatmulV2 就是这种情况:跨 rank 给定相同 input 时输出一致(passes determinism),但 row i 的输出会随同 batch 其他 row 内容改变(fails literature-BI)

现有官方 UT/ST 只覆盖前者,不覆盖后者。

提议

为 MC2 fused-comm-matmul 系列算子的官方测试套件 新增 BI 测试类别,至少覆盖以下 6 个算子:

Op 编号 路径 dtype 路径
op-1 mc2/all_gather_matmul_v2/ MXFP8 / FP8 / INT8
op-2 mc2/matmul_reduce_scatter_v2/ MXFP8 / FP8 / INT8
op-3 mc2/allto_allv_quant_grouped_mat_mul/ MXFP8 / FP8 / INT8
op-1 BF16 mc2/all_gather_matmul/ BF16 / FP16
op-2 BF16 mc2/matmul_reduce_scatter/ BF16 / FP16
op-3 BF16 mc2/allto_allv_grouped_mat_mul/ BF16 / FP16

建议先以 op-1 作为参考实现(最有代表性,PR #6373 的修复对象),其余 op 逐步覆盖。

测试方法学

每个 BI cell 的 contract 定义:

# Variant A:target row i 固定为内容 C,其他 row 用 seed_A 生成
# Variant B:target row i 同样固定为内容 C,其他 row 用 seed_B 生成
# BI 断言:byte(y_A[i]) == byte(y_B[i])

建议矩阵参数:

  • WorldSize:{2, 4, 8}(最少 3 个值;op-3 仅 {8, 16} 因官方 epWorldSize 约束)
  • M_per_rank:{1, 4, 8, 16, 32, 64}(覆盖小 batch + 跨 baseM=16 边界)
  • K:{128, 256, 512, 1024, 2048}(多次跨 cube baseK=128 tile 边界)
  • N:{64, 128, 256, 512}(含 baseN=64 边界)
  • 目标 row 位置:{0, mid, last}(验证非首行 + 非末行)
  • 量化 scale 组合(MXFP8 路径):{(ID, ID), (ID, VAR), (VAR, ID), (VAR, VAR)} —— VAR 指 K-axis varying scale,是已知的 BI 触发条件
  • HCCL_DETERMINISTIC:true 和 false 都测,作为通信层 sensitivity check

ATK 框架集成建议

  1. 在 ST case JSON 的 standard 字段新增 'bi' key:

    {
      "name": "allgather_matmul_v2_bi",
      "standard": {
        "acc": "cv_fused_double_benchmark",
        "perf": [0.95, 0.95],
        "bi": {"row_positions": [0, "mid", "last"], "n_variants": 2}
      },
      "inputs": [...]
    }
    
  2. ATK executor 增加 _run_bi_check 钩子:variant A + variant B 的输入构造与现有 acc check 同构,仅 target row 固定 + 其他 row 不同 seed

  3. CI Pass/Fail:每个 BI cell 输出 byte-diff count;> 0 即 fail

我们已完成的验证数据

为证明方法学可行 + null-result baseline 可达,我们在外部硬件上跑了如下规模的 BI matrix:

平台 路径 Cell 数 Post-fix BI failures
V300 (arch35) op-1/2/3 MXFP8 ~4730 0
A3 / V220 (arch22) op-1/2/3 BF16 ~1176 0

如果官方测试套件接入这套方法学,PR #6373 修复前的 op-1 会在 BI = VAR x2_scale + WS=2 + M_per_rank=4 这类小 case 上立刻报 fail,从而被 CI 拦截。

工作量评估

  • 设计 'bi' standard schema:约 0.5 人日
  • 修改 ATK executor 支持 BI check:约 1 人日(取决于 ATK 框架开放程度)
  • 为 op-1 添加约 30 个 cells 的 BI ST case:约 0.5 人日
  • CI wall-clock 影响:每 op +5~10 min(WS=2/4/8 × ~10 cells)

关联

期望讨论

  1. ATK 框架是否预留了扩展 standard 字段的机制?还是建议作为独立 tests/bi/ 目录单独走?
  2. BI 测试与 acc 测试是否可以复用同一组 input data?还是需要独立构造(target row 固定 + 其他 row 变化)?
  3. 是否优先支持 MXFP8 路径(V300 新增),还是同时覆盖 BF16 / FP16 / INT8 等已有路径?
  4. 我们是否可以直接提交一份针对 op-1(或 op-2)的参考 PR 供讨论?

我们愿意在设计方向对齐后,为 mc2/all_gather_matmul_v2/(或 mc2/matmul_reduce_scatter_v2/)提交参考 PR。请评审 ATK 集成方式偏好。

likedislike
huang-chuhong成员
6月6日 评论:

/assign @wang-minbo

likedislike
CANN-robotCANN-robot成员
6月6日 将 wang-minbo 设为负责人
Hhuang-chuhong成员
6月6日 将 macech 设为负责人
Bbruceligit
6月9日 关联了pull request:test(matmul_reduce_scatter_v2): add BI test suite for issue #2956
bruceligit
6月9日 评论:

更新:参考 PR 已开 — #6593(针对 matmul_reduce_scatter_v2,natively BI-clean 算子用作 positive baseline)。

PR 中包含修正后的方法学(issue 原始描述中没有强调的关键点):

Phase 0 + Phase 1 + Phase 2 三步流程

  • Phase 0: HCCL warm-up(N_WARMUP=2 次 dummy 调用)—— 跳过 worker 冷启动时的 HcclAllocComResourceByTiling failed + 非确定 ring 拓扑选择
  • Phase 1: Multi-trial determinism baseline(每 variant N_TRIALS=3 次)—— catch trial 非确定性
  • Phase 2: Variant A vs B BI 检查 —— 仅在 Phase 1 通过后比较

三态输出(不能混淆)

状态 含义
BI_PASS det baseline 通过 + A == B
BI_FAIL 真 BI 违例
NON_DETERMINISTIC 同 input 多次跑不一致 → 测试系统问题(HCCL state / 共享 NPU / 硬件),不能简单判 BI fail
ERROR op-plugin shape rejection 或基础设施故障

关键教训: 2026-06-06 在 V300 上调研发现,省略 Phase 0+1 的早期版本会在 op-2 (matmul_reduce_scatter_v2) 上产生 10/18 cells "BI fail" 的假阳性(实际是冷启动 HCCL 非确定性),加上 Phase 0+1 后变成 24/24 BI_PASS。这个发现导致 issue 中提议的 standard.bi schema 需要支持 n_warmup + n_trials 参数。

跨 3 ops 验证数据(已在 V300 host 完成)

  • op-1 post-PR-#6373: 378 BI_PASS / 0 BI_FAIL / 0 NON_DET
  • op-2 (本 PR 对象): 72 BI_PASS / 0 BI_FAIL / 0 NON_DET
  • op-3 (WS=8 only): 12 BI_PASS / 0 BI_FAIL / 0 NON_DET
  • 合计 462 cells,全部 BI_PASS

ATK 集成方式仍待 maintainer 评估,PR 当前作为 standalone driver 提供方法学可执行规范。

likedislike
Wwang-minbo成员
6月10日 将 SuperYuan 设为负责人
wang-minbo成员
6月10日 评论:

您好,您的问题是基于A2, A3,还是A5版本

likedislike
Wwang-minbo成员
6月10日 将 captainmiaow 设为负责人
ZZYuan
ZZYuan成员
6月10日 评论:

您的需求我理解包含两部分:

  1. 希望MC2算子支持BI
  2. 希望测试套支持BI测试
    其中1.我们希望您能提供更详细的信息,比如您希望在哪些产品形态上支持BI、以及您的使用场景(batch一致性对您的价值)
    关于2,我在ATK测试套的仓库中同步了您的需求:https://gitcode.com/Ascend/ATK/issues/5
    如果有其他问题欢迎您补充
likedislike
bruceligit
6月23日 评论:

您好,您的问题是基于A2, A3,还是A5版本

@wang-minbo

您好,是A5版本

likedislike
bruceligit
6月24日 评论:

您的需求我理解包含两部分:

  1. 希望MC2算子支持BI
  2. 希望测试套支持BI测试
    其中1.我们希望您能提供更详细的信息,比如您希望在哪些产品形态上支持BI、以及您的使用场景(batch一致性对您的价值)
    关于2,我在ATK测试套的仓库中同步了您的需求:https://gitcode.com/Ascend/ATK/issues/5
    如果有其他问题欢迎您补充

@SuperYuan

是的,希望支持这两部分。
希望在Qwen3-30B-A3B模型、Qwen3.5-35B-A3B模型推理上实现BI。使用场景来自外部客户需求。此外,BI对训推一致性、训练稳定性有帮助。

谢谢

likedislike
Bbruceligit
9月5日 issue状态由 进行中 改变为 已解决
Bbruceligit
9月5日 关闭了 issue