Open
feat: add npugraph_ex support for MHC expand and head mix #62
feat: add npugraph_ex support for MHC expand and head mix #62
Open
wangjiaxingAdd on 6 days ago
wangjiaxing
wangjiaxingCollaborators
6 days ago

2026-11-09 统一入口与公共核数 helper(52a99e4)

  • 对应评审 199300662,expand 和 head mix 的前后向在 5f331a2 已统一 eager 与编译的注册算子入口。薄 wrapper 继续负责原始标量校验和有效核数传递。
  • 对应评审 199302053,将 resolve_vector_cores 和 validate_vector_cores 移到 src/cann_ops_tilelang/common/compile_utils.py,由两处算子模块共同导入。采用仓库支持的命名空间目录,避免新增包初始化文件触发全量选测。

移动后导入及 setuptools 包发现检查通过,仓库选择器确认增量选中 6 个相关 MHC 文件。Ascend auto/PTO 各 66 项受影响测试通过,覆盖注册、Fake、原始标量、组合重放和配置切换。Ruff、197 文件格式和差异检查通过。下文各 123 项为统一入口改造时的完整回归。


2026-11-09 统一 Custom Op 调用入口(5f331a2)

按 PR #61 更新公共入口。eager 和 torch.compile 共用注册算子,公共 wrapper 处理注册前的校验、输出契约与实际配置。注册后由 _impl 执行真实计算,Fake 按原 schema 推导元信息。

  • expand.py 中,expand 前后向把有效向量核数传入注册算子,保留空输入短路及调用方缓冲区写入。
  • head_compute_mix.py 中,前向在进入注册算子前检查 mhc_pre_eps、token_block_size 的原始类型。反向校验公开标量,再传递按输入设备解析的有效核数。前后向均返回 None。
  • test_mhc_graph_configuration.py 中,Fake 隔离测试改为拦截当前使用的核数解析入口。

NPU 非 benchmark 回归 auto/PTO 各 123 项通过。每后端 21 份证据、76 条图事件记录,确认实际重放且无 eager 回退。新进程导入、Ruff、197 个 Python 文件格式及 diff 检查通过。

以下小节保留此前提交的验证记录。本轮运行范围与结果见上文。


本轮 CodeCheck 整改(7dcb63d,2026-11-05)

针对run#59报告的21项告警整改,本地验证已完成,线上CodeCheck需本提交重跑后确认;Ruff通过不等于线上扫描通过。

原告警 数量 整改
G.CTL.01 返回分支不一致 4 四个公共None返回入口统一显式return None,不混用bare return和return impl(),实际返回语义不变。
重复代码 6 在common目录提供compile_utils.py复用实际核数解析/校验,保持config.py不变;head backward内部实现接受参数包,Fake复用元信息校验并补schema默认值,公共/Custom Op有类型签名保持不变。测试使用公共helper模块命名空间,共用fixture,消除长import/setup块重复。
超大函数 1 提取实际kernel launch记录装配步骤,所有测试函数均不超过50个非空非注释行。
G.TES.01测试helper断言被按生产规则扫描 10 将纯测试helper按test_模块规范命名为test_mhc_graph_utils.py,原40条断言AST完整保留,继续由pytest执行及重写;没有删除断言或申请屏蔽。

本次PR最终为7个文件:两个算子模块、common目录下的compile_utils.py、三份测试文件和一份测试helper。没有夹带其它批次,未改共享config.py、architecture.md或两个kernel,未调整精度/fullgraph/缓存上限/mutation。

验证:auto/PTO各 123 passed /16 benchmark deselected,CPU 25 passed;fixture及命名空间最终调整后auto再验 53项入图测试通过;注册/Fake预检7项通过;Ruff及 197个Python文件格式、diff检查通过。原有40条断言、公有入口和4个Custom Op签名均经审计保留。历史性能数据未在本次重测,不将静态整改声明为性能提升。


PR功能描述 / 为什么需要这个合入

为 expand_to_mhc_forward、expand_to_mhc_backward、mhc_head_compute_mix_forward 和 mhc_head_compute_mix_backward 添加 torch.compile 入图支持,使它们能够参与 npugraph_ex 固定 shape 推理图的捕获与重放。

四个入口保留调用方传入输出/梯度缓冲区的接口及原有 eager 行为:正确声明实际写入参数,不新增 optional out,不改变返回 None 的约定。适配覆盖只读输入、输出覆盖、参数梯度分片归并、空输入和配置变化;原始标量类型在进入 Custom Op schema 前校验,避免 bool/int/float 转换导致 eager 与 compiled 接受范围不同。

