已合并
[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
已合并
Pull Request已成功合入, 合并人@ascend-robot
(感谢 Dring 的贡献)atomgit-bot
8月18日 评论:
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.cpp的npu_cpu_fallback中在原有告警逻辑前调用CheckCpuFallbackAllowed(..., CpuFallbackKind::Dispatcher, ...),当 NPU PrivateUse1 backend 未注册 kernel 且严格模式开启时直接报错。 - Sparse CSR 显式 CPU fallback 接入检查:
SparseCsrReductionFallbackKernelNpu.cpp的sparse_csr_sum_cpu_fallback与sparse_csr_prod_cpu_fallback均调用CheckCpuFallbackAllowed(..., CpuFallbackKind::ExplicitKernel, ...),在严格模式下阻止 Sparse CSR 归约走 CPU 实现。


不准确?
ascend-robot
8月18日 评论:
8月18日 评论:
atomgit-bot
8月18日 评论:
8月18日 评论:
8月18日 添加了label:ascend-cla/yes
此处折叠了142条消息 查看更多
8月20日 添加了label:approved
8月20日 添加了label:lgtm
8月20日 合入了pull request
ascend-robot
8月20日 评论:
8月20日 评论:
流水线 pytorch_gitcode_PR_multiVersion#14260 [ commitID:fe71130e ] 已完成


【合入来源】
【修改方案】
当前 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 本身。
【资料变更】
不涉及
【接口变更】
不涉及
【功能验证】
【CheckList】