已合并
[v2.10.0][feature]support environment_variable TORCH_NPU_CPU_FALLBAC #44801
Dring创建于 8月18日
[v2.10.0][feature]support environment_variable TORCH_NPU_CPU_FALLBAC #44801
已合并
Dring创建于 8月18日
Dring成员
8月18日

【合入来源】

如有社区issue,请关联issue链接
请勿携带内部流程信息(需求链接、问题单、内部issue等)
https://gitcode.com/Ascend/pytorch/issues/4137

  • [✓ ] 需求
  • [✕ ] 问题单
  • [✓ ] issue/工单
  • [✕ ] 重构优化
  • [✕ ] 资料更新

【修改方案】

请描述修改内容的具体实现,涉及哪些组件之间进行交互,可以用1、2、3、...进行罗列
如果是需求或者重构类的PR,需要补充详细设计文档(说明上下游组件关系、时序图、类图、DFX能力等内容)

当前 torch_npu 在 NPU 算子缺少后端实现时,可能通过 PyTorch PrivateUse1 backend fallback 将输入复制到 CPU 并执行 CPU kernel。部分已经注册 NPU kernel 的实现,也会因为 dtype、参数、SoC 或 CANN/AclNN 接口能力不足,在函数内部主动执行 CPU 计算。

这类行为提高了模型兼容性,但可能掩盖 NPU 算子覆盖缺口,引入不可见的同步、D2H/H2D 传输和性能长尾。用户目前缺少统一手段判断模型是否发生了隐式 CPU 主计算,也无法在 CI、性能验收或算子覆盖检查中禁止该行为。

本 RFC 提议新增进程级环境变量:

TORCH_NPU_FALLBACK_CPU_DISABLE=0 # 默认值:允许已纳管路径 fallback 到 CPU
TORCH_NPU_FALLBACK_CPU_DISABLE=1 # 严格模式:已纳管路径准备执行 CPU 主计算时直接报错

第一版覆盖:
torch_npu Dense PrivateUse1 全局 backend fallback。
torch_npu Sparse CSR sum/prod 显式 CPU fallback。
op-plugin ops/opapi 中确认属于 fallback 语义的 AclNN/opapi CPU 路径。
第一版明确不覆盖:
op-plugin ops/aclops 中的 ACL Op 实现。
用户显式 .cpu()、.to("cpu") 和 Host↔NPU copy。
shape、状态、控制 tensor、错误码等 Host 控制逻辑。
算子定义本身要求 Host 执行的预处理或格式转换,例如 INT4/FP4 权重 bit-pack。
Inductor lowering/fusion fallback 本身。

【资料变更】

请确认是否涉及资料变更。如涉及,需要在PR中体现,并简要说明修改内容。如不涉及,需填写“不涉及”

不涉及

【接口变更】

请确认是否涉及跨代码仓或者客户面可见的接口变更。如涉及,需要详细说明接口以及对应的变更内容,同时需要在资料中体现。如不涉及,需填写“不涉及”

不涉及

【功能验证】

说明测试场景,测试方法。如果本次测试方式与常规单元测试不同,请详细说明您的测试步骤
新增/变更内容是否已新增/适配UT测试用例看护,并补充测试自验证截图

【CheckList】

PR提交人对以下CheckList自检项进行全量自检,自检通过或不涉及,均修改 [ ] 为 [x]

  • [✓ ] 代码注释完备,正确记录错误日志
  • [✕ ] 代码实现进行了返回值、空指针等校验
  • [✓ ] PR标题正确使用类型标签,如:feat、fix、refactor、docs、test等
  • [✓ ] PR持续集成流水线(CI)执行通过,代码检查无异常
likedislike
Pull Request已成功合入, 合并人@ascend-robot
(感谢 Dring 的贡献)
DDring成员
8月18日 创建了 pull request,commit 120c2dde
atomgit-bot
atomgit-bot
8月18日 评论:

变更摘要

本 PR 为 torch_npu 新增进程级环境变量 TORCH_NPU_CPU_FALLBACK(默认值 1,即默认允许),用于控制算子隐式回退到 CPU 执行的行为:当该变量设为 0(严格模式)时,已纳管路径若准备执行 CPU 主计算将直接报错,从而避免掩盖 NPU 算子覆盖缺口及由此引入的同步、D2H/H2D 传输与性能长尾。实现上新增统一检查工具 CpuFallbackUtils.h,并在 Dense PrivateUse1 全局 backend fallback、Sparse CSR sum/prod 显式 CPU fallback 两处路径接入检查,同时通过 OptionsManager::IsCpuFallbackEnable() 读取环境变量配置。

主要改动

  • 新增 CPU fallback 检查工具:新增 torch_npu/csrc/framework/utils/CpuFallbackUtils.h,定义 CpuFallbackKind 枚举(Dispatcher / ExplicitKernel)及 CheckCpuFallbackAllowed 内联函数;当 TORCH_NPU_CPU_FALLBACK=0 时,该函数以 TORCH_CHECK 抛出包含算子名、fallback 类型与原因的 NOT_SUPPORT 错误。
  • 新增环境变量读取配置:在 OptionsManager 中新增 IsCpuFallbackEnable()(声明于 OptionsManager.h,实现在 OptionsManager.cpp),通过 GetBoolTypeOption("TORCH_NPU_CPU_FALLBACK", 1) 读取配置,默认启用 CPU fallback。
  • Dense 全局 backend fallback 接入检查VariableFallbackKernel.cppnpu_cpu_fallback 中在原有告警逻辑前调用 CheckCpuFallbackAllowed(..., CpuFallbackKind::Dispatcher, ...),当 NPU PrivateUse1 backend 未注册 kernel 且严格模式开启时直接报错。
  • Sparse CSR 显式 CPU fallback 接入检查SparseCsrReductionFallbackKernelNpu.cppsparse_csr_sum_cpu_fallbacksparse_csr_prod_cpu_fallback 均调用 CheckCpuFallbackAllowed(..., CpuFallbackKind::ExplicitKernel, ...),在严格模式下阻止 Sparse CSR 归约走 CPU 实现。
likedislike
不准确?
atomgit-bot
atomgit-bot
8月18日 评论:

代码审查

✅ 未发现问题

likedislike
不准确?
ascend-robotascend-robot成员
8月18日 添加了label:ascend-cla/yes
此处折叠了142条消息 查看更多
ascend-robotascend-robot成员
8月20日 添加了label:approved
htchu成员
8月20日 评论:

/approve

likedislike
ascend-robotascend-robot成员
8月20日 添加了label:lgtm
ascend-robotascend-robot成员
8月20日 合入了pull request
ascend-robot
ascend-robot成员
8月20日 评论:
流水线 pytorch_gitcode_PR_multiVersion#14260 [ commitID:fe71130e ] 已完成
likedislike