本 PR 仅包含计划 PR-B 的四个入口,不包含 Engram、norm_fn、MHC pre/post/Sinkhorn 或多层重计算适配。

各文件修改

文件 修改与职责
src/cann_ops_tilelang/mhc/expand.py 从原入口分离元信息校验和真实执行;注册前后向 Custom Op/Fake;公共 wrapper 在编译时传入实际 vector_cores,impl 直接传给现有 kernel 的 num_vec_cores;保留原 hidden-block/stage 选择、空输入短路、输入输出存储冲突检查和输出覆盖语义。
src/cann_ops_tilelang/mhc/head_compute_mix.py 注册 head affine/sigmoid 前后向及 Fake;前向没有核数配置依赖,因此不附加配置键。反向保留调用方 num_vec_cores、分片输出 shape 和 kernel 参数,用内部显式 vector_cores 校验有效上限;公共编译分支先检查原始标量。
src/cann_ops_tilelang/common/compile_utils.py 本批共用的实际向量核数解析和正整数校验;无字符串失效键,不修改全局配置或在import时初始化设备。
tests/mhc/test_mhc_graph_utils.py 仅供本批四个入口使用的输入/非零输出工厂、独立 reference、autograd 梯度参考、保护区、只读/写入检查和逐次 profiler 事件采集;通过公开算子及 torch.ops 检查注册,不调用生产模块私有 Fake/helper。辅助逻辑按输入刷新、比较和取证拆分。
tests/mhc/test_expand_compile.py 覆盖展开/流维归约的多流、多 shape 和 hidden-block 分支;四轮同址改值/换地址、opcheck、空输入和非法 dtype;前后向与普通 Tensor 运算组成同图,验证结果和真实重放。
tests/mhc/test_head_compute_mix_compile.py 覆盖前后向及参数梯度分片汇总、opcheck、空输入、非法 dtype/原始标量、eps/tile 参数、前后向组合;复用已重放的 compiled 对象后再传非法 bool/float,确认没有图执行和缓冲区改写。
tests/mhc/test_mhc_graph_configuration.py 覆盖向量环境核数 16→20→16、AI 覆盖 8→10→8、环境键删除/非法值、空/非空输入下 caller 核数超过上限,以及 Fake 不查硬件。配置切换记录实际 kernel 参数和逐次捕获/重放;子进程隔离保留父进程的可选 override 原状态。

注册契约与 Fake

入口 实际 mutation 返回
expand_to_mhc_forward output None
expand_to_mhc_backward x_grad None
mhc_head_compute_mix_forward output_mix None
mhc_head_compute_mix_backward input_mix_grad、mhc_scale_grad_partial、mhc_base_grad_partial None

Fake 只使用 Tensor 元信息与传入的有类型核数,不启动 kernel、不读取 Tensor 值、不查询硬件或检查环境文件。真实实现保留运行环境与存储别名检查。向量核内部参数检查整数类型与正值;head backward 同时校验调用方核数、有效上限和两项参数梯度分片的 shape。空 head backward 保持将参数梯度分片清零的原行为;空 expand 不执行设备任务,不以空分支宣称捕获重放成功。

配置追踪与工具链兼容

  • 删除旧批量快照的 _config_key 字符串及私有配置属性依赖,只传实际参与执行或有效性校验的整数。expand 的值贯穿 wrapper→Custom Op→impl→现有 JIT kernel;head backward 的 kernel 仍使用调用方显式核数,内部上限用于同一轮合法性校验。
  • 通过公开 get_num_ai_cores 保留设备选择和 override 语义;编译分支在算子内部读取环境键存在性和值,保留有效范围检查。实测当前 torch_npu 的 os.getenv 日志补丁在设置核数环境变量时会触发 fullgraph 断图,故避免在编译追踪中调用该补丁。
  • 参照当前 master,只有 require_ascend 的环境可用性检查登记为编译常量;实际实现仍执行该检查。可变核数不使用 assume_constant_result,配置测试在同一 compiled 对象内切换和恢复,不清 JIT 缓存或重建对象强迫生效。
  • 为新增/修改文件补完整 MIT 文件头,生产文件保留来源 LICENSE 的 2026 DeepSeek 版权。未改共享 config.py、docs/architecture.md 或两个 kernel 文件。

验证

基于 master 2ded9ae0648ef754a0de8c47f54838b4fba5fa18,最终单提交 f3da407。

