已合并
feat: 抽取原子方法以实现并行编译 wrapper、tiling、kernel #1799
feat: 抽取原子方法以实现并行编译 wrapper、tiling、kernel #1799
已合并
CactiCode创建于 14 天前
CactiCode成员
14 天前

描述

为支持 TorchAir 通过 Inductor 进程池并行调度 AscendC 编译,将原有完整编译入口拆分为可独立调用的 tiling object、kernel object 和收尾链接阶段,同时保留原有完整编译路径的功能行为。

修改内容

  1. 新增 tiling object 编译阶段:只生成并编译 host/tiling 侧 .o,支持源码 split 和 PCH。
  2. 新增 kernel object 编译阶段:只生成并编译 device/kernel 侧 .o,不执行链接。
  3. 新增独立收尾链接阶段:使用已生成的 tiling/kernel object 链接出最终 kernel .so
  4. 保留原有 allhostdevice、JIT、Top-N、PGO、CV fusion、PCH 和静态 shape 重编译路径。
  5. 静态 shape 重编译时复用 tiling object,仅重新生成 kernel object 并重新链接。
  6. 对收尾链接阶段的 object 输入进行校验,避免缺失或不存在的编译产物进入链接流程。
  7. object 路径命名统一为 tiling/kernel 体系:tiling_obj_pathskernel_obj_path 等。
  8. 保留编译阶段耗时打点,覆盖源码生成、tiling/kernel object 编译、链接及静态 shape 重编译。

编译流程

普通 JIT:
    tiling object 编译 ─┐
    kernel object 编译 ─┼── 链接 → kernel.so
    wrapper 编译 ───────┘

完整 all 路径:
    tiling 编译 → kernel 编译 → 链接

静态 shape:
    首次链接 → static shape 检查 → 必要时重新编译 kernel → 再次链接

兼容性

为 TorchAir PR #3595 提供底层 AscendC 原子编译入口;原有完整编译入口仍保留,旧 TorchAir 可继续使用原有调用方式。建议升级顺序:先升级 graph-autofusion,再升级 TorchAir。

如何测试

  1. python -m py_compile 语法检查通过。
  2. compile adapter UT:全部通过。
  3. AscendC 原子编译相关 UT:全部通过。
  4. 相关远程 Hook 检查通过。

核对清单

其他信息

本 PR 相对最新 develop 仅保留以下两个文件改动:

  • autofuse/compiler/python/ascendc_compile.py
  • autofuse/compiler/python/compile_adapter.py

Authored with an AI assistant.

likedislike
Pull Request已成功合入, 合并人@CANN-robot
(感谢 CactiCode 的贡献)
CCactiCode成员
14 天前 创建了 pull request,commit 38ba2a6d
atomgit-bot
atomgit-bot
14 天前 评论:

变更摘要

本 PR 主要针对 Autofuse 编译器的 host 编译与并行调度进行优化,涉及 ascendc_compile.pycompile_adapter.py 两个文件。核心改动包括:新增 --parallel_host_device 参数并改用 parser.parse_known_args 做兼容解析;在 main 中按该参数自适应选择 host/device 并行或串行编译,并移除绑核逻辑改为 OS 调度;host worker 数改为跟随 cpp 文件数动态调整并只保底下界;host 侧由多 cpp 拆分编译改为合并单文件编译;编译命令默认不再捕获输出(丢弃到 DEVNULL)以避免多进程并发时 pipe 拥塞,仅在失败时重试一次并捕获 stderr 用于报错。

