| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
refactor for torch_npu init module. Co-authored-by: bellatan<tanmei2@huawei.com> # message auto-generated for no-merge-commit merge: !35494 merge v2.9.0_torch_npu_init_refactor into v2.9.0 refactor for torch_npu init module. Created-by: bellatan Commit-by: bellatan Merged-by: ascend-robot Description: <!-- PR描述模板更新日期:20260203 --> # 【合入来源】 > <font color="red">**如有社区issue,请关联issue链接**</font>\ > <font color="red">**请勿携带内部流程信息(需求链接、问题单、内部issue等)**</font> - [ ] 需求 - [ ] 问题单 - [ ] issue/工单 - [x] 重构优化 - [ ] 资料更新 # 【修改方案】 本 PR 对 torch_npu 初始化链路进行重构,将原先集中在 torch_npu/__init__.py 中的初始化逻辑拆分到 _init 目录下的多个职责模块中,形成“**顶层编排 + 子模块分阶段执行 + 内部能力统一收口**”的结构。重构后,torch_npu/__init__.py 不再承载大量具体业务初始化细节,只负责固定初始化时序。各类具体能力分别由 _check_device_conflict、_load_core_modules、_register_components、_apply_patches、_enable_optional_features、_initialize_runtime_lifecycle 等内部函数承接。 ## 一、核心修改 ### 1. 重构 torch_npu/__init__.py 顶层初始化入口 重构后的初始化流程如下: python def _initialize(): _check_device_conflict() _load_core_modules() _register_components() _apply_patches() _enable_optional_features() _initialize_runtime_lifecycle() 顶层入口主要负责: 1. 维护 __all__; 2. 在 import torch 前关闭 TORCH_DEVICE_BACKEND_AUTOLOAD,避免 PyTorch 后端自动加载导致循环依赖; 3. 提前导入 torch_npu.utils.patch_getenv,用于捕获初始化阶段的环境变量访问; 4. 按固定顺序调用各初始化阶段入口; 5. 保留 _autoload() 作为 PyTorch 后端自动加载入口,用于恢复 TORCH_DEVICE_BACKEND_AUTOLOAD。 --- ### 2. 新增 _init 目录: 目录结构如下: text torch_npu/_init/ __init__.py common/ warning_utils.py core/ _exports.py module_loader.py optional_features.py runtime_lifecycle.py patches/ __init__.py api_patches.py asd_patches.py distributed_patches.py dynamo_patches.py monkey_patches.py npu_patches.py patch_manager.py profiler_patches.py warning_patches.py registry/ __init__.py backend.py distributed.py dynamo.py registry_manager.py --- ### 3. 通过 _check_device_conflict() 处理前置设备冲突检查 **_check_device_conflict()**:负责最早期的设备冲突检查,避免 NPU 与其他 accelerator 同时启用。该接口属于初始化内部逻辑,不作为 public API 暴露。 --- ### 4. 通过 _load_core_modules() 统一管理核心模块加载、注册副作用和顶层 API 导出 _load_core_modules() 将原先散落在 torch_npu/__init__.py 中的模块导入、底层 _C 子模块准备、基础 runtime 支撑模块初始化、导入即注册副作用以及顶层 API 导出统一收口。该阶段主要负责: 1. 加载 torch_npu 初始化所需的核心模块; 2. 统一准备 _C child submodules; 3. 初始化 logging、profiler、distributed 等基础组件; 4. 在 _C 准备完成后进行 torch_npu.npu 导入检查; 5. 加载需要通过 import 触发注册副作用的 Python 模块; 6. 导出 torch_npu 顶层 public API。 具体包括: * _C 子模块初始化:统一创建并注册 _profiler、_distributed_c10d、_cd、_logging、_flops_count 等 _C child submodules,保证业务 Python 模块只消费这些子模块,不再各自创建。 * torch_npu.npu 导入检查:在 _C 子模块完成准备后再检查 torch_npu.npu 导入状态,既保留对底层依赖缺失的友好报错,又避免 _C 未就绪时提前 import torch_npu.npu 导致循环导入。 * 导入副作用模块加载:统一加载需要通过 import 触发注册副作用的模块,例如 aclnn、optim、afd、custom ops、op_plugin、meta registrations 等,避免注册类副作用散落在初始化流程中。 * 顶层 API 导出:通过 export_all 将 torch_npu 顶层公开 API 统一导出到 globals() 和 __all__ 中,保证 public API 行为与旧版兼容。 * lazy Python API:对 HiFloat8Tensor、erase_stream、matmul_checksum 等接口采用 lazy export,保证接口可见但不在 import 阶段立即加载对应模块,减少循环导入风险。 * NPU custom ops:将 torch.ops.npu 下的公开算子导出到 torch_npu 顶层,并保留 torch.<op> deprecated wrapper。 * dtype symbols:将 _C._cd.DType 中的 dtype 符号导出到 torch_npu 顶层。 --- ### 5. 通过 _register_components() 统一管理框架集成注册 _register_components() 负责 backend 和 framework integration 注册,将原先散落在顶层入口中的 NPU backend、distributed、Dynamo、RPC、Inductor 等注册逻辑统一收口。通过该阶段统一收口后,框架集成注册逻辑不再散落在顶层 __init__.py 中,后续新增集成能力时可直接在 registry 目录下维护。该阶段主要负责: * NPU backend 注册:将 PyTorch PrivateUse1 backend 映射为 NPU,并注册 torch.npu 设备模块和相关方法。 * distributed backend 注册:注册 HCCL、LCCL backend,保证 NPU distributed 能力可用。 * Dynamo 注册:注册 Dynamo backend、NPU device interface 和 trace rules,保证 NPU 能接入 Dynamo 编译链路。 * RPC 注册:注册 NPU RPC backend,保证 RPC 场景下 NPU backend 可用。 * Inductor lightweight override 注册:只注册轻量级 NPU device op override,避免 import 阶段提前加载 heavy module。 * 默认 gradient device type 配置:保持 checkpoint 等场景下默认设备类型与旧行为兼容。 --- ### 6. 通过 _apply_patches() 统一管理 patch 注册与执行 引入集中式 patch 管理机制,统一收口原先散落在初始化入口中的 patch 逻辑。顶层入口 _apply_patches() 负责触发 patch 发现、注册和执行,具体由 PatchManager 承接。_apply_patches() 主要完成以下工作: 1. **patch 分组注册**:各组件 patch 按 group 注册,例如 monkey、api、distributed、dynamo、profiler、npu、warning、asd 等。 2. **内置 patch 自动发现**:PatchManager 会自动扫描 _init/patches 下符合命名规则的 patch 模块。模块被导入后,内部 patch 会完成注册。 3. **固定 patch 执行顺序**:patch group 按默认顺序执行,避免 import 顺序变化导致 patch 行为漂移。 4. **支持自定义 patch 顺序**:PatchManager 支持调整 patch group 执行顺序,便于测试或特殊场景扩展。 5. **异常钩子统一处理**:全局异常钩子由 PatchManager.run() 统一处理,便于初始化失败和运行时异常场景的集中管理。 --- ### 7. 通过 _enable_optional_features() 统一管理可选运行时能力 将 sanitizer、交互式模式配置、transfer_to_npu 等可选能力统一收口到 _enable_optional_features(),避免可选逻辑散落在顶层初始化入口。该阶段主要包括: python _enable_sanitizer_if_needed() _configure_interactive_mode() _enable_transfer_to_npu_if_needed() 具体说明: * sanitizer:仅在用户显式配置 TORCH_NPU_SANITIZER 时启用; * interactive mode:在交互式命令行环境中自动设置相关运行配置,并给出 warning 提示; * transfer_to_npu:通过 TORCH_TRANSFER_TO_NPU 控制是否启用,对非法配置进行显式报错。 --- ### 8. 通过 _initialize_runtime_lifecycle() 统一管理 runtime 生命周期 _initialize_runtime_lifecycle() 专门负责最终 C++ extension 初始化屏障和进程退出阶段的 shutdown hook 注册。该阶段主要包括: * extension finalize:调用 torch_npu._C._initExtension() 完成最终 C++ extension 绑定。该阶段放在核心模块加载、框架注册、API 导出和 patch 执行之后,保证 Python 侧初始化准备完成后再进入最终 extension barrier。 * shutdown hook 注册:负责注册进程退出阶段的 NPU 资源清理逻辑,包括设备同步、distributed 资源析构、异常处理和其他 runtime 清理流程。 --- ## 三、重构目的和收益 本次重构的目标是把 torch_npu 初始化从“单文件集中式副作用堆叠”调整为“阶段化、组件化、可维护”的初始化框架。主要收益包括: 1. **顶层入口更清晰** torch_npu/__init__.py 只保留初始化编排,不再堆叠大量具体 import、注册、patch 和 shutdown 逻辑。 2. **初始化顺序更稳定** _C 子模块和基础 runtime 支撑能力统一由 _load_core_modules 准备,降低循环导入和 _C 未就绪时提前访问的风险。 3. **组件职责更清楚** 模块加载、框架注册、API 导出、patch、可选功能、runtime 生命周期分别由不同接口承接。 4. **patch 更易维护** 各组件 patch 可以在自己的文件中维护,由 PatchManager 自动发现和统一执行,减少顶层冲突。 5. **支持后续扩展** 新增初始化能力时,只需放到对应处理的接口 或 patch group 中,不需要继续膨胀 __init__.py。 6. **便于问题定位** 初始化链路被拆成明确阶段,出现问题时可以快速判断是模块加载、注册、导出、patch、optional feature 还是 runtime lifecycle 阶段异常。 --- ## 四、兼容性说明 本次重构保持以下兼容性: 1. import torch_npu 行为保持兼容; 2. 顶层公开 API 保持兼容; 3. __version__ 仍从 torch_npu.version 导出。 --- ## 五、PatchManager 机制说明 本 PR 引入 PatchManager,用于统一管理 torch_npu 初始化阶段的 patch 注册与执行。原先 patch 逻辑集中在 torch_npu/__init__.py 中,和初始化流程、模块导入、框架注册逻辑混在一起,导致顶层文件过重,也不利于各组件独立维护。本次重构后,patch 逻辑从顶层入口中解耦,由 _apply_patches() 作为顶层入口触发执行,具体注册、发现、排序、幂等保护由 PatchManager 管理。 PatchManager 主要支持以下能力: 1. patch 按 group 分组注册; 2. 内置 patch 模块自动发现; 3. patch 按固定顺序执行; 4. patch 执行具备幂等保护; 5. 支持组件自行维护 patch module; 6. 支持按 group 执行,为后续按需使能 patch 打基础; 7. 支持自定义 patch 顺序,便于测试和问题定位。 整体机制如下: text 组件 patch 文件自注册 ↓ PatchManager 自动发现/加载 ↓ 按 group 统一管理 ↓ 按固定顺序执行 ↓ 幂等保护,避免重复 patch --- ### 场景一:新增 torch_npu 内置 patch 如果新增的是 torch_npu 内置 patch,例如 distributed patch、profiler patch、NPU API patch、warning patch、ASD patch 等,可以直接放到:torch_npu/_init/patches/ 目录下,并按 group 注册。 示例: python from torch_npu._init.patches.patch_manager import PatchManager @PatchManager.register_patch("profiler") def apply_profiler_patch(): ... 使用方式: text 1. 在 _init/patches 下新增或修改对应 *_patches.py 文件; 2. 在文件中通过 @PatchManager.register_patch(group) 注册 patch; 3. import torch_npu 时,由 _apply_patches() 统一触发; 4. PatchManager 自动发现并按 group 顺序执行。 --- ### 场景二:组件自行维护 patch module 如果某个组件自己的目录下新加了patch 文件,通过 patch module 注册机制接入。 示例: python PatchManager.register_patch_module("torch_npu.some_component.some_patches") 组件自己的 patch 文件中仍然使用 group 注册: python from torch_npu._init.patches.patch_manager import PatchManager @PatchManager.register_patch("some_component") def apply_some_component_patch(): ... 使用方式: text 1. 组件在自己的目录中维护 patch 文件; 2. 通过 register_patch_module 注册该 patch module; 3. module 被导入后,内部 patch 自动注册到 PatchManager; 4. 后续仍由 PatchManager 统一排序和执行。 适用场景: text 组件有独立维护边界; patch 逻辑不适合放到中心化 patches 目录; 后续组件可能独立演进、迁移或删除。 --- ### 场景三:按 group 执行 patch,用于测试或后续按需使能 PatchManager 支持按 group 执行 patch。当前默认初始化路径仍执行全部注册 patch,后续也可按需使能。 示例: python PatchManager.apply_registered_patches("distributed") 使用方式: text 1. 指定需要执行的 patch group; 2. PatchManager 只执行该 group 下已注册的 patch; 3. 已执行过的 patch 不会重复执行; 4. 可用于单独验证某一类 patch 的行为。 适用场景: text 只验证 distributed patch; 只执行 profiler patch; 排查某一类 patch 对初始化流程的影响; 后续通过环境变量控制某个 patch group 是否启用。 如果需要调整 patch group 顺序,也可以使用: python PatchManager.set_patch_order([ "monkey", "api", "distributed", ]) 适用场景: text 测试 patch 顺序; 排查 patch 依赖问题; 特殊构建或实验场景调整 patch 执行顺序。 # 【资料变更】 > 不涉及 # 【接口变更】 > 不涉及 # 【功能验证】 新增 TestTorchNpuBootstrap 初始化专项测试,覆盖以下场景: 1. test_01_import_order_compatibility 验证 import torch_npu、import torch; import torch_npu、import torch_npu; import torch、重复 import torch_npu 等不同导入顺序保持兼容。 2. test_02_import_state_snapshot 验证 import torch_npu 后的初始化状态,包括 torch.npu 注册、Tensor/Module.npu 方法生成、_C child submodules 准备、旧版初始化副作用模块加载、非预期模块不 eager import、顶层关键属性可访问等。 3. test_03_public_exports_snapshot 验证顶层 public API 导出行为,包括 lazy Python APIs、torch.ops.npu public ops、deprecated torch.<op> alias、dtype symbols 等导出保持兼容。 4. test_04_framework_registration_snapshot 验证框架集成注册行为,包括 Dynamo NPU device interface、Dynamo backend、Inductor lightweight device op override、distributed backend、RPC backend 等注册保持生效。 5. test_05_runtime_lazy_init_semantics 验证 import 阶段不触发 NPU runtime lazy init,查询类 API 不触发完整 runtime 初始化,真实 runtime API 和显式 torch_npu.npu.init() 能正常触发 lazy init。 6. test_06_component_behavior_snapshot 验证关键组件行为保持兼容,包括 patch_getenv 生效、ASD detector 兼容 API、AFD 通过 torch_npu._afd 暴露、torch_npu._C._afd 不暴露、AFD ops 可访问等。 7. test_07_distributed_patch_behavior 验证 distributed patch 行为保持兼容,包括 distributed 内部函数替换、public API alias、rendezvous/launcher patch、FSDP 相关 patch 等。 新增测试用例本地验证通过。 # 【CheckList】 > PR提交人对以下CheckList自检项进行全量自检,自检通过或不涉及,均修改 [ ] 为 [x] - [x] 代码注释完备,正确记录错误日志 - [x] 代码实现进行了返回值、空指针等校验 - [x] PR标题正确使用类型标签,如:feat、fix、refactor、docs、test等 - [x] PR持续集成流水线(CI)执行通过,代码检查无异常 See merge request: Ascend/pytorch!35494 | 3 个月前 | |
add control of python GC before capture npugraph Co-authored-by: 周锐淇<zhouruiqi5@huawei.com> # message auto-generated for no-merge-commit merge: !27712 merge v2.9.0 into v2.9.0 add control of python GC before capture npugraph Created-by: rich9527 Commit-by: 周锐淇 Merged-by: ascend-robot Description: <!-- Thanks for sending a pull request! --> **What type of PR is this?** > /kind task **What does this PR do / why do we need it**: add control of python GC before capture npugraph **Which issue(s) this PR fixes**: <!-- *Automatically closes linked issue when PR is merged. Usage: Fixes #<issue number>, or Fixes (paste link of issue). --> Fixes # **Special notes for your reviewers**: See merge request: Ascend/pytorch!27712 | 8 个月前 | |
[bugfix] Read DVM config dynamically Co-authored-by: huangchengnuo<huangchengnuo1@huawei.com> # message auto-generated for no-merge-commit merge: !44515 merge fix/dvm-config-dynamic-v290 into v2.9.0 [bugfix] Read DVM config dynamically Created-by: SorryNaCN Commit-by: huangchengnuo Merged-by: ascend-robot Description: # 【合入来源】 Fixes https://gitcode.com/Ascend/pytorch/issues/3993 - [ ] 需求 - [x] 问题单 - [ ] issue/工单 - [ ] 重构优化 - [ ] 资料更新 # 【修改方案】 1. 将 DVM 配置项的值导入改为模块导入。 2. 在使用处动态读取 dump_fx_test、融合开关、debug_mode、bf16_vector_keep_promoted 和 view_fusion_level,使运行时修改配置生效。 # 【资料变更】 不涉及。 # 【接口变更】 不涉及。 # 【功能验证】 - python -m py_compile torch_npu/_inductor/dvm/__init__.py torch_npu/_inductor/dvm/graph_fusion.py torch_npu/_inductor/dvm/mlir_fusion.py torch_npu/_inductor/dvm/util.py - git diff --check - 按要求不新增测试用例。 - CI 通过评论 compile 触发,结果以流水线为准。 # 【CheckList】 - [x] 代码注释完备,正确记录错误日志 - [x] 代码实现进行了返回值、空指针等校验 - [x] PR标题正确使用类型标签,如:feat、fix、refactor、docs、test等 - [ ] PR持续集成流水线(CI)执行通过,代码检查无异常 See merge request: Ascend/pytorch!44515 | 5 天前 | |
perf: defer dynamo/inductor loading on v2.9.0 (#2788) Co-authored-by: stevenaw0<huangguijun@huawei.com> # message auto-generated for no-merge-commit merge: !43444 merge v2.9.0_import into v2.9.0 perf: defer dynamo/inductor loading on v2.9.0 (#2788) Created-by: stevenaw0 Commit-by: stevenaw0 Merged-by: ascend-robot Description: ## 变更说明 将 v2.7.1_import 上的懒加载性能优化同步到 v2.9.0: - import torch_npu 时不再提前加载 torch._dynamo、torch._inductor 和 sympy。 - 首次导入或使用 Dynamo 入口时完成 Dynamo lazy setup;只有选择 Inductor backend 时才继续完成 Inductor lazy setup,非 Inductor backend 不初始化 Inductor。 - 设计上保留 torchair、npugraph_ex、transfer_to_npu、RNG prims 与公开接口行为;本文列出的测试和 CI 范围内未发现兼容性回归。 - 采用 v2.9.0 原生的 NPU Inductor device-op 注册路径,并保留目标分支的版本特有语义。 - 除 v2.7.1_import 的懒加载同步外,target 还包含一项来自 v2.10 修复意图、基于 v2.9 当前代码实现的 aten.erfc decomposition 重注册修复。 # v2.7.1_import 与 v2.9.0_import 改动差异总报告 ## 1. 报告目的 方便 committer 进行代码检视。 ## 2. “相同”与“差异”的判定规则 对每个文件分别提取两边 patch 的新增行和删除行,保留原始顺序和全部字符,然后逐字节比较: - **相同**:新增/删除代码行序列完全一致,包括空格、空行和文件末尾换行。 - **差异**:只要一个字符不同,或新增/删除行数不同,就标记为差异。 - **仅 v2.7.1**:v2.7.1 import 修改了该文件,v2.9.0 import 没有修改。 - **仅 v2.9.0**:v2.9.0 import 修改了该文件,v2.7.1 import 没有修改。 “改动代码相同”不等于“最终文件相同”。两个版本的基线代码本身可能不同;报告会把“同步 hunk 相同、最终文件因版本基线不同”单独说明。 本报告固定比较以下 SHA,避免维护分支继续前进后改变统计口径: - v2.7.1 source:0c9b783ca5635da8000e571fa60370f266a4e978..371545dc2e4a09ca2024ec220c3eed1b9a50ba48 - v2.9.0 target:dd936ee52a7202c144bd1322c04041955f0d2205..0bf5bdadcfa38f20608f6b5a6434dbe97ccb2c1b ## 3. 总体统计 两边 patch 的文件并集共 34 个文件;source 修改 33 个文件,target 修改 29 个文件: - 18 个文件的改动代码逐字符相同。 - 10 个文件双方都修改,但改动代码存在字符差异。 - 5 个文件仅 v2.7.1 修改,v2.9.0 采用不同的 DTensor 方案。 - 1 个文件仅 v2.9.0 修改,用于修复 aten.erfc decomposition 重复注册。 ### 3.1 改动代码完全相同的 18 个文件 | 文件 | v2.7.1 增/删 | v2.9.0 增/删 | 结论 | |---|---:|---:|---| | setup.py | +5/-0 | +5/-0 | entry point 声明完全相同 | | test/_inductor/test_current_device.py | +2/-1 | +2/-1 | 完全相同 | | test/_inductor/test_mlir_enable.py | +4/-1 | +4/-1 | 完全相同 | | test/npu/test_stream.py | +5/-0 | +5/-0 | 完全相同 | | test/utils/test_inductor.py | +0/-33 | +0/-33 | 删除代码完全相同 | | torch_npu/_init/patches/api_patches.py | +0/-2 | +0/-2 | 完全相同 | | torch_npu/_init/patches/distributed_patches.py | +61/-10 | +61/-10 | 完全相同 | | torch_npu/_init/patches/dynamo_patches.py | +0/-7 | +0/-7 | 完全相同 | | torch_npu/contrib/transfer_to_npu.py | +13/-1 | +13/-1 | 完全相同 | | torch_npu/distributed/fsdp/__init__.py | +2/-0 | +2/-0 | 完全相同 | | torch_npu/distributed/tensor/__init__.py | +14/-1 | +14/-1 | 完全相同 | | torch_npu/dynamo/__init__.py | +67/-5 | +67/-5 | 改动行完全相同;最终文件有一个基线空行差异 | | torch_npu/npu/__init__.py | +13/-2 | +13/-2 | 完全相同 | | torch_npu/npu/_graph_tree.py | +1/-12 | +1/-12 | 改动行完全相同;保留各版本图树基线 | | torch_npu/npu/_graph_tree_state.py | +11/-0 | +11/-0 | 新文件完全相同 | | torch_npu/npu/deterministic.py | +11/-3 | +11/-3 | 完全相同 | | torch_npu/utils/_graph_tree.py | +20/-9 | +20/-9 | 改动行完全相同;保留各版本 API 基线 | | torch_npu/utils/_rng_prims_patch.py | +255/-0 | +255/-0 | 新文件完全相同 | ### 3.2 双方都修改但代码不同的 10 个文件 | 文件 | v2.7.1 增/删 | v2.9.0 增/删 | 主要差异原因 | |---|---:|---:|---| | test/dynamo/test_compile_trigger.py | +1372/-0 | +1438/-0 | PyTorch 2.9 行为适配及 target 独有 has_triton、shape、fork 锁测试 | | test/test_torch_npu_init.py | +89/-14 | +79/-15 | DTensor OpSpec、TMA 名称及 bootstrap 快照版本差异 | | torch_npu/_inductor/kernel/bmm.py | +5/-4 | +3/-2 | v2.9 已无 bmm_configs/bmm_template 本地别名 | | torch_npu/_inductor/utils.py | +2/-1 | +2/-2 | source 在此定义并安装 has_triton;target 复用 _dynamo.py 的 v2.9 实现,只同步 Inductor 已绑定入口 | | torch_npu/_init/registry/registry_manager.py | +10/-24 | +8/-31 | 两版 registry 项目和初始化列表不同 | | torch_npu/distributed/__init__.py | +19/-1 | +18/-0 | 两版 distributed 基线 import 结构不同 | | torch_npu/npu/npugraph_ex/__init__.py | +2/-2 | +1/-1 | 基线空格/EOF 不同;最终文件收敛相同 | | torch_npu/utils/__init__.py | +1/-1 | +1/-0 | source 替换已有 import,target 在不同基线上新增;最终相同 | | torch_npu/utils/_dynamo.py | +447/-133 | +428/-129 | v2.9 wrapper、options、has_triton、AscendC、lookup 与 fork 锁适配 | | torch_npu/utils/_inductor.py | +8/-248 | +8/-247 | 删除代码相差一个基线空行;最终兼容转发文件相同 | ### 3.3 仅 v2.7.1 修改的 5 个文件 | 文件 | v2.7.1 增/删 | v2.9.0 | 原因 | |---|---:|---|---| | torch_npu/distributed/tensor/_attention.py | +2/-2 | 未修改 | v2.9 直接使用上游 register_sharding | | torch_npu/distributed/tensor/_dtensor_patch.py | +63/-0 | 未修改 | 2.7.1 需要本地轻量 helper;2.9 不需要复制上游实现 | | torch_npu/distributed/tensor/_math_ops.py | +2/-1 | 未修改 | 同上 | | torch_npu/distributed/tensor/_matrix_ops.py | +1/-1 | 未修改 | 同上 | | torch_npu/distributed/tensor/_moe_ops.py | +3/-2 | 未修改 | 同上 | ### 3.4 仅 v2.9.0 修改的 1 个文件 | 文件 | v2.7.1 | v2.9.0 增/删 | 原因 | |---|---|---:|---| | torch_npu/_inductor/decomposition.py | 未修改 | +1/-0 | 将 aten.erfc 加入重注册前的 overload 清理集合,避免 backend 重载时重复注册 | ## 4. 最重要的版本差异 ### 4.1 DTensor:v2.9 不同步 source 的 5 个文件改动是有意设计 v2.7.1 为避免导入 DTensor experimental API 间接加载 compiler 模块,在已有 _dtensor_patch.py 中增加轻量 register_sharding helper,并让 4 个算子文件改用该 helper。它依赖 2.7.1 内部结构,例如 TupleStrategy.childs 和 _is_inplace_op。 v2.9 保留算子文件对 PyTorch 自带 register_sharding 的直接使用。目标基线同时存在以下两种 PyTorch 2.9 兼容路径: python # _attention.py / _matrix_ops.py / _moe_ops.py from torch.distributed._tensor.experimental import register_sharding # _math_ops.py from torch.distributed.tensor.experimental import register_sharding 在 PyTorch 2.9 当前实现中,这些导入路径不会加载 Dynamo/Inductor,因此无需复制 2.7.1 的本地 decorator。target 最终没有新增 _sharding_registration.py,但仍保留并在 strategy 注册前加载目标基线已有的 _dtensor_patch.py;该文件负责 v2.9 的 kwargs strategy 和 expand_to_full_mesh_op_strategy 兼容,不是 2.7.1 register_sharding helper 的副本。 因此,target 未引入 _sharding_registration.py 对应的上游源码副本,也没有这类新增副本的 Meta/BSD License 声明要求;不能表述为 target 不存在 _dtensor_patch.py。 ### 4.2 has_triton:保留 v2.9 实现,并按初始化层级复用 v2.7.1 的 has_triton 是 torch_npu/_inductor/utils.py::patch_has_triton() 内部的缓存函数。v2.9 最终没有复制该函数体,也没有把自身实现移动到 Inductor 模块,而是把 v2.9 原有语义保留在 torch_npu/utils/_dynamo.py: python @functools.lru_cache(None) def has_triton() -> bool: from torch.utils._triton import has_triton_package if not has_triton_package(): return False from torch._dynamo.device_interface import get_interface_for_device ... _dynamo_register_interface_for_device() for device, extra_check in triton_supported_devices.items(): device_interface = get_interface_for_device(device) if device_interface.is_available() and extra_check(device_interface): return True return False 该实现逐项检查 CUDA、XPU、CPU、NPU;CPU 还要求 Triton CPU backend 存在,NPU 不查询 CUDA device properties。import torch_npu 时仅将这个轻量 callable 提前安装到 torch.utils._triton.has_triton,函数体内部的 Dynamo/Triton backend 导入仍延迟到首次调用,因此不会因为安装 patch 而提前加载 Dynamo/Inductor。 首次初始化 Inductor 后,torch_npu/_inductor/utils.py 复用同一个函数对象,更新 Inductor 已按值绑定的入口: python def patch_has_triton(): from torch._inductor import compile_fx from torch_npu.utils._dynamo import has_triton torch._inductor.scheduler.has_triton = has_triton compile_fx.has_triton = has_triton 这种归属确保全局只有一份 v2.9 设备判定实现,同时兼顾 import 阶段的早期 consumer 和 Inductor 加载后的已绑定 consumer。 ### 4.3 Inductor wrapper:v2.9 保留参数校验和 shape 延迟顺序 PyTorch 2.9 的 _TorchCompileInductorWrapper.__init__ 会在构造期间调用 self.apply_options()。target 因此不能复制 2.7.1 wrapper,而是保留以下顺序: text NPU option 名规范化及 npu_backend 类型预检 → PyTorch 2.9 src_init/src_apply_options 完成 mode、option 名和值校验 → 根据规范化 options/config/env 选择 NPU backend → 初始化所选 backend → 执行延迟记录的 shape handling patch → 执行 MLIR/DVM 构造期附加 scope 操作 target 还支持 PyTorch 2.9 原生的连字符 option alias: python attr_name = key.replace("-", "_") 因此 npu-backend/npu_backend、enable-shape-handling/enable_shape_handling 行为一致。任何校验失败都发生在 _setup_inductor_for_compile() 前,不会先初始化 NPU Inductor。 ### 4.4 backend lookup:两边最新实现均覆盖已绑定入口 v2.9 的 torch._dynamo.eval_frame 会按值绑定 lookup_backend。target 除更新 registry 外,还按 identity 更新已绑定入口: python registry.lookup_backend = lookup_backend if torch_dynamo.lookup_backend is original_lookup_backend: torch_dynamo.lookup_backend = lookup_backend if eval_frame.lookup_backend is original_lookup_backend: eval_frame.lookup_backend = lookup_backend 注册完成后通过 _COMPILER_FNS 无锁返回;只有指定 NPU backend 尚未出现在 _COMPILER_FNS 时才进入 RLock,避免正常 compile 热路径锁竞争。v2.7.1_import 最新提交也已同步该已绑定入口和无锁热路径语义,因此这不再是 target 独有能力。 ### 4.5 fork:两边均在 child 中重建 compiler 状态 两边最新实现都会在 child 中重建每个 run_once 的 Condition,并清除可能指向父进程线程的 running owner;已完成的 has_run 状态保留,fork 时尚未完成的 lazy setup 可由 child 重试。 两边也都维护 backend lookup 与 backend scope 两把 RLock。当前实现不在 fork 前获取并等待这些锁,而是在 child hook 中直接丢弃继承的锁对象: python def _reset_compiler_locks_after_fork(): global _INDUCTOR_NPU_BACKEND_LOCK, _DYNAMO_NPU_BACKEND_LOOKUP_LOCK _INDUCTOR_NPU_BACKEND_LOCK = threading.RLock() _DYNAMO_NPU_BACKEND_LOOKUP_LOCK = threading.RLock() os.register_at_fork(after_in_child=_reset_compiler_locks_after_fork) 父进程继续使用原锁,child 使用新锁,避免 child 继承一个由不存在的父线程永久持有的 RLock。该方案不保证 fork 前临时 TORCHINDUCTOR_NPU_BACKEND 已恢复;环境变量按 fork 瞬间复制,child backend scope 保存并恢复的是 fork 瞬间继承的值,不会自动推断父线程进入 scope 前的值。target 额外直接验证了父线程持有 lookup lock 时,child 可通过 torch._dynamo.lookup_backend("npu") 恢复;scope 测试直接覆盖 _NpuBackendScope,不能描述成 fork child 内执行完整 Inductor compile。 ### 4.6 AscendC deterministic:仅 target 需要保留的 v2.9 语义 AscendC deterministic 是 v2.9 target 独有的基线语义。实际 compile 调用进入 _NpuBackendScope("ascendc") 后,先按临时 backend 环境加载或切换 NPU Inductor,再安装 deterministic level cache-key patch;随后 new_call() 在调用 PyTorch 原 wrapper 前安装 Dynamo deterministic guard。两者都位于 backend scope 内,异常时 scope 仍恢复 TORCHINDUCTOR_NPU_BACKEND 并释放锁。2.7.1 source 没有对应分支,跨版本同步时必须保留 target 实现。 ### 4.7 aten.erfc:target 独有的重复注册修复 target 原本已定义 Triton erfc = 1 - erf(x) decomposition,但 backend 重载会再次执行注册。若 aten.erfc.default 等 overload 仍留在全局 decomposition 表,第二次注册会先报 duplicate registrations for aten.erfc.default。 0bf5bdadcf 仅将 aten.erfc 加入 DECOMPOSITION_OVERLOAD_OP:add_overload() 会展开 packet,并在现有 decorator 再次注册前删除 default、out 等旧 overload。在标准干净 registry 状态下,首次注册结果和数值公式不变,只修复重复初始化。 该语义参考 v2.10 提交 ab0acd320e,但实现是基于 v2.9 当前 decomposition 结构完成;它不是 v2.7.1_import patch 的一部分,也没有同步 ab0acd320e 的其他文件。 ## 5. 测试差异与审查提示 `test/dynamo/test_compile_trig See merge request: Ascend/pytorch!43444 | 6 天前 | |
feat: [graph partition] aclgraph support graph partition Co-authored-by: luochao60<luochao60@huawei.com> # message auto-generated for no-merge-commit merge: !34998 merge pta_support_graph_partition_20260414_v2.9.0 into v2.9.0 feat: [graph partition] aclgraph support graph partition Created-by: luochao60 Commit-by: luochao60 Merged-by: ascend-robot Description: <!-- PR描述模板更新日期:20260203 --> # 【合入来源】 > (如有)请关联需求文档/issue链接 > 关联 issue: #1911 (https://gitcode.com/Ascend/pytorch/issues/1911) - [x] 需求 - [ ] 问题单 - [ ] issue/工单 - [ ] 重构优化 - [ ] 资料更新 # 【修改方案】 1. ** torch_npu/utils/_graph_tree.py — 新增 get_manager monkey-patch** 上游 torch._inductor.output_code.maybe_handle_backward_generation 和 torch._dynamo.backends.cudagraphs 会直接调用 torch._inductor.cudagraph_trees.get_manager,依赖它返回真实的 manager 实例来推进 backward 的 cudagraph 状态机。NPU 把自己的 NPUGraphTreeManager 注册在独立 registry(torch_npu.npu._graph_tree),导致上游那两条路径在 NPU 设备上拿不到 manager,触发 AssertionError 或 AttributeError。在 _apply_npugraph_tree_methods() 末尾把 torch._inductor.cudagraph_trees.get_manager 重指到 NPU 的 get_manager(签名一致、duck-typing 兼容),打通 backward 状态机闭环。 2. **torch_npu/_inductor/codegen/wrapper.py — wrapper 体系重构以支持 graph partition** 提取 _NPUKernelCodegenMixin 混入类,把 NPU 特化逻辑(define_kernel 中 user_autotune → user_autotune_npu、PrecomputedGrid → PrecomputedGridNpu、FixedGrid → FixedGridNpu 替换;get_next_kernel_suffix、make_buffer_free 等)从原 NPUWrapperCodeGen 上移;新增 NPUSubgraphWrapperCodegen(_NPUKernelCodegenMixin, SubgraphPythonWrapperCodegen) 让 subgraph wrapper 共享 NPU 适配;NPUWrapperCodeGen.create() 在 is_subgraph=True 时返回新的 subgraph wrapper。 3. **torch_npu/_inductor/lowering_op_list.py — graph partition 所需算子注册** GENERATE_LIST 新增 prims.device_put、aten.unbind、torch.ops.higher_order.cond。 4. **torch_npu/csrc/core/npu/NPUHooksInterface.{h,cpp} — Pinned memory 接口实现** override 上游 at::PrivateUse1HooksInterface 新增的虚函数:isPinnedPtr() 走 CachingHostAllocator_isPinned,getPinnedMemoryAllocator() 返回 getPinnedMemoryAllocator()。同时新增 CachingHostAllocator.h 包含。 5. **test/_inductor/test_inductor_graph_partition.py — graph partition 测试集** 新增 graph partition 场景的系列用例:dynamic shapes、condition op、custom op 拆分、subgraph wrapper user_autotune 兜底、forward cudagraph + backward fallback 等。 # 【资料变更】 不涉及 # 【接口变更】 不涉及。C++ 层 NPUHooksInterface::isPinnedPtr 和 getPinnedMemoryAllocator 是对上游 PrivateUse1HooksInterface 已有虚函数的 override 实现,非新增对外 API。 # 【功能验证】 在 test/_inductor/test_inductor_graph_partition.py 中新增覆盖 graph partition 场景的用例: - test_graph_partition_dynamic_shapes:动态 shape 下产生 3 个 npugraph - test_graph_partition_condition_op:cond / higher-order op 切图 - test_graph_partition_custom_op:cudagraph_unsafe 自定义算子切分边界 - test_graph_partition_subgraph_wrapper_user_autotune:子图 wrapper 的 user_autotune 替换路径 - forward cudagraph + backward fallback 的混合路径 通过 python test/_inductor/test_inductor_graph_partition.py 在 NPU 设备上跑通全部用例。 # 【CheckList】 > PR提交人对以下CheckList自检项进行全量自检,自检通过或不涉及,均修改 [ ] 为 [x] - [x] 代码注释完备,正确记录错误日志 - [x] 代码实现进行了返回值、空指针等校验 - [x] PR标题正确使用类型标签,如:feat、fix、refactor、docs、test等 - [x] PR持续集成流水线(CI)执行通过,代码检查无异常 See merge request: Ascend/pytorch!34998 | 3 个月前 | |
[Fix] Fix static check errors detected by SPACES Co-authored-by: huangjingwei<huangjingwei4@huawei.com> # message auto-generated for no-merge-commit merge: !36364 merge v2.9.0_lintrunner into v2.9.0 [Fix] Fix static check errors detected by SPACES Created-by: huangjingwei Commit-by: huangjingwei Merged-by: ascend-robot Description: <!-- PR描述模板更新日期:20260203 --> # 【合入来源】 > <font color="red">**如有社区issue,请关联issue链接**</font>\ > <font color="red">**请勿携带内部流程信息(需求链接、问题单、内部issue等)**</font> - [ ] 需求 - [ ] 问题单 - [x] issue/工单 - [ ] 重构优化 - [ ] 资料更新 # 【修改方案】 检测和删除代码中的行尾空白字符 # 【资料变更】 不涉及 # 【接口变更】 不涉及 # 【功能验证】 不涉及 # 【CheckList】 > PR提交人对以下CheckList自检项进行全量自检,自检通过或不涉及,均修改 [ ] 为 [x] - [x] 代码注释完备,正确记录错误日志 - [x] 代码实现进行了返回值、空指针等校验 - [x] PR标题正确使用类型标签,如:feat、fix、refactor、docs、test等 - [x] PR持续集成流水线(CI)执行通过,代码检查无异常 See merge request: Ascend/pytorch!36364 | 2 个月前 | |
perf: defer dynamo/inductor loading on v2.9.0 (#2788) Co-authored-by: stevenaw0<huangguijun@huawei.com> # message auto-generated for no-merge-commit merge: !43444 merge v2.9.0_import into v2.9.0 perf: defer dynamo/inductor loading on v2.9.0 (#2788) Created-by: stevenaw0 Commit-by: stevenaw0 Merged-by: ascend-robot Description: ## 变更说明 将 v2.7.1_import 上的懒加载性能优化同步到 v2.9.0: - import torch_npu 时不再提前加载 torch._dynamo、torch._inductor 和 sympy。 - 首次导入或使用 Dynamo 入口时完成 Dynamo lazy setup;只有选择 Inductor backend 时才继续完成 Inductor lazy setup,非 Inductor backend 不初始化 Inductor。 - 设计上保留 torchair、npugraph_ex、transfer_to_npu、RNG prims 与公开接口行为;本文列出的测试和 CI 范围内未发现兼容性回归。 - 采用 v2.9.0 原生的 NPU Inductor device-op 注册路径,并保留目标分支的版本特有语义。 - 除 v2.7.1_import 的懒加载同步外,target 还包含一项来自 v2.10 修复意图、基于 v2.9 当前代码实现的 aten.erfc decomposition 重注册修复。 # v2.7.1_import 与 v2.9.0_import 改动差异总报告 ## 1. 报告目的 方便 committer 进行代码检视。 ## 2. “相同”与“差异”的判定规则 对每个文件分别提取两边 patch 的新增行和删除行,保留原始顺序和全部字符,然后逐字节比较: - **相同**:新增/删除代码行序列完全一致,包括空格、空行和文件末尾换行。 - **差异**:只要一个字符不同,或新增/删除行数不同,就标记为差异。 - **仅 v2.7.1**:v2.7.1 import 修改了该文件,v2.9.0 import 没有修改。 - **仅 v2.9.0**:v2.9.0 import 修改了该文件,v2.7.1 import 没有修改。 “改动代码相同”不等于“最终文件相同”。两个版本的基线代码本身可能不同;报告会把“同步 hunk 相同、最终文件因版本基线不同”单独说明。 本报告固定比较以下 SHA,避免维护分支继续前进后改变统计口径: - v2.7.1 source:0c9b783ca5635da8000e571fa60370f266a4e978..371545dc2e4a09ca2024ec220c3eed1b9a50ba48 - v2.9.0 target:dd936ee52a7202c144bd1322c04041955f0d2205..0bf5bdadcfa38f20608f6b5a6434dbe97ccb2c1b ## 3. 总体统计 两边 patch 的文件并集共 34 个文件;source 修改 33 个文件,target 修改 29 个文件: - 18 个文件的改动代码逐字符相同。 - 10 个文件双方都修改,但改动代码存在字符差异。 - 5 个文件仅 v2.7.1 修改,v2.9.0 采用不同的 DTensor 方案。 - 1 个文件仅 v2.9.0 修改,用于修复 aten.erfc decomposition 重复注册。 ### 3.1 改动代码完全相同的 18 个文件 | 文件 | v2.7.1 增/删 | v2.9.0 增/删 | 结论 | |---|---:|---:|---| | setup.py | +5/-0 | +5/-0 | entry point 声明完全相同 | | test/_inductor/test_current_device.py | +2/-1 | +2/-1 | 完全相同 | | test/_inductor/test_mlir_enable.py | +4/-1 | +4/-1 | 完全相同 | | test/npu/test_stream.py | +5/-0 | +5/-0 | 完全相同 | | test/utils/test_inductor.py | +0/-33 | +0/-33 | 删除代码完全相同 | | torch_npu/_init/patches/api_patches.py | +0/-2 | +0/-2 | 完全相同 | | torch_npu/_init/patches/distributed_patches.py | +61/-10 | +61/-10 | 完全相同 | | torch_npu/_init/patches/dynamo_patches.py | +0/-7 | +0/-7 | 完全相同 | | torch_npu/contrib/transfer_to_npu.py | +13/-1 | +13/-1 | 完全相同 | | torch_npu/distributed/fsdp/__init__.py | +2/-0 | +2/-0 | 完全相同 | | torch_npu/distributed/tensor/__init__.py | +14/-1 | +14/-1 | 完全相同 | | torch_npu/dynamo/__init__.py | +67/-5 | +67/-5 | 改动行完全相同;最终文件有一个基线空行差异 | | torch_npu/npu/__init__.py | +13/-2 | +13/-2 | 完全相同 | | torch_npu/npu/_graph_tree.py | +1/-12 | +1/-12 | 改动行完全相同;保留各版本图树基线 | | torch_npu/npu/_graph_tree_state.py | +11/-0 | +11/-0 | 新文件完全相同 | | torch_npu/npu/deterministic.py | +11/-3 | +11/-3 | 完全相同 | | torch_npu/utils/_graph_tree.py | +20/-9 | +20/-9 | 改动行完全相同;保留各版本 API 基线 | | torch_npu/utils/_rng_prims_patch.py | +255/-0 | +255/-0 | 新文件完全相同 | ### 3.2 双方都修改但代码不同的 10 个文件 | 文件 | v2.7.1 增/删 | v2.9.0 增/删 | 主要差异原因 | |---|---:|---:|---| | test/dynamo/test_compile_trigger.py | +1372/-0 | +1438/-0 | PyTorch 2.9 行为适配及 target 独有 has_triton、shape、fork 锁测试 | | test/test_torch_npu_init.py | +89/-14 | +79/-15 | DTensor OpSpec、TMA 名称及 bootstrap 快照版本差异 | | torch_npu/_inductor/kernel/bmm.py | +5/-4 | +3/-2 | v2.9 已无 bmm_configs/bmm_template 本地别名 | | torch_npu/_inductor/utils.py | +2/-1 | +2/-2 | source 在此定义并安装 has_triton;target 复用 _dynamo.py 的 v2.9 实现,只同步 Inductor 已绑定入口 | | torch_npu/_init/registry/registry_manager.py | +10/-24 | +8/-31 | 两版 registry 项目和初始化列表不同 | | torch_npu/distributed/__init__.py | +19/-1 | +18/-0 | 两版 distributed 基线 import 结构不同 | | torch_npu/npu/npugraph_ex/__init__.py | +2/-2 | +1/-1 | 基线空格/EOF 不同;最终文件收敛相同 | | torch_npu/utils/__init__.py | +1/-1 | +1/-0 | source 替换已有 import,target 在不同基线上新增;最终相同 | | torch_npu/utils/_dynamo.py | +447/-133 | +428/-129 | v2.9 wrapper、options、has_triton、AscendC、lookup 与 fork 锁适配 | | torch_npu/utils/_inductor.py | +8/-248 | +8/-247 | 删除代码相差一个基线空行;最终兼容转发文件相同 | ### 3.3 仅 v2.7.1 修改的 5 个文件 | 文件 | v2.7.1 增/删 | v2.9.0 | 原因 | |---|---:|---|---| | torch_npu/distributed/tensor/_attention.py | +2/-2 | 未修改 | v2.9 直接使用上游 register_sharding | | torch_npu/distributed/tensor/_dtensor_patch.py | +63/-0 | 未修改 | 2.7.1 需要本地轻量 helper;2.9 不需要复制上游实现 | | torch_npu/distributed/tensor/_math_ops.py | +2/-1 | 未修改 | 同上 | | torch_npu/distributed/tensor/_matrix_ops.py | +1/-1 | 未修改 | 同上 | | torch_npu/distributed/tensor/_moe_ops.py | +3/-2 | 未修改 | 同上 | ### 3.4 仅 v2.9.0 修改的 1 个文件 | 文件 | v2.7.1 | v2.9.0 增/删 | 原因 | |---|---|---:|---| | torch_npu/_inductor/decomposition.py | 未修改 | +1/-0 | 将 aten.erfc 加入重注册前的 overload 清理集合,避免 backend 重载时重复注册 | ## 4. 最重要的版本差异 ### 4.1 DTensor:v2.9 不同步 source 的 5 个文件改动是有意设计 v2.7.1 为避免导入 DTensor experimental API 间接加载 compiler 模块,在已有 _dtensor_patch.py 中增加轻量 register_sharding helper,并让 4 个算子文件改用该 helper。它依赖 2.7.1 内部结构,例如 TupleStrategy.childs 和 _is_inplace_op。 v2.9 保留算子文件对 PyTorch 自带 register_sharding 的直接使用。目标基线同时存在以下两种 PyTorch 2.9 兼容路径: python # _attention.py / _matrix_ops.py / _moe_ops.py from torch.distributed._tensor.experimental import register_sharding # _math_ops.py from torch.distributed.tensor.experimental import register_sharding 在 PyTorch 2.9 当前实现中,这些导入路径不会加载 Dynamo/Inductor,因此无需复制 2.7.1 的本地 decorator。target 最终没有新增 _sharding_registration.py,但仍保留并在 strategy 注册前加载目标基线已有的 _dtensor_patch.py;该文件负责 v2.9 的 kwargs strategy 和 expand_to_full_mesh_op_strategy 兼容,不是 2.7.1 register_sharding helper 的副本。 因此,target 未引入 _sharding_registration.py 对应的上游源码副本,也没有这类新增副本的 Meta/BSD License 声明要求;不能表述为 target 不存在 _dtensor_patch.py。 ### 4.2 has_triton:保留 v2.9 实现,并按初始化层级复用 v2.7.1 的 has_triton 是 torch_npu/_inductor/utils.py::patch_has_triton() 内部的缓存函数。v2.9 最终没有复制该函数体,也没有把自身实现移动到 Inductor 模块,而是把 v2.9 原有语义保留在 torch_npu/utils/_dynamo.py: python @functools.lru_cache(None) def has_triton() -> bool: from torch.utils._triton import has_triton_package if not has_triton_package(): return False from torch._dynamo.device_interface import get_interface_for_device ... _dynamo_register_interface_for_device() for device, extra_check in triton_supported_devices.items(): device_interface = get_interface_for_device(device) if device_interface.is_available() and extra_check(device_interface): return True return False 该实现逐项检查 CUDA、XPU、CPU、NPU;CPU 还要求 Triton CPU backend 存在,NPU 不查询 CUDA device properties。import torch_npu 时仅将这个轻量 callable 提前安装到 torch.utils._triton.has_triton,函数体内部的 Dynamo/Triton backend 导入仍延迟到首次调用,因此不会因为安装 patch 而提前加载 Dynamo/Inductor。 首次初始化 Inductor 后,torch_npu/_inductor/utils.py 复用同一个函数对象,更新 Inductor 已按值绑定的入口: python def patch_has_triton(): from torch._inductor import compile_fx from torch_npu.utils._dynamo import has_triton torch._inductor.scheduler.has_triton = has_triton compile_fx.has_triton = has_triton 这种归属确保全局只有一份 v2.9 设备判定实现,同时兼顾 import 阶段的早期 consumer 和 Inductor 加载后的已绑定 consumer。 ### 4.3 Inductor wrapper:v2.9 保留参数校验和 shape 延迟顺序 PyTorch 2.9 的 _TorchCompileInductorWrapper.__init__ 会在构造期间调用 self.apply_options()。target 因此不能复制 2.7.1 wrapper,而是保留以下顺序: text NPU option 名规范化及 npu_backend 类型预检 → PyTorch 2.9 src_init/src_apply_options 完成 mode、option 名和值校验 → 根据规范化 options/config/env 选择 NPU backend → 初始化所选 backend → 执行延迟记录的 shape handling patch → 执行 MLIR/DVM 构造期附加 scope 操作 target 还支持 PyTorch 2.9 原生的连字符 option alias: python attr_name = key.replace("-", "_") 因此 npu-backend/npu_backend、enable-shape-handling/enable_shape_handling 行为一致。任何校验失败都发生在 _setup_inductor_for_compile() 前,不会先初始化 NPU Inductor。 ### 4.4 backend lookup:两边最新实现均覆盖已绑定入口 v2.9 的 torch._dynamo.eval_frame 会按值绑定 lookup_backend。target 除更新 registry 外,还按 identity 更新已绑定入口: python registry.lookup_backend = lookup_backend if torch_dynamo.lookup_backend is original_lookup_backend: torch_dynamo.lookup_backend = lookup_backend if eval_frame.lookup_backend is original_lookup_backend: eval_frame.lookup_backend = lookup_backend 注册完成后通过 _COMPILER_FNS 无锁返回;只有指定 NPU backend 尚未出现在 _COMPILER_FNS 时才进入 RLock,避免正常 compile 热路径锁竞争。v2.7.1_import 最新提交也已同步该已绑定入口和无锁热路径语义,因此这不再是 target 独有能力。 ### 4.5 fork:两边均在 child 中重建 compiler 状态 两边最新实现都会在 child 中重建每个 run_once 的 Condition,并清除可能指向父进程线程的 running owner;已完成的 has_run 状态保留,fork 时尚未完成的 lazy setup 可由 child 重试。 两边也都维护 backend lookup 与 backend scope 两把 RLock。当前实现不在 fork 前获取并等待这些锁,而是在 child hook 中直接丢弃继承的锁对象: python def _reset_compiler_locks_after_fork(): global _INDUCTOR_NPU_BACKEND_LOCK, _DYNAMO_NPU_BACKEND_LOOKUP_LOCK _INDUCTOR_NPU_BACKEND_LOCK = threading.RLock() _DYNAMO_NPU_BACKEND_LOOKUP_LOCK = threading.RLock() os.register_at_fork(after_in_child=_reset_compiler_locks_after_fork) 父进程继续使用原锁,child 使用新锁,避免 child 继承一个由不存在的父线程永久持有的 RLock。该方案不保证 fork 前临时 TORCHINDUCTOR_NPU_BACKEND 已恢复;环境变量按 fork 瞬间复制,child backend scope 保存并恢复的是 fork 瞬间继承的值,不会自动推断父线程进入 scope 前的值。target 额外直接验证了父线程持有 lookup lock 时,child 可通过 torch._dynamo.lookup_backend("npu") 恢复;scope 测试直接覆盖 _NpuBackendScope,不能描述成 fork child 内执行完整 Inductor compile。 ### 4.6 AscendC deterministic:仅 target 需要保留的 v2.9 语义 AscendC deterministic 是 v2.9 target 独有的基线语义。实际 compile 调用进入 _NpuBackendScope("ascendc") 后,先按临时 backend 环境加载或切换 NPU Inductor,再安装 deterministic level cache-key patch;随后 new_call() 在调用 PyTorch 原 wrapper 前安装 Dynamo deterministic guard。两者都位于 backend scope 内,异常时 scope 仍恢复 TORCHINDUCTOR_NPU_BACKEND 并释放锁。2.7.1 source 没有对应分支,跨版本同步时必须保留 target 实现。 ### 4.7 aten.erfc:target 独有的重复注册修复 target 原本已定义 Triton erfc = 1 - erf(x) decomposition,但 backend 重载会再次执行注册。若 aten.erfc.default 等 overload 仍留在全局 decomposition 表,第二次注册会先报 duplicate registrations for aten.erfc.default。 0bf5bdadcf 仅将 aten.erfc 加入 DECOMPOSITION_OVERLOAD_OP:add_overload() 会展开 packet,并在现有 decorator 再次注册前删除 default、out 等旧 overload。在标准干净 registry 状态下,首次注册结果和数值公式不变,只修复重复初始化。 该语义参考 v2.10 提交 ab0acd320e,但实现是基于 v2.9 当前 decomposition 结构完成;它不是 v2.7.1_import patch 的一部分,也没有同步 ab0acd320e 的其他文件。 ## 5. 测试差异与审查提示 `test/dynamo/test_compile_trig See merge request: Ascend/pytorch!43444 | 6 天前 | |
A5 dtype: make checkSupportedDataType accept uint64/fp64 on Ascend950+ Co-authored-by: limuan<liyijie16@huawei.com> # message auto-generated for no-merge-commit merge: !44705 merge reduce_support_more_dtype_v2.9.0 into v2.9.0 A5 dtype: make checkSupportedDataType accept uint64/fp64 on Ascend950+ Created-by: limuan Commit-by: limuan Merged-by: ascend-robot Description: <!-- PR描述模板更新日期:20260203 --> # 【合入来源】 - [ ] 需求 - [ ] 问题单 - [x] issue/工单 - [ ] 重构优化 - [ ] 资料更新 # 【修改方案】 PTA reduce相关算子在processgrouphccl.cpp中有数据类型的校验,暂时未包含hccl A5新支持的数据类型uint64和fp64: 修改processgrouphccl.cpp中的数据校验函数,针对A5添加支持的数据类型uint64和fp64: # 【资料变更】 不涉及 # 【接口变更】 不涉及 # 【功能验证】      # 【CheckList】 > PR提交人对以下CheckList自检项进行全量自检,自检通过或不涉及,均修改 [ ] 为 [x] - [ ] 代码注释完备,正确记录错误日志 - [ ] 代码实现进行了返回值、空指针等校验 - [ ] PR标题正确使用类型标签,如:feat、fix、refactor、docs、test等 - [ ] PR持续集成流水线(CI)执行通过,代码检查无异常 See merge request: Ascend/pytorch!44705 | 20 小时前 | |
[sync] PR-40312: Update moe token unpermute DTensor support Co-authored-by: shawnylee233<lixiangyi1@huawei.com> # message auto-generated for no-merge-commit merge: !42530 merge sync-pr40312-feature/moe_token_permute_memory_opt-to-v2.9.0 into v2.9.0 [sync] PR-40312: Update moe token unpermute DTensor support Created-by: ascend-ds-bot Commit-by: shawnylee233 Merged-by: ascend-robot Description: ### 1. Origin pull request: https://gitcode.com/Ascend/pytorch/merge_requests/40312 ### 2. Original pull request related issue(s): https://gitcode.com/Ascend/pytorch/issues/3108 ### 3. Original pull request related commit(s): | Sha | Datetime | Message | |---|---|---| |[fc5ecd2f](https://gitcode.com/Ascend/pytorch/commit/fc5ecd2f0f2456827110f8f0a635d9cb51668594)|2026-07-16 09:43:21 +0800 CST|Update moe token unpermute DTensor support<br>| See merge request: Ascend/pytorch!42530 | 26 天前 | |
perf: defer dynamo/inductor loading on v2.9.0 (#2788) Co-authored-by: stevenaw0<huangguijun@huawei.com> # message auto-generated for no-merge-commit merge: !43444 merge v2.9.0_import into v2.9.0 perf: defer dynamo/inductor loading on v2.9.0 (#2788) Created-by: stevenaw0 Commit-by: stevenaw0 Merged-by: ascend-robot Description: ## 变更说明 将 v2.7.1_import 上的懒加载性能优化同步到 v2.9.0: - import torch_npu 时不再提前加载 torch._dynamo、torch._inductor 和 sympy。 - 首次导入或使用 Dynamo 入口时完成 Dynamo lazy setup;只有选择 Inductor backend 时才继续完成 Inductor lazy setup,非 Inductor backend 不初始化 Inductor。 - 设计上保留 torchair、npugraph_ex、transfer_to_npu、RNG prims 与公开接口行为;本文列出的测试和 CI 范围内未发现兼容性回归。 - 采用 v2.9.0 原生的 NPU Inductor device-op 注册路径,并保留目标分支的版本特有语义。 - 除 v2.7.1_import 的懒加载同步外,target 还包含一项来自 v2.10 修复意图、基于 v2.9 当前代码实现的 aten.erfc decomposition 重注册修复。 # v2.7.1_import 与 v2.9.0_import 改动差异总报告 ## 1. 报告目的 方便 committer 进行代码检视。 ## 2. “相同”与“差异”的判定规则 对每个文件分别提取两边 patch 的新增行和删除行,保留原始顺序和全部字符,然后逐字节比较: - **相同**:新增/删除代码行序列完全一致,包括空格、空行和文件末尾换行。 - **差异**:只要一个字符不同,或新增/删除行数不同,就标记为差异。 - **仅 v2.7.1**:v2.7.1 import 修改了该文件,v2.9.0 import 没有修改。 - **仅 v2.9.0**:v2.9.0 import 修改了该文件,v2.7.1 import 没有修改。 “改动代码相同”不等于“最终文件相同”。两个版本的基线代码本身可能不同;报告会把“同步 hunk 相同、最终文件因版本基线不同”单独说明。 本报告固定比较以下 SHA,避免维护分支继续前进后改变统计口径: - v2.7.1 source:0c9b783ca5635da8000e571fa60370f266a4e978..371545dc2e4a09ca2024ec220c3eed1b9a50ba48 - v2.9.0 target:dd936ee52a7202c144bd1322c04041955f0d2205..0bf5bdadcfa38f20608f6b5a6434dbe97ccb2c1b ## 3. 总体统计 两边 patch 的文件并集共 34 个文件;source 修改 33 个文件,target 修改 29 个文件: - 18 个文件的改动代码逐字符相同。 - 10 个文件双方都修改,但改动代码存在字符差异。 - 5 个文件仅 v2.7.1 修改,v2.9.0 采用不同的 DTensor 方案。 - 1 个文件仅 v2.9.0 修改,用于修复 aten.erfc decomposition 重复注册。 ### 3.1 改动代码完全相同的 18 个文件 | 文件 | v2.7.1 增/删 | v2.9.0 增/删 | 结论 | |---|---:|---:|---| | setup.py | +5/-0 | +5/-0 | entry point 声明完全相同 | | test/_inductor/test_current_device.py | +2/-1 | +2/-1 | 完全相同 | | test/_inductor/test_mlir_enable.py | +4/-1 | +4/-1 | 完全相同 | | test/npu/test_stream.py | +5/-0 | +5/-0 | 完全相同 | | test/utils/test_inductor.py | +0/-33 | +0/-33 | 删除代码完全相同 | | torch_npu/_init/patches/api_patches.py | +0/-2 | +0/-2 | 完全相同 | | torch_npu/_init/patches/distributed_patches.py | +61/-10 | +61/-10 | 完全相同 | | torch_npu/_init/patches/dynamo_patches.py | +0/-7 | +0/-7 | 完全相同 | | torch_npu/contrib/transfer_to_npu.py | +13/-1 | +13/-1 | 完全相同 | | torch_npu/distributed/fsdp/__init__.py | +2/-0 | +2/-0 | 完全相同 | | torch_npu/distributed/tensor/__init__.py | +14/-1 | +14/-1 | 完全相同 | | torch_npu/dynamo/__init__.py | +67/-5 | +67/-5 | 改动行完全相同;最终文件有一个基线空行差异 | | torch_npu/npu/__init__.py | +13/-2 | +13/-2 | 完全相同 | | torch_npu/npu/_graph_tree.py | +1/-12 | +1/-12 | 改动行完全相同;保留各版本图树基线 | | torch_npu/npu/_graph_tree_state.py | +11/-0 | +11/-0 | 新文件完全相同 | | torch_npu/npu/deterministic.py | +11/-3 | +11/-3 | 完全相同 | | torch_npu/utils/_graph_tree.py | +20/-9 | +20/-9 | 改动行完全相同;保留各版本 API 基线 | | torch_npu/utils/_rng_prims_patch.py | +255/-0 | +255/-0 | 新文件完全相同 | ### 3.2 双方都修改但代码不同的 10 个文件 | 文件 | v2.7.1 增/删 | v2.9.0 增/删 | 主要差异原因 | |---|---:|---:|---| | test/dynamo/test_compile_trigger.py | +1372/-0 | +1438/-0 | PyTorch 2.9 行为适配及 target 独有 has_triton、shape、fork 锁测试 | | test/test_torch_npu_init.py | +89/-14 | +79/-15 | DTensor OpSpec、TMA 名称及 bootstrap 快照版本差异 | | torch_npu/_inductor/kernel/bmm.py | +5/-4 | +3/-2 | v2.9 已无 bmm_configs/bmm_template 本地别名 | | torch_npu/_inductor/utils.py | +2/-1 | +2/-2 | source 在此定义并安装 has_triton;target 复用 _dynamo.py 的 v2.9 实现,只同步 Inductor 已绑定入口 | | torch_npu/_init/registry/registry_manager.py | +10/-24 | +8/-31 | 两版 registry 项目和初始化列表不同 | | torch_npu/distributed/__init__.py | +19/-1 | +18/-0 | 两版 distributed 基线 import 结构不同 | | torch_npu/npu/npugraph_ex/__init__.py | +2/-2 | +1/-1 | 基线空格/EOF 不同;最终文件收敛相同 | | torch_npu/utils/__init__.py | +1/-1 | +1/-0 | source 替换已有 import,target 在不同基线上新增;最终相同 | | torch_npu/utils/_dynamo.py | +447/-133 | +428/-129 | v2.9 wrapper、options、has_triton、AscendC、lookup 与 fork 锁适配 | | torch_npu/utils/_inductor.py | +8/-248 | +8/-247 | 删除代码相差一个基线空行;最终兼容转发文件相同 | ### 3.3 仅 v2.7.1 修改的 5 个文件 | 文件 | v2.7.1 增/删 | v2.9.0 | 原因 | |---|---:|---|---| | torch_npu/distributed/tensor/_attention.py | +2/-2 | 未修改 | v2.9 直接使用上游 register_sharding | | torch_npu/distributed/tensor/_dtensor_patch.py | +63/-0 | 未修改 | 2.7.1 需要本地轻量 helper;2.9 不需要复制上游实现 | | torch_npu/distributed/tensor/_math_ops.py | +2/-1 | 未修改 | 同上 | | torch_npu/distributed/tensor/_matrix_ops.py | +1/-1 | 未修改 | 同上 | | torch_npu/distributed/tensor/_moe_ops.py | +3/-2 | 未修改 | 同上 | ### 3.4 仅 v2.9.0 修改的 1 个文件 | 文件 | v2.7.1 | v2.9.0 增/删 | 原因 | |---|---|---:|---| | torch_npu/_inductor/decomposition.py | 未修改 | +1/-0 | 将 aten.erfc 加入重注册前的 overload 清理集合,避免 backend 重载时重复注册 | ## 4. 最重要的版本差异 ### 4.1 DTensor:v2.9 不同步 source 的 5 个文件改动是有意设计 v2.7.1 为避免导入 DTensor experimental API 间接加载 compiler 模块,在已有 _dtensor_patch.py 中增加轻量 register_sharding helper,并让 4 个算子文件改用该 helper。它依赖 2.7.1 内部结构,例如 TupleStrategy.childs 和 _is_inplace_op。 v2.9 保留算子文件对 PyTorch 自带 register_sharding 的直接使用。目标基线同时存在以下两种 PyTorch 2.9 兼容路径: python # _attention.py / _matrix_ops.py / _moe_ops.py from torch.distributed._tensor.experimental import register_sharding # _math_ops.py from torch.distributed.tensor.experimental import register_sharding 在 PyTorch 2.9 当前实现中,这些导入路径不会加载 Dynamo/Inductor,因此无需复制 2.7.1 的本地 decorator。target 最终没有新增 _sharding_registration.py,但仍保留并在 strategy 注册前加载目标基线已有的 _dtensor_patch.py;该文件负责 v2.9 的 kwargs strategy 和 expand_to_full_mesh_op_strategy 兼容,不是 2.7.1 register_sharding helper 的副本。 因此,target 未引入 _sharding_registration.py 对应的上游源码副本,也没有这类新增副本的 Meta/BSD License 声明要求;不能表述为 target 不存在 _dtensor_patch.py。 ### 4.2 has_triton:保留 v2.9 实现,并按初始化层级复用 v2.7.1 的 has_triton 是 torch_npu/_inductor/utils.py::patch_has_triton() 内部的缓存函数。v2.9 最终没有复制该函数体,也没有把自身实现移动到 Inductor 模块,而是把 v2.9 原有语义保留在 torch_npu/utils/_dynamo.py: python @functools.lru_cache(None) def has_triton() -> bool: from torch.utils._triton import has_triton_package if not has_triton_package(): return False from torch._dynamo.device_interface import get_interface_for_device ... _dynamo_register_interface_for_device() for device, extra_check in triton_supported_devices.items(): device_interface = get_interface_for_device(device) if device_interface.is_available() and extra_check(device_interface): return True return False 该实现逐项检查 CUDA、XPU、CPU、NPU;CPU 还要求 Triton CPU backend 存在,NPU 不查询 CUDA device properties。import torch_npu 时仅将这个轻量 callable 提前安装到 torch.utils._triton.has_triton,函数体内部的 Dynamo/Triton backend 导入仍延迟到首次调用,因此不会因为安装 patch 而提前加载 Dynamo/Inductor。 首次初始化 Inductor 后,torch_npu/_inductor/utils.py 复用同一个函数对象,更新 Inductor 已按值绑定的入口: python def patch_has_triton(): from torch._inductor import compile_fx from torch_npu.utils._dynamo import has_triton torch._inductor.scheduler.has_triton = has_triton compile_fx.has_triton = has_triton 这种归属确保全局只有一份 v2.9 设备判定实现,同时兼顾 import 阶段的早期 consumer 和 Inductor 加载后的已绑定 consumer。 ### 4.3 Inductor wrapper:v2.9 保留参数校验和 shape 延迟顺序 PyTorch 2.9 的 _TorchCompileInductorWrapper.__init__ 会在构造期间调用 self.apply_options()。target 因此不能复制 2.7.1 wrapper,而是保留以下顺序: text NPU option 名规范化及 npu_backend 类型预检 → PyTorch 2.9 src_init/src_apply_options 完成 mode、option 名和值校验 → 根据规范化 options/config/env 选择 NPU backend → 初始化所选 backend → 执行延迟记录的 shape handling patch → 执行 MLIR/DVM 构造期附加 scope 操作 target 还支持 PyTorch 2.9 原生的连字符 option alias: python attr_name = key.replace("-", "_") 因此 npu-backend/npu_backend、enable-shape-handling/enable_shape_handling 行为一致。任何校验失败都发生在 _setup_inductor_for_compile() 前,不会先初始化 NPU Inductor。 ### 4.4 backend lookup:两边最新实现均覆盖已绑定入口 v2.9 的 torch._dynamo.eval_frame 会按值绑定 lookup_backend。target 除更新 registry 外,还按 identity 更新已绑定入口: python registry.lookup_backend = lookup_backend if torch_dynamo.lookup_backend is original_lookup_backend: torch_dynamo.lookup_backend = lookup_backend if eval_frame.lookup_backend is original_lookup_backend: eval_frame.lookup_backend = lookup_backend 注册完成后通过 _COMPILER_FNS 无锁返回;只有指定 NPU backend 尚未出现在 _COMPILER_FNS 时才进入 RLock,避免正常 compile 热路径锁竞争。v2.7.1_import 最新提交也已同步该已绑定入口和无锁热路径语义,因此这不再是 target 独有能力。 ### 4.5 fork:两边均在 child 中重建 compiler 状态 两边最新实现都会在 child 中重建每个 run_once 的 Condition,并清除可能指向父进程线程的 running owner;已完成的 has_run 状态保留,fork 时尚未完成的 lazy setup 可由 child 重试。 两边也都维护 backend lookup 与 backend scope 两把 RLock。当前实现不在 fork 前获取并等待这些锁,而是在 child hook 中直接丢弃继承的锁对象: python def _reset_compiler_locks_after_fork(): global _INDUCTOR_NPU_BACKEND_LOCK, _DYNAMO_NPU_BACKEND_LOOKUP_LOCK _INDUCTOR_NPU_BACKEND_LOCK = threading.RLock() _DYNAMO_NPU_BACKEND_LOOKUP_LOCK = threading.RLock() os.register_at_fork(after_in_child=_reset_compiler_locks_after_fork) 父进程继续使用原锁,child 使用新锁,避免 child 继承一个由不存在的父线程永久持有的 RLock。该方案不保证 fork 前临时 TORCHINDUCTOR_NPU_BACKEND 已恢复;环境变量按 fork 瞬间复制,child backend scope 保存并恢复的是 fork 瞬间继承的值,不会自动推断父线程进入 scope 前的值。target 额外直接验证了父线程持有 lookup lock 时,child 可通过 torch._dynamo.lookup_backend("npu") 恢复;scope 测试直接覆盖 _NpuBackendScope,不能描述成 fork child 内执行完整 Inductor compile。 ### 4.6 AscendC deterministic:仅 target 需要保留的 v2.9 语义 AscendC deterministic 是 v2.9 target 独有的基线语义。实际 compile 调用进入 _NpuBackendScope("ascendc") 后,先按临时 backend 环境加载或切换 NPU Inductor,再安装 deterministic level cache-key patch;随后 new_call() 在调用 PyTorch 原 wrapper 前安装 Dynamo deterministic guard。两者都位于 backend scope 内,异常时 scope 仍恢复 TORCHINDUCTOR_NPU_BACKEND 并释放锁。2.7.1 source 没有对应分支,跨版本同步时必须保留 target 实现。 ### 4.7 aten.erfc:target 独有的重复注册修复 target 原本已定义 Triton erfc = 1 - erf(x) decomposition,但 backend 重载会再次执行注册。若 aten.erfc.default 等 overload 仍留在全局 decomposition 表,第二次注册会先报 duplicate registrations for aten.erfc.default。 0bf5bdadcf 仅将 aten.erfc 加入 DECOMPOSITION_OVERLOAD_OP:add_overload() 会展开 packet,并在现有 decorator 再次注册前删除 default、out 等旧 overload。在标准干净 registry 状态下,首次注册结果和数值公式不变,只修复重复初始化。 该语义参考 v2.10 提交 ab0acd320e,但实现是基于 v2.9 当前 decomposition 结构完成;它不是 v2.7.1_import patch 的一部分,也没有同步 ab0acd320e 的其他文件。 ## 5. 测试差异与审查提示 `test/dynamo/test_compile_trig See merge request: Ascend/pytorch!43444 | 6 天前 | |
[Fix] Fix static check errors detected by SPACES Co-authored-by: huangjingwei<huangjingwei4@huawei.com> # message auto-generated for no-merge-commit merge: !36364 merge v2.9.0_lintrunner into v2.9.0 [Fix] Fix static check errors detected by SPACES Created-by: huangjingwei Commit-by: huangjingwei Merged-by: ascend-robot Description: <!-- PR描述模板更新日期:20260203 --> # 【合入来源】 > <font color="red">**如有社区issue,请关联issue链接**</font>\ > <font color="red">**请勿携带内部流程信息(需求链接、问题单、内部issue等)**</font> - [ ] 需求 - [ ] 问题单 - [x] issue/工单 - [ ] 重构优化 - [ ] 资料更新 # 【修改方案】 检测和删除代码中的行尾空白字符 # 【资料变更】 不涉及 # 【接口变更】 不涉及 # 【功能验证】 不涉及 # 【CheckList】 > PR提交人对以下CheckList自检项进行全量自检,自检通过或不涉及,均修改 [ ] 为 [x] - [x] 代码注释完备,正确记录错误日志 - [x] 代码实现进行了返回值、空指针等校验 - [x] PR标题正确使用类型标签,如:feat、fix、refactor、docs、test等 - [x] PR持续集成流水线(CI)执行通过,代码检查无异常 See merge request: Ascend/pytorch!36364 | 2 个月前 | |
【fix】batcnnorm_check_fix Co-authored-by: 1479518308<cuiduo1@huawei.com> # message auto-generated for no-merge-commit merge: !36321 merge v2.9.0 into v2.9.0 【fix】batcnnorm_check_fix Created-by: cuiduo Commit-by: 1479518308 Merged-by: ascend-robot Description: <!-- PR描述模板更新日期:20260203 --> # 【合入来源】 > <font color="red">**如有社区issue,请关联issue链接**</font>\ > <font color="red">**请勿携带内部流程信息(需求链接、问题单、内部issue等)**</font> - [ ] 需求 - [ ] 问题单 - [x] issue/工单 - [ ] 重构优化 - [ ] 资料更新 # 【修改方案】 > 为batcnnorm修改校验位置,适配NestedTensor以对其社区 # 【资料变更】 > 不涉及 # 【接口变更】 > 不涉及 # 【功能验证】 > 本地验证pass # 【CheckList】 > PR提交人对以下CheckList自检项进行全量自检,自检通过或不涉及,均修改 [ ] 为 [x] - [x] 代码注释完备,正确记录错误日志 - [x] 代码实现进行了返回值、空指针等校验 - [x] PR标题正确使用类型标签,如:feat、fix、refactor、docs、test等 - [x] PR持续集成流水线(CI)执行通过,代码检查无异常 See merge request: Ascend/pytorch!36321 | 2 个月前 | |
perf: defer dynamo/inductor loading on v2.9.0 (#2788) Co-authored-by: stevenaw0<huangguijun@huawei.com> # message auto-generated for no-merge-commit merge: !43444 merge v2.9.0_import into v2.9.0 perf: defer dynamo/inductor loading on v2.9.0 (#2788) Created-by: stevenaw0 Commit-by: stevenaw0 Merged-by: ascend-robot Description: ## 变更说明 将 v2.7.1_import 上的懒加载性能优化同步到 v2.9.0: - import torch_npu 时不再提前加载 torch._dynamo、torch._inductor 和 sympy。 - 首次导入或使用 Dynamo 入口时完成 Dynamo lazy setup;只有选择 Inductor backend 时才继续完成 Inductor lazy setup,非 Inductor backend 不初始化 Inductor。 - 设计上保留 torchair、npugraph_ex、transfer_to_npu、RNG prims 与公开接口行为;本文列出的测试和 CI 范围内未发现兼容性回归。 - 采用 v2.9.0 原生的 NPU Inductor device-op 注册路径,并保留目标分支的版本特有语义。 - 除 v2.7.1_import 的懒加载同步外,target 还包含一项来自 v2.10 修复意图、基于 v2.9 当前代码实现的 aten.erfc decomposition 重注册修复。 # v2.7.1_import 与 v2.9.0_import 改动差异总报告 ## 1. 报告目的 方便 committer 进行代码检视。 ## 2. “相同”与“差异”的判定规则 对每个文件分别提取两边 patch 的新增行和删除行,保留原始顺序和全部字符,然后逐字节比较: - **相同**:新增/删除代码行序列完全一致,包括空格、空行和文件末尾换行。 - **差异**:只要一个字符不同,或新增/删除行数不同,就标记为差异。 - **仅 v2.7.1**:v2.7.1 import 修改了该文件,v2.9.0 import 没有修改。 - **仅 v2.9.0**:v2.9.0 import 修改了该文件,v2.7.1 import 没有修改。 “改动代码相同”不等于“最终文件相同”。两个版本的基线代码本身可能不同;报告会把“同步 hunk 相同、最终文件因版本基线不同”单独说明。 本报告固定比较以下 SHA,避免维护分支继续前进后改变统计口径: - v2.7.1 source:0c9b783ca5635da8000e571fa60370f266a4e978..371545dc2e4a09ca2024ec220c3eed1b9a50ba48 - v2.9.0 target:dd936ee52a7202c144bd1322c04041955f0d2205..0bf5bdadcfa38f20608f6b5a6434dbe97ccb2c1b ## 3. 总体统计 两边 patch 的文件并集共 34 个文件;source 修改 33 个文件,target 修改 29 个文件: - 18 个文件的改动代码逐字符相同。 - 10 个文件双方都修改,但改动代码存在字符差异。 - 5 个文件仅 v2.7.1 修改,v2.9.0 采用不同的 DTensor 方案。 - 1 个文件仅 v2.9.0 修改,用于修复 aten.erfc decomposition 重复注册。 ### 3.1 改动代码完全相同的 18 个文件 | 文件 | v2.7.1 增/删 | v2.9.0 增/删 | 结论 | |---|---:|---:|---| | setup.py | +5/-0 | +5/-0 | entry point 声明完全相同 | | test/_inductor/test_current_device.py | +2/-1 | +2/-1 | 完全相同 | | test/_inductor/test_mlir_enable.py | +4/-1 | +4/-1 | 完全相同 | | test/npu/test_stream.py | +5/-0 | +5/-0 | 完全相同 | | test/utils/test_inductor.py | +0/-33 | +0/-33 | 删除代码完全相同 | | torch_npu/_init/patches/api_patches.py | +0/-2 | +0/-2 | 完全相同 | | torch_npu/_init/patches/distributed_patches.py | +61/-10 | +61/-10 | 完全相同 | | torch_npu/_init/patches/dynamo_patches.py | +0/-7 | +0/-7 | 完全相同 | | torch_npu/contrib/transfer_to_npu.py | +13/-1 | +13/-1 | 完全相同 | | torch_npu/distributed/fsdp/__init__.py | +2/-0 | +2/-0 | 完全相同 | | torch_npu/distributed/tensor/__init__.py | +14/-1 | +14/-1 | 完全相同 | | torch_npu/dynamo/__init__.py | +67/-5 | +67/-5 | 改动行完全相同;最终文件有一个基线空行差异 | | torch_npu/npu/__init__.py | +13/-2 | +13/-2 | 完全相同 | | torch_npu/npu/_graph_tree.py | +1/-12 | +1/-12 | 改动行完全相同;保留各版本图树基线 | | torch_npu/npu/_graph_tree_state.py | +11/-0 | +11/-0 | 新文件完全相同 | | torch_npu/npu/deterministic.py | +11/-3 | +11/-3 | 完全相同 | | torch_npu/utils/_graph_tree.py | +20/-9 | +20/-9 | 改动行完全相同;保留各版本 API 基线 | | torch_npu/utils/_rng_prims_patch.py | +255/-0 | +255/-0 | 新文件完全相同 | ### 3.2 双方都修改但代码不同的 10 个文件 | 文件 | v2.7.1 增/删 | v2.9.0 增/删 | 主要差异原因 | |---|---:|---:|---| | test/dynamo/test_compile_trigger.py | +1372/-0 | +1438/-0 | PyTorch 2.9 行为适配及 target 独有 has_triton、shape、fork 锁测试 | | test/test_torch_npu_init.py | +89/-14 | +79/-15 | DTensor OpSpec、TMA 名称及 bootstrap 快照版本差异 | | torch_npu/_inductor/kernel/bmm.py | +5/-4 | +3/-2 | v2.9 已无 bmm_configs/bmm_template 本地别名 | | torch_npu/_inductor/utils.py | +2/-1 | +2/-2 | source 在此定义并安装 has_triton;target 复用 _dynamo.py 的 v2.9 实现,只同步 Inductor 已绑定入口 | | torch_npu/_init/registry/registry_manager.py | +10/-24 | +8/-31 | 两版 registry 项目和初始化列表不同 | | torch_npu/distributed/__init__.py | +19/-1 | +18/-0 | 两版 distributed 基线 import 结构不同 | | torch_npu/npu/npugraph_ex/__init__.py | +2/-2 | +1/-1 | 基线空格/EOF 不同;最终文件收敛相同 | | torch_npu/utils/__init__.py | +1/-1 | +1/-0 | source 替换已有 import,target 在不同基线上新增;最终相同 | | torch_npu/utils/_dynamo.py | +447/-133 | +428/-129 | v2.9 wrapper、options、has_triton、AscendC、lookup 与 fork 锁适配 | | torch_npu/utils/_inductor.py | +8/-248 | +8/-247 | 删除代码相差一个基线空行;最终兼容转发文件相同 | ### 3.3 仅 v2.7.1 修改的 5 个文件 | 文件 | v2.7.1 增/删 | v2.9.0 | 原因 | |---|---:|---|---| | torch_npu/distributed/tensor/_attention.py | +2/-2 | 未修改 | v2.9 直接使用上游 register_sharding | | torch_npu/distributed/tensor/_dtensor_patch.py | +63/-0 | 未修改 | 2.7.1 需要本地轻量 helper;2.9 不需要复制上游实现 | | torch_npu/distributed/tensor/_math_ops.py | +2/-1 | 未修改 | 同上 | | torch_npu/distributed/tensor/_matrix_ops.py | +1/-1 | 未修改 | 同上 | | torch_npu/distributed/tensor/_moe_ops.py | +3/-2 | 未修改 | 同上 | ### 3.4 仅 v2.9.0 修改的 1 个文件 | 文件 | v2.7.1 | v2.9.0 增/删 | 原因 | |---|---|---:|---| | torch_npu/_inductor/decomposition.py | 未修改 | +1/-0 | 将 aten.erfc 加入重注册前的 overload 清理集合,避免 backend 重载时重复注册 | ## 4. 最重要的版本差异 ### 4.1 DTensor:v2.9 不同步 source 的 5 个文件改动是有意设计 v2.7.1 为避免导入 DTensor experimental API 间接加载 compiler 模块,在已有 _dtensor_patch.py 中增加轻量 register_sharding helper,并让 4 个算子文件改用该 helper。它依赖 2.7.1 内部结构,例如 TupleStrategy.childs 和 _is_inplace_op。 v2.9 保留算子文件对 PyTorch 自带 register_sharding 的直接使用。目标基线同时存在以下两种 PyTorch 2.9 兼容路径: python # _attention.py / _matrix_ops.py / _moe_ops.py from torch.distributed._tensor.experimental import register_sharding # _math_ops.py from torch.distributed.tensor.experimental import register_sharding 在 PyTorch 2.9 当前实现中,这些导入路径不会加载 Dynamo/Inductor,因此无需复制 2.7.1 的本地 decorator。target 最终没有新增 _sharding_registration.py,但仍保留并在 strategy 注册前加载目标基线已有的 _dtensor_patch.py;该文件负责 v2.9 的 kwargs strategy 和 expand_to_full_mesh_op_strategy 兼容,不是 2.7.1 register_sharding helper 的副本。 因此,target 未引入 _sharding_registration.py 对应的上游源码副本,也没有这类新增副本的 Meta/BSD License 声明要求;不能表述为 target 不存在 _dtensor_patch.py。 ### 4.2 has_triton:保留 v2.9 实现,并按初始化层级复用 v2.7.1 的 has_triton 是 torch_npu/_inductor/utils.py::patch_has_triton() 内部的缓存函数。v2.9 最终没有复制该函数体,也没有把自身实现移动到 Inductor 模块,而是把 v2.9 原有语义保留在 torch_npu/utils/_dynamo.py: python @functools.lru_cache(None) def has_triton() -> bool: from torch.utils._triton import has_triton_package if not has_triton_package(): return False from torch._dynamo.device_interface import get_interface_for_device ... _dynamo_register_interface_for_device() for device, extra_check in triton_supported_devices.items(): device_interface = get_interface_for_device(device) if device_interface.is_available() and extra_check(device_interface): return True return False 该实现逐项检查 CUDA、XPU、CPU、NPU;CPU 还要求 Triton CPU backend 存在,NPU 不查询 CUDA device properties。import torch_npu 时仅将这个轻量 callable 提前安装到 torch.utils._triton.has_triton,函数体内部的 Dynamo/Triton backend 导入仍延迟到首次调用,因此不会因为安装 patch 而提前加载 Dynamo/Inductor。 首次初始化 Inductor 后,torch_npu/_inductor/utils.py 复用同一个函数对象,更新 Inductor 已按值绑定的入口: python def patch_has_triton(): from torch._inductor import compile_fx from torch_npu.utils._dynamo import has_triton torch._inductor.scheduler.has_triton = has_triton compile_fx.has_triton = has_triton 这种归属确保全局只有一份 v2.9 设备判定实现,同时兼顾 import 阶段的早期 consumer 和 Inductor 加载后的已绑定 consumer。 ### 4.3 Inductor wrapper:v2.9 保留参数校验和 shape 延迟顺序 PyTorch 2.9 的 _TorchCompileInductorWrapper.__init__ 会在构造期间调用 self.apply_options()。target 因此不能复制 2.7.1 wrapper,而是保留以下顺序: text NPU option 名规范化及 npu_backend 类型预检 → PyTorch 2.9 src_init/src_apply_options 完成 mode、option 名和值校验 → 根据规范化 options/config/env 选择 NPU backend → 初始化所选 backend → 执行延迟记录的 shape handling patch → 执行 MLIR/DVM 构造期附加 scope 操作 target 还支持 PyTorch 2.9 原生的连字符 option alias: python attr_name = key.replace("-", "_") 因此 npu-backend/npu_backend、enable-shape-handling/enable_shape_handling 行为一致。任何校验失败都发生在 _setup_inductor_for_compile() 前,不会先初始化 NPU Inductor。 ### 4.4 backend lookup:两边最新实现均覆盖已绑定入口 v2.9 的 torch._dynamo.eval_frame 会按值绑定 lookup_backend。target 除更新 registry 外,还按 identity 更新已绑定入口: python registry.lookup_backend = lookup_backend if torch_dynamo.lookup_backend is original_lookup_backend: torch_dynamo.lookup_backend = lookup_backend if eval_frame.lookup_backend is original_lookup_backend: eval_frame.lookup_backend = lookup_backend 注册完成后通过 _COMPILER_FNS 无锁返回;只有指定 NPU backend 尚未出现在 _COMPILER_FNS 时才进入 RLock,避免正常 compile 热路径锁竞争。v2.7.1_import 最新提交也已同步该已绑定入口和无锁热路径语义,因此这不再是 target 独有能力。 ### 4.5 fork:两边均在 child 中重建 compiler 状态 两边最新实现都会在 child 中重建每个 run_once 的 Condition,并清除可能指向父进程线程的 running owner;已完成的 has_run 状态保留,fork 时尚未完成的 lazy setup 可由 child 重试。 两边也都维护 backend lookup 与 backend scope 两把 RLock。当前实现不在 fork 前获取并等待这些锁,而是在 child hook 中直接丢弃继承的锁对象: python def _reset_compiler_locks_after_fork(): global _INDUCTOR_NPU_BACKEND_LOCK, _DYNAMO_NPU_BACKEND_LOOKUP_LOCK _INDUCTOR_NPU_BACKEND_LOCK = threading.RLock() _DYNAMO_NPU_BACKEND_LOOKUP_LOCK = threading.RLock() os.register_at_fork(after_in_child=_reset_compiler_locks_after_fork) 父进程继续使用原锁,child 使用新锁,避免 child 继承一个由不存在的父线程永久持有的 RLock。该方案不保证 fork 前临时 TORCHINDUCTOR_NPU_BACKEND 已恢复;环境变量按 fork 瞬间复制,child backend scope 保存并恢复的是 fork 瞬间继承的值,不会自动推断父线程进入 scope 前的值。target 额外直接验证了父线程持有 lookup lock 时,child 可通过 torch._dynamo.lookup_backend("npu") 恢复;scope 测试直接覆盖 _NpuBackendScope,不能描述成 fork child 内执行完整 Inductor compile。 ### 4.6 AscendC deterministic:仅 target 需要保留的 v2.9 语义 AscendC deterministic 是 v2.9 target 独有的基线语义。实际 compile 调用进入 _NpuBackendScope("ascendc") 后,先按临时 backend 环境加载或切换 NPU Inductor,再安装 deterministic level cache-key patch;随后 new_call() 在调用 PyTorch 原 wrapper 前安装 Dynamo deterministic guard。两者都位于 backend scope 内,异常时 scope 仍恢复 TORCHINDUCTOR_NPU_BACKEND 并释放锁。2.7.1 source 没有对应分支,跨版本同步时必须保留 target 实现。 ### 4.7 aten.erfc:target 独有的重复注册修复 target 原本已定义 Triton erfc = 1 - erf(x) decomposition,但 backend 重载会再次执行注册。若 aten.erfc.default 等 overload 仍留在全局 decomposition 表,第二次注册会先报 duplicate registrations for aten.erfc.default。 0bf5bdadcf 仅将 aten.erfc 加入 DECOMPOSITION_OVERLOAD_OP:add_overload() 会展开 packet,并在现有 decorator 再次注册前删除 default、out 等旧 overload。在标准干净 registry 状态下,首次注册结果和数值公式不变,只修复重复初始化。 该语义参考 v2.10 提交 ab0acd320e,但实现是基于 v2.9 当前 decomposition 结构完成;它不是 v2.7.1_import patch 的一部分,也没有同步 ab0acd320e 的其他文件。 ## 5. 测试差异与审查提示 `test/dynamo/test_compile_trig See merge request: Ascend/pytorch!43444 | 6 天前 | |
[onnx] fix group_norm_silu and rotary_mul onnx api. Co-authored-by: shi-jiaxin9<shijiaxin10@h-partners.com> # message auto-generated for no-merge-commit merge: !31962 merge v2.9.0 into v2.9.0 [onnx] fix group_norm_silu and rotary_mul onnx api. Created-by: shi-jiaxin9 Commit-by: shi-jiaxin9 Merged-by: ascend-robot Description: <!-- PR描述模板更新日期:20260203 --> # 【合入来源】 > <font color="red">**如有社区issue,请关联issue链接**</font>\ > <font color="red">**请勿携带内部流程信息(需求链接、问题单、内部issue等)**</font> - [ ] 问题单 # 【修改方案】 > 请描述修改内容的具体实现,涉及哪些组件之间进行交互,可以用1、2、3、...进行罗列\ > 如果是需求或者重构类的PR,需要补充详细设计文档(说明上下游组件关系、时序图、类图、DFX能力等内容) # 【资料变更】 > 请确认是否涉及资料变更。如涉及,需要在PR中体现,并简要说明修改内容。如不涉及,需填写“不涉及” # 【接口变更】 > 请确认是否涉及跨代码仓或者客户面可见的接口变更。如涉及,需要详细说明接口以及对应的变更内容,同时需要在资料中体现。如不涉及,需填写“不涉及” # 【功能验证】 > 说明测试场景,测试方法。如果本次测试方式与常规单元测试不同,请详细说明您的测试步骤\ > 新增/变更内容是否已新增/适配UT测试用例看护,并补充测试自验证截图 # 【CheckList】 > PR提交人对以下CheckList自检项进行全量自检,自检通过或不涉及,均修改 [ ] 为 [x] - [ ] 代码注释完备,正确记录错误日志 - [ ] 代码实现进行了返回值、空指针等校验 - [ ] PR标题正确使用类型标签,如:feat、fix、refactor、docs、test等 - [ ] PR持续集成流水线(CI)执行通过,代码检查无异常 See merge request: Ascend/pytorch!31962 | 4 个月前 | |
[Fix] Fix static check errors detected by SPACES Co-authored-by: huangjingwei<huangjingwei4@huawei.com> # message auto-generated for no-merge-commit merge: !36364 merge v2.9.0_lintrunner into v2.9.0 [Fix] Fix static check errors detected by SPACES Created-by: huangjingwei Commit-by: huangjingwei Merged-by: ascend-robot Description: <!-- PR描述模板更新日期:20260203 --> # 【合入来源】 > <font color="red">**如有社区issue,请关联issue链接**</font>\ > <font color="red">**请勿携带内部流程信息(需求链接、问题单、内部issue等)**</font> - [ ] 需求 - [ ] 问题单 - [x] issue/工单 - [ ] 重构优化 - [ ] 资料更新 # 【修改方案】 检测和删除代码中的行尾空白字符 # 【资料变更】 不涉及 # 【接口变更】 不涉及 # 【功能验证】 不涉及 # 【CheckList】 > PR提交人对以下CheckList自检项进行全量自检,自检通过或不涉及,均修改 [ ] 为 [x] - [x] 代码注释完备,正确记录错误日志 - [x] 代码实现进行了返回值、空指针等校验 - [x] PR标题正确使用类型标签,如:feat、fix、refactor、docs、test等 - [x] PR持续集成流水线(CI)执行通过,代码检查无异常 See merge request: Ascend/pytorch!36364 | 2 个月前 | |
[sync] PR-41600: 【fix】【PROFILING】set gc.disable in analysis subprocesses Co-authored-by: Seanesmhxocism<617225691@qq.com> # message auto-generated for no-merge-commit merge: !41671 merge cherry-pick-mr-41600-1784027824291-auto into v2.9.0 [sync] PR-41600: 【fix】【PROFILING】set gc.disable in analysis subprocesses Created-by: Seanesmhxocism Commit-by: Seanesmhxocism Merged-by: ascend-robot Description: <!-- PR描述模板更新日期:20260203 --> # 【合入来源】 > <font color="red">**如有社区issue,请关联issue链接**</font>\ https://gitcode.com/Ascend/pytorch/issues/2854 > <font color="red">**请勿携带内部流程信息(需求链接、问题单、内部issue等)**</font> - [ ] 需求 - [ ] 问题单 - [x] issue/工单 - [ ] 重构优化 - [ ] 资料更新 # 【修改方案】 > 请描述修改内容的具体实现,涉及哪些组件之间进行交互,可以用1、2、3、...进行罗列\ > 如果是需求或者重构类的PR,需要补充详细设计文档(说明上下游组件关系、时序图、类图、DFX能力等内容) 在进程拉起时,关闭子进程中的gc能力。避免在子进程中触发gc,和fork产生冲突 # 【资料变更】 > 请确认是否涉及资料变更。如涉及,需要在PR中体现,并简要说明修改内容。如不涉及,需填写“不涉及” # 【接口变更】 > 请确认是否涉及跨代码仓或者客户面可见的接口变更。如涉及,需要详细说明接口以及对应的变更内容,同时需要在资料中体现。如不涉及,需填写“不涉及” # 【功能验证】 > 说明测试场景,测试方法。如果本次测试方式与常规单元测试不同,请详细说明您的测试步骤\ > 新增/变更内容是否已新增/适配UT测试用例看护,并补充测试自验证截图 # 【CheckList】 > PR提交人对以下CheckList自检项进行全量自检,自检通过或不涉及,均修改 [ ] 为 [x] - [ ] 代码注释完备,正确记录错误日志 - [ ] 代码实现进行了返回值、空指针等校验 - [ ] PR标题正确使用类型标签,如:feat、fix、refactor、docs、test等 - [ ] PR持续集成流水线(CI)执行通过,代码检查无异常 See merge request: Ascend/pytorch!41671 | 1 个月前 | |
[Fix] Fix static check errors detected by SPACES Co-authored-by: huangjingwei<huangjingwei4@huawei.com> # message auto-generated for no-merge-commit merge: !36364 merge v2.9.0_lintrunner into v2.9.0 [Fix] Fix static check errors detected by SPACES Created-by: huangjingwei Commit-by: huangjingwei Merged-by: ascend-robot Description: <!-- PR描述模板更新日期:20260203 --> # 【合入来源】 > <font color="red">**如有社区issue,请关联issue链接**</font>\ > <font color="red">**请勿携带内部流程信息(需求链接、问题单、内部issue等)**</font> - [ ] 需求 - [ ] 问题单 - [x] issue/工单 - [ ] 重构优化 - [ ] 资料更新 # 【修改方案】 检测和删除代码中的行尾空白字符 # 【资料变更】 不涉及 # 【接口变更】 不涉及 # 【功能验证】 不涉及 # 【CheckList】 > PR提交人对以下CheckList自检项进行全量自检,自检通过或不涉及,均修改 [ ] 为 [x] - [x] 代码注释完备,正确记录错误日志 - [x] 代码实现进行了返回值、空指针等校验 - [x] PR标题正确使用类型标签,如:feat、fix、refactor、docs、test等 - [x] PR持续集成流水线(CI)执行通过,代码检查无异常 See merge request: Ascend/pytorch!36364 | 2 个月前 | |
fix: preserve deferred Triton backend loading (v2.9.0) Co-authored-by: stevenaw0<huangguijun@huawei.com> # message auto-generated for no-merge-commit merge: !44735 merge sync/deferred-triton-loader-v2.9.0 into v2.9.0 fix: preserve deferred Triton backend loading (v2.9.0) Created-by: stevenaw0 Commit-by: stevenaw0 Merged-by: ascend-robot Description: ## 关联 Issue - #4094 ## 背景 import torch性能优化需求(pull/44372)将 Inductor 初始化从首次 backend 执行阶段提前到 torch.compile() wrapper 创建阶段。默认 Triton backend 因此被提前导入;在未安装 triton-ascend 的环境中,torch_npu/_inductor/runtime/triton_helpers.py 会报 tl.extra.ascend 缺失。 ## 修改内容 - 恢复默认 Inductor backend 的首次执行加载时机。 - 增加测试,验证创建 backend="inductor" wrapper 时不会加载 torch_npu._inductor。 ## 验证 环境:torch-npu-2.10.0-py311、PyTorch 2.10.0+cpu、AArch64、CANN 9.1.0。 - 原 tl.extra.ascend 缺失错误消失。 See merge request: Ascend/pytorch!44735 | 3 小时前 | |
[sync] PR-39678: revert: detect Ascend950 SoC for TORCH_NPU_USE_COMPATIBLE_IMPL default Co-authored-by: wuyouqi1<wuyouqi1@h-partners.com> # message auto-generated for no-merge-commit merge: !39724 merge sync-pr39678-revert/compat-impl-socname-routing-26.1.0-to-v2.9.0 into v2.9.0 [sync] PR-39678: revert: detect Ascend950 SoC for TORCH_NPU_USE_COMPATIBLE_IMPL default Created-by: ascend-ds-bot Commit-by: wuyouqi1 Merged-by: ascend-robot Description: ### 1. Origin pull request: https://gitcode.com/Ascend/pytorch/merge_requests/39678 ### 2. Original pull request related issue(s): https://gitcode.com/Ascend/pytorch/issues/2561 ### 3. Original pull request related commit(s): | Sha | Datetime | Message | |---|---|---| |[8539c290](https://gitcode.com/Ascend/pytorch/commit/8539c290bd0035b66335b3e92ac28540de8c2805)|2026-06-30 21:08:41 +0800 CST|Revert "feat: detect Ascend950 SoC for TORCH_NPU_USE_COMPATIBLE_IMPL default"<br><br>This reverts commit acebf35339791ea6fcac6f116acdb242a1c09096.<br><br>Removes the _is_ascend950() SoC auto-detection and the SoC-based default-value assignment for TORCH_NPU_USE_COMPATIBLE_IMPL in torch_npu/__init__.py, and drops test_compatible_impl_soc_detect.py.<br><br>Co-Authored-By: Claude <noreply@anthropic.com><br>| See merge request: Ascend/pytorch!39724 | 1 个月前 | |
| 11 个月前 | ||
| 11 个月前 |