检查 结果
Ascend NPU / TileLang auto 123 passed / 16 benchmark deselected
Ascend NPU / TileLang PTO 123 passed / 16 benchmark deselected
CPU 非NPU、非benchmark回归 25 passed
Ruff、src/tests格式、git diff检查 通过,196个Python文件格式通过
图证据审计 每target21份记录;有效设备分支均捕获并重放,无eager回退;配置恢复复用通过
接口与源文件审计 4个公共签名、2个kernel、config.py及architecture.md保持不变
CI依赖模拟 incremental,5个受影响测试文件

这些是本批独立工作区本次运行的结果,不引用之前24算子快照的通过数量。线上CodeCheck/SCA/UT需PR发布后确认。

运行范围为原有 test_expand.py、test_head_compute_mix.py 与新增三份测试文件,非 benchmark 共 123 项(57 项原有、66 项新增),16 项 benchmark 未运行。新增图用例保持 backend='npugraph_ex', fullgraph=True, dynamic=False,检查逐轮真实 acl_graph_capture / acl_graph_replay 及 fx_run_eagerly=0。独立参考沿用原精度:expand 逐项相等,head atol=1e-5, rtol=1e-4;原有测试及精度标准不变。

核数切换在子进程内验证,避免旧配置模块没有状态快照/恢复接口而污染父进程;同一个切换序列内不清 Dynamo/JIT 缓存,切回原值要求复用原图。记录 kernel 实际收到的 num_vec_cores:expand 随 16/20 改变,head backward 保持 caller 的 4,变化的是有效上限。Fake 测试将运行时核数查询替换为抛异常的函数,确认使用显式元信息即可完成验证。

CI 的依赖分析在本地实际运行,结果为 incremental,选中上述 5 个测试文件;没有修改选择器、CI 配置、测试级别、benchmark 或显存画像。

实际测试命令(已加载下述 CANN/配套工具链,分别设置 TILELANG_DEFAULT_TARGET=auto 和 pto):

OPS_TILELANG_TEST_LEVEL=0 OMP_NUM_THREADS=1 OPENBLAS_NUM_THREADS=1 \
python -m pytest tests/mhc/test_expand.py tests/mhc/test_head_compute_mix.py \
  tests/mhc/test_expand_compile.py tests/mhc/test_head_compute_mix_compile.py \
  tests/mhc/test_mhc_graph_configuration.py -m 'not benchmark' -x -v --tb=short

实机环境与支持边界

  • Ascend 950DT_9574,CANN 9.3.0,Python 3.12.3,torch 2.10.0+cpu / torch_npu 2.10.0。
  • TileLang 0.1.15+cpu.git194c1b89,配套 TileLang PTO overlay、PTOAS VMI 0.1.9 和 helper compatibility commit 7c7032b55ecc6b9dfa7c4c9412c93d587d4d3547;auto/PTO 均在已加载 CANN 的配套环境运行,不代表任意默认 PTO 安装已验收。
  • 固定 shape、显式前后向推理调用;图测试使用一致 torch.inference_mode(),autograd 数值参考在其外运行。没有新增自动 autograd、.backward() 图捕获、动态 shape 或多设备验收声明。
  • 本次未重测性能。此前批量快照的单算子测试中这些入口慢于直调,不能用入图功能通过宣称本提交已获得单算子或整网加速;更完整性能收益仍需另行测量。

AI assistance: OpenAI Codex / GPT-6,负责封装、整改、测试和描述;范围及提交由人工指定并授权。

likedislike
Merge blocked
wangjiaxingwangjiaxingCollaborators
6 days ago Created pull request, commit 658843a9
wangjiaxing
wangjiaxingCollaborators
6 days ago Comments:

/compile

likedislike
wangjiaxingwangjiaxingCollaborators
6 days ago Pre merge succeeded (commit_id: 4657cb1181a1b398a5d4de1faf49a1c817859e82)
CANN-robotCANN-robotCollaborators
6 days ago Added label: cann-cla/yes
CANN-robot
CANN-robotCollaborators
6 days ago Comments:

Thanks for your pull-request.
The full list of commands accepted by me can be found at here.
You can get sig-info at here.
You can self-configure the PR merge rules for this repository. For more details, please refer to Here.
For more, you also can visit HICANN.


PR Approval Progress

⚠️ This PR does not yet meet the following requirements:lgtm (requires ≥ 2 person(s) per module)、approve (requires ≥ 1 person(s) per module)

Module Approval Details

module lgtm status approve status
repo-cann/ops-tilelang ❌ (0/2)(You can also ask: 蒋礼锐, 刘丹, 马兵, ChaoyangJi, jiawei_zhuang) ❌ (0/1)(You can also ask: kevin365, 刘丹, ChaoyangJi, 黄俊健, 蒋礼锐)