主要改动

  • 新增 --parallel_host_device 参数并兼容未知参数: parse_compile_args 新增 --parallel_host_devicestr2bool,默认 False 表示串行),并将 parser.parse_args 改为 parser.parse_known_args,提升命令行参数兼容性。
  • host/device 自适应并行与串行编译: mainparallel_host_device=True 时通过 ThreadPoolExecutor(max_workers=2) 并行执行 compile_host_objscompile_device_obj,否则串行执行;同时移除绑核逻辑(改由 OS 调度),并新增 _skip_acquiredevice_obj_path 等参数在 compile_host_objsbuild_device_solink_kernel_target 间透传已编译的 device 对象。
  • host worker 数动态自适应: 新增 HOST_WORKER_MIN = 2_clamp_host_worker_count,worker 数跟随 cpp 文件数(每 cpp 一线程)只保底下界防退化串行;get_host_compile_worker_count 保留 budget=0 形参以兼容旧调用。
  • host 单文件编译优化: write_host_sources 在有 split marker 时仍生成拆分头文件(供 cpp #include),但将各 cpp 段合并为单个 cpp 文件编译,避免大 kernel 场景下多 cpp 并行抢池退化;compile_host_objs 也相应移除 ThreadPoolExecutor 改为串行逐文件编译。
  • 编译输出处理与失败重试: run_compile_command 在未开启诊断时默认将 stdout/stderr 重定向到 DEVNULL(避免多进程并发编译时 pipe 拥塞导致编译时间暴涨),命令失败时重试一次并捕获 stderr 用于构造报错信息。
likedislike
atomgit-bot
atomgit-bot
14 天前 评论:

代码审查

审查总结

变更文件复核

  • autofuse/compiler/python/ascendc_compile.py — 已逐段复核:run_compile_command 重试逻辑(发现 P3)、build_pch_command 列表拆分(等价、无问题)、_clamp_host_worker_count/get_host_compile_worker_count(发现 P2 UT 回归 + P3 死代码/串行化回退)、compile_host_objs/compile_device_obj(发现 P3 串行化)、build_device_so/link_kernel_target 新增 device_obj_path 参数(发现 P2 UT 破坏)、main 并行/串行 all 流程(线程调度与 PCH/产物路径无冲突,无新增问题)。
  • autofuse/compiler/python/compile_adapter.py — 已逐段复核:parse_compile_argsparse_known_args(发现 P3 静默吞参)、write_host_sources 单文件合并(发现 P3 翻译单元合并风险)。PGO 路径 write_inductor_pgo_sources 未受影响。

发现统计

  • P2(2 个):① get_host_compile_worker_count 丢失 CPU 上限语义,破坏既有 UT test_get_host_compile_worker_count_uses_32_worker_limit;② link_kernel_target 无条件传第 4 个位置参数给 build_device_so,破坏 3 参 mock 的既有 UT test_link_kernel_target_reuses_host_objects_for_static_recompile
  • P3(4 个):③ compile_host_objs 串行化导致多文件(PGO 拆分)host 编译并行度回退,且新增 worker 计数逻辑全部为未接线的死代码;④ run_compile_command 确定性失败双倍执行整条命令,放大失败路径耗时;⑤ parse_known_args 静默忽略拼错/未知参数,可能悄然改变编译行为;⑥ write_host_sources 把多个 cpp 段合并为单一翻译单元,存在跨段符号冲突/粘连风险且无测试覆盖。

整体风险判断

该 PR 的核心改动(host 单文件合并编译、host/device 自适应并行、失败重试)方向明确且注释充分,但存在两类真实回归:一是两处既有单元测试被破坏(P2,CI 会直接变红);二是 host 并行编译的 worker 调度机制被移除却留下整套未接线死代码,且 PGO 多文件路径从并行退化为串行,说明重构未完全收口。建议合入前先修复两处 UT 回归、确认多文件路径的并行度取舍,并对失败重试与单文件合并语义补充测试。

No further issues found in the final sweep beyond the above.

类型 数量
🔴 阻塞 0
🟡 建议 2

💬 仅评论

likedislike
CANN-robotCANN-robot成员
14 天前 添加了label:cann-cla/yes
CANN-robot
CANN-robot成员
14 天前 评论:

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

Congratulations! All modules have met the lgtm and approve requirements.

Module Approval Details

module lgtm status approve status
repo-cann/graph-autofusion yangyongqiang0606, zhang_shengjie, wangxiaotian995 (3/2) yangyongqiang0606 (1/1)

💡 Tip:

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

CLA Signature Pass

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

likedislike
此处折叠了506条消息 查看更多
wangxiaotian995成员
4 天前 评论:

/lgtm

likedislike
CANN-robotCANN-robot成员
4 天前 添加了label:lgtm
yangyongqiang
yangyongqiang成员
3 天前 评论:

/approve

likedislike
CANN-robotCANN-robot成员
3 天前 添加了label:approved
CANN-robotCANN-robot成员
3 天前 合入了pull request