💡 Tip:

  • Committer can comment /approve or /lgtm
  • Commenting /approve implies both code review (lgtm) and intent to merge (approve)

CLA Signature Pass

gcw_Co0B5I37, thanks for your pull request. All authors of the commits have signed the CLA. 👍

likedislike
94 messages are collapsed here。 See more
CANN-robotCANN-robotCollaborators
18 hours ago Removed label: ci-pipeline-failed
CANN-robotCANN-robotCollaborators
18 hours ago Added label: ci-pipeline-running
CANN-robotCANN-robotCollaborators
12 hours ago Removed label: ci-pipeline-running
CANN-robotCANN-robotCollaborators
12 hours ago Added label: ci-pipeline-failed
CANN-robot
CANN-robotCollaborators
12 hours ago Comments:

流水线分析报告 — ops-tilelang run#144

流水线: https://gitcode.com/cann/ops-tilelang/actions/runs/b80b698bff7c471fa9e78dece6ec875b | PR#62 | 2026-11-11 11:24:56 ~ 17:28:17 | 失败 Job 1 个

定界结论: 环境问题 / Runner机器异常(任务排队超时,非代码问题)
  • 失败类型: 环境问题(可重试)
  • 根因: ST_test 调度后长时间处于 Queued 状态,超过排队上限(300s 配置,实际滞留约 6 小时)后被平台按 CP.COMP1105 任务排队超时 终止;该 Job 的 Checkout/download/run_st_test 步骤均未产出任何日志,说明任务从未真正开始执行。
  • 处置建议: ① 直接重新触发流水线(平台调度/执行机资源问题,可重试);② 若 ST_test 持续排队超时,请联系 CI 维护者检查执行机资源池配置与网络(同日志 RootCause/Solution 提示:检查执行机配置或网络)。
  • 排除项: 其余 11 个 Job 全部 COMPLETED(Test_image / Test_get-pr / Test_pre_pipeline / Test_get-shell / Antipoison / CodeCheck_style / SCA / CodeCheck_check-pr / CodeCheck / CodeCheck_precommit / Test_finish),无编译、CodeCheck、SCA 类失败,PR 代码未暴露问题。

失败根因分析

根因 #1: 环境问题 / Runner机器异常 — ST_test 排队超时(CP.COMP1105)
  • 判据: queued state timeout|任务排队超时(判据库 环境问题/Runner机器异常)
  • 定位步骤: 0_初始化步骤.log(ST_test 仅此步骤有日志)
  • 影响 Job: ST_test(1/12,start_time 为空、duration 为空 → 未实际启动)
  • 根因证据(日志原文):
[2026/11/11 11:27:55.411 GMT+08:00] [INFO] Job(74d25dd7739540a2a0d5e2b469ebf14a_1570036610248491045) duration check: true
[2026-11-11 17:27:55.652+08:00] [ERROR] [server] - Queued state timeout, job_run_id: 74d25dd7739540a2a0d5e2b469ebf14a_1570036610248491045, state: Queued, timeout_seconds: 300
[2026-11-11 17:27:55.840+08:00] [ERROR] [server] - [CP.COMP1105][Description] 任务排队超时[Description_en] Queued timeout.(addition_en) Queued state timeout, ... [RootCause] 可能是执行机配置或者网络问题。[Solution] 请检查执行机配置或者网络。
  • 补充说明: 1_Checkout.log / 2_download.log / 3_run_st_test.log / 4_后处理步骤.log 均为空,进一步确认失败发生在排队阶段而非构建/测试阶段,无代码侧错误可归因。
结构化定界摘要
[
  {
    "repo": "ops-tilelang",
    "run_number": 144,
    "Failed_Type": "环境问题",
    "Failed_Sub_Type": "Runner机器异常",
    "Failed_Reason": "ST_test 调度后长期处于 Queued 状态,超过排队上限(300s)被平台以 CP.COMP1105 任务排队超时终止;该 Job 各执行步骤无日志,未实际开始执行,属执行机资源/调度问题,非代码问题。",
    "evidence": "[ERROR] [server] - [CP.COMP1105][Description] 任务排队超时[Description_en] Queued timeout.(addition_en) Queued state timeout, state: Queued, timeout_seconds: 300",
    "suggestion": "直接重新触发流水线;若持续排队超时,请联系 CI 维护者检查执行机资源配置与网络。",
    "jobs": "ST_test"
  }
]

由门禁失败定界分析自动生成 | repo: ops-tilelang | run: b80b698bff7c471fa9e78dece6ec875b | PR#62

likedislike