| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
[sync] PR-35715: [feat]profiler dyno support rank list Co-authored-by: hehongzhe<935062458@qq.com> # message auto-generated for no-merge-commit merge: !37337 merge sync-pr35715-rank-to-master into master [sync] PR-35715: [feat]profiler dyno support rank list Created-by: ascend-ds-bot Commit-by: hehongzhe Merged-by: ascend-robot Description: ### 1. Origin pull request: https://gitcode.com/Ascend/pytorch/merge_requests/35715 ### 2. Original pull request related issue(s): https://gitcode.com/Ascend/pytorch/issues/1963 ### 3. Original pull request related commit(s): | Sha | Datetime | Message | |---|---|---| |[b03d2316](https://gitcode.com/Ascend/pytorch/commit/b03d231684cec89b2fbbab41f928a87b74bb7968)|2026-05-26 20:58:08 +0800 CST|profiler dyno support rank list<br>| See merge request: Ascend/pytorch!37337 | 3 个月前 | |
[feat]torch_npu profiler analysis ability of display prof level0 && kernel shapes Co-authored-by: xieanran<694099604@qq.com> # message auto-generated for no-merge-commit merge: !44924 merge l0shape into master [feat]torch_npu profiler analysis ability of display prof level0 && kernel shapes Created-by: SoraAzzz Commit-by: xieanran Merged-by: ascend-robot Description: <!-- PR描述模板更新日期:20260203 --> # 【合入来源】 > <font color="red">**如有社区issue,请关联issue链接**</font>\ > <font color="red">**请勿携带内部流程信息(需求链接、问题单、内部issue等)**</font> - [x] 需求 - [ ] 问题单 - [x] issue/工单https://gitcode.com/Ascend/pytorch/issues/4212 - [ ] 重构优化 - [ ] 资料更新 # 【修改方案】 > 请描述修改内容的具体实现,涉及哪些组件之间进行交互,可以用1、2、3、...进行罗列\ > 如果是需求或者重构类的PR,需要补充详细设计文档(说明上下游组件关系、时序图、类图、DFX能力等内容) 新增形状表头常量 OP_SUMMARY_SHAPE_HEADERS: 在 _csv_headers.py 中新增形状相关列定义(Input Shapes、Input Data Types、Input Formats、Output Shapes、Output Data Types、Output Formats),为 kernel details输出 shape 信息提供表头 新增 _get_kernel_headers 过滤逻辑: 在 _kernel_view_parser.py 中新增类方法 _get_kernel_headers,当 is_all_kernel_headers 为真时返回全部表头;否则仅返回 OP_SUMMARY_SHOW_HEADERS 拼接源数据中存在的表头 generate_view 接入表头过滤: 将 OpSummaryBean.headers 的赋值改为通过 _get_kernel_headers(all_data[0].all_headers, ProfilerConfig().is_all_kernel_headers()) 计算,使 level0 模式下输出 CSV 时过滤掉 Model ID 等非展示字段,同时保留base 表头以及shape表头及数据 # 【资料变更】 > 请确认是否涉及资料变更。如涉及,需要在PR中体现,并简要说明修改内容。如不涉及,需填写“不涉及” > kernel_details.csv在l0下存在新增表头 # 【接口变更】 > 请确认是否涉及跨代码仓或者客户面可见的接口变更。如涉及,需要详细说明接口以及对应的变更内容,同时需要在资料中体现。如不涉及,需填写“不涉及” > 不涉及 # 【功能验证】 > 说明测试场景,测试方法。如果本次测试方式与常规单元测试不同,请详细说明您的测试步骤\ > 新增/变更内容是否已新增/适配UT测试用例看护,并补充测试自验证截图  # 【CheckList】 > PR提交人对以下CheckList自检项进行全量自检,自检通过或不涉及,均修改 [ ] 为 [x] - [x] 代码注释完备,正确记录错误日志 - [x] 代码实现进行了返回值、空指针等校验 - [x] PR标题正确使用类型标签,如:feat、fix、refactor、docs、test等 - [x] PR持续集成流水线(CI)执行通过,代码检查无异常 See merge request: Ascend/pytorch!44924 | 1 个月前 | |
refactor for torch_npu init module. Co-authored-by: bellatan<tanmei2@huawei.com> # message auto-generated for no-merge-commit merge: !35338 merge torch_npu_init_refactor into master 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!35338 | 4 个月前 | |
fix(profiler): sanitise trace metadata that would corrupt the export Co-authored-by: Dmitry Gladkov<gladkov.dmitry1@huawei.com> # message auto-generated for no-merge-commit merge: !43429 merge fix/profiler-metadata-sanitizer into master fix(profiler): sanitise trace metadata that would corrupt the export Created-by: gladkov_dmitry Commit-by: Dmitry Gladkov Merged-by: ascend-robot Description: <!-- PR描述模板更新日期:20260203 --> # 【合入来源】 - [ ] Requirement / Feature - [x] 问题单 - [ ] issue/工单 - [ ] 重构优化 - [ ] 资料更新 # 【Modification Scheme】 A metadata value containing a double quote makes the exported chrome trace unparseable, losing the whole recording. Two defects combine. > torch.profiler's add_metadata wraps the value with '"' + value.replace('"', '\"') + '"', escaping quotes but not backslashes, so a value such as C:\temp is already malformed JSON before any writer sees it. > The trace writer then replaces every backslash with a forward slash, turning a correctly escaped \" into /" and ending the JSON string early. add_metadata_json is affected identically, so routing a value through it is not a workaround. Neither can be fixed in torch_npu: the writer belongs to PyTorch's libkineto, which is not vendored here. This patch removes the offending characters before the value is handed over and warns when a value had to be altered, so a quote costs the user an approximation of their string instead of the entire recording. > torch_npu/profiler/_add_metadata_sanitizer_patch.py: replaces characters whose JSON encoding would contain a backslash - quote, backslash and control characters - and walks nested structures for the JSON variant, re-serialising with ensure_ascii=False so no \uXXXX escapes are introduced either. > torch_npu/_init/patches/profiler_patches.py: registered in the "profiler" patch group beside the existing mstx and perf-dump patches. > Values that would have been written correctly pass through byte for byte and raise no warning, so nothing changes for anyone whose metadata already worked. Not NPU-specific: the defect reproduces with activities=[ProfilerActivity.CPU] alone, with no device activity involved. # 【Documentation Change】 > Not involved. The behaviour is described in the module docstring, and the user is warned at runtime whenever a value is altered. # 【Interface Change】 > No API signature change. Customer-visible: a metadata value containing a double quote, backslash or control character is now written in an altered form with a UserWarning, rather than producing an unparseable trace file. Values without those characters are unaffected. # 【Functional Verification】 bash cd /tmp && python /path/to/test/profiler/test_metadata_sanitizer.py > 16 tests across three classes, all passing in 0.02 s. CPU activity only - no NPU and no PrivateUse1 backend required, so this runs anywhere torch_npu can be imported. > test_underlying_defect_is_still_present reproduces the defect through the underlying API that add_metadata funnels into, confirming the writer still corrupts an unsanitised value; test_trace_parses_with_a_quoted_value confirms the patched path produces a valid trace; test_a_clean_value_raises_no_warning confirms unaffected values are untouched. # 【CheckList】 - [x] Comments complete; the user is warned when a value is altered - [x] Return-value / null-pointer checks done - [x] PR title uses type label (fix) - [ ] PR持续集成流水线(CI)执行通过,代码检查无异常 See merge request: Ascend/pytorch!43429 | 1 个月前 | |
| 1 年前 | ||
bugfix for profiler FLOPs when actual seq len can be zero Co-authored-by: fanglanyue<lanyuefang0916@163.com> # message auto-generated for no-merge-commit merge: !40262 merge mfu_bugfix into master bugfix for profiler FLOPs when actual seq len can be zero Created-by: fanglanyue0916 Commit-by: fanglanyue Merged-by: ascend-robot Description: <!-- PR描述模板更新日期:20260203 --> # 【合入来源】 > <font color="red">**如有社区issue,请关联issue链接**</font>\ > <font color="red">**请勿携带内部流程信息(需求链接、问题单、内部issue等)**</font> - [ ] 需求 - [ ] 问题单 - [x] issue/工单: https://gitcode.com/Ascend/pytorch/issues/2608 - [ ] 重构优化 - [ ] 资料更新 # 【修改方案】 > 请描述修改内容的具体实现,涉及哪些组件之间进行交互,可以用1、2、3、...进行罗列\ > 如果是需求或者重构类的PR,需要补充详细设计文档(说明上下游组件关系、时序图、类图、DFX能力等内容) 在做attention算子tnd格式的FLOPs计算时,修改实际序列长度<=0的校验,改为只校验是否<0 # 【资料变更】 > 请确认是否涉及资料变更。如涉及,需要在PR中体现,并简要说明修改内容。如不涉及,需填写“不涉及” # 【接口变更】 > 请确认是否涉及跨代码仓或者客户面可见的接口变更。如涉及,需要详细说明接口以及对应的变更内容,同时需要在资料中体现。如不涉及,需填写“不涉及” 不涉及 # 【功能验证】 > 说明测试场景,测试方法。如果本次测试方式与常规单元测试不同,请详细说明您的测试步骤\ > 新增/变更内容是否已新增/适配UT测试用例看护,并补充测试自验证截图 # 【CheckList】 > PR提交人对以下CheckList自检项进行全量自检,自检通过或不涉及,均修改 [ ] 为 [x] - [x] 代码注释完备,正确记录错误日志 - [x] 代码实现进行了返回值、空指针等校验 - [x] PR标题正确使用类型标签,如:feat、fix、refactor、docs、test等 - [x] PR持续集成流水线(CI)执行通过,代码检查无异常 See merge request: Ascend/pytorch!40262 | 2 个月前 | |
[test]profiler fix uttest Co-authored-by: hehongzhe<935062458@qq.com> # message auto-generated for no-merge-commit merge: !38683 merge tem into master [test]profiler fix uttest Created-by: hhz0 Commit-by: hehongzhe Merged-by: ascend-robot Description: <!-- PR描述模板更新日期:20260203 --> # 【合入来源】 > <font color="red">**如有社区issue,请关联issue链接**</font>\ > <font color="red">**请勿携带内部流程信息(需求链接、问题单、内部issue等)**</font> - [ ] 需求 - [ ] 问题单 - [x] issue/工单 https://gitcode.com/Ascend/pytorch/issues/2347 - [ ] 重构优化 - [ ] 资料更新 # 【修改方案】 > 请描述修改内容的具体实现,涉及哪些组件之间进行交互,可以用1、2、3、...进行罗列\ > 如果是需求或者重构类的PR,需要补充详细设计文档(说明上下游组件关系、时序图、类图、DFX能力等内容) 之前删除函数没有删除对应ut测试用例,补充删除 # 【资料变更】 > 请确认是否涉及资料变更。如涉及,需要在PR中体现,并简要说明修改内容。如不涉及,需填写“不涉及” 不涉及 # 【接口变更】 > 请确认是否涉及跨代码仓或者客户面可见的接口变更。如涉及,需要详细说明接口以及对应的变更内容,同时需要在资料中体现。如不涉及,需填写“不涉及” 不涉及 # 【功能验证】 > 说明测试场景,测试方法。如果本次测试方式与常规单元测试不同,请详细说明您的测试步骤\ > 新增/变更内容是否已新增/适配UT测试用例看护,并补充测试自验证截图  # 【CheckList】 > PR提交人对以下CheckList自检项进行全量自检,自检通过或不涉及,均修改 [ ] 为 [x] - [x] 代码注释完备,正确记录错误日志 - [x] 代码实现进行了返回值、空指针等校验 - [x] PR标题正确使用类型标签,如:feat、fix、refactor、docs、test等 - [x] PR持续集成流水线(CI)执行通过,代码检查无异常 See merge request: Ascend/pytorch!38683 | 3 个月前 | |
[test]profiler fix uttest Co-authored-by: hehongzhe<935062458@qq.com> # message auto-generated for no-merge-commit merge: !38683 merge tem into master [test]profiler fix uttest Created-by: hhz0 Commit-by: hehongzhe Merged-by: ascend-robot Description: <!-- PR描述模板更新日期:20260203 --> # 【合入来源】 > <font color="red">**如有社区issue,请关联issue链接**</font>\ > <font color="red">**请勿携带内部流程信息(需求链接、问题单、内部issue等)**</font> - [ ] 需求 - [ ] 问题单 - [x] issue/工单 https://gitcode.com/Ascend/pytorch/issues/2347 - [ ] 重构优化 - [ ] 资料更新 # 【修改方案】 > 请描述修改内容的具体实现,涉及哪些组件之间进行交互,可以用1、2、3、...进行罗列\ > 如果是需求或者重构类的PR,需要补充详细设计文档(说明上下游组件关系、时序图、类图、DFX能力等内容) 之前删除函数没有删除对应ut测试用例,补充删除 # 【资料变更】 > 请确认是否涉及资料变更。如涉及,需要在PR中体现,并简要说明修改内容。如不涉及,需填写“不涉及” 不涉及 # 【接口变更】 > 请确认是否涉及跨代码仓或者客户面可见的接口变更。如涉及,需要详细说明接口以及对应的变更内容,同时需要在资料中体现。如不涉及,需填写“不涉及” 不涉及 # 【功能验证】 > 说明测试场景,测试方法。如果本次测试方式与常规单元测试不同,请详细说明您的测试步骤\ > 新增/变更内容是否已新增/适配UT测试用例看护,并补充测试自验证截图  # 【CheckList】 > PR提交人对以下CheckList自检项进行全量自检,自检通过或不涉及,均修改 [ ] 为 [x] - [x] 代码注释完备,正确记录错误日志 - [x] 代码实现进行了返回值、空指针等校验 - [x] PR标题正确使用类型标签,如:feat、fix、refactor、docs、test等 - [x] PR持续集成流水线(CI)执行通过,代码检查无异常 See merge request: Ascend/pytorch!38683 | 3 个月前 | |
refactor(profiler): 非侵入式动态 Profiler Optimizer Step Hook 私有 Patch 消除 Co-authored-by: wxb<w.noneck.1024@gmail.com> # message auto-generated for no-merge-commit merge: !44890 merge refactor/remove-pta_profiler_hook into master refactor(profiler): 非侵入式动态 Profiler Optimizer Step Hook 私有 Patch 消除 Created-by: No_neck Commit-by: No_neck;wxb Merged-by: ascend-robot Description: <!-- PR 描述与 2026-08-28 最新代码对齐。 --> # 【合入来源】 > <font color="red">**https://gitcode.com/Ascend/pytorch/issues/4189**</font> - [ ] 需求 - [ ] 问题单 - [x] issue/工单 - [x] 重构优化 - [ ] 资料更新 # 【修改说明】 ## 背景 torch_npu/profiler/_non_intrusive_profile.py 原实现通过替换 PyTorch 私有方法 torch.optim.Optimizer._patch_step_function 或历史版本的 _hook_for_profile,进一步包装 optimizer.__class__.step,在 Optimizer step 正常返回后调用动态 Profiler 的 dp_step()。 旧实现还使用 OPTIMIZER_ID 只跟踪最后创建或最后 patch 的 Optimizer。该选择规则 没有训练 iteration 语义:如果最后创建的是低频辅助 Optimizer,Profiler 会推进过慢, 使一个采集 step 跨越多次主 Optimizer 更新。 主要问题: 1. 依赖 PT 私有 API,升级兼容风险高; 2. PTA 在 PT wrapper 外再次修改 Optimizer 类方法,影响同类全部实例; 3. step_hooked、OPTIMIZER_ID 和构造顺序形成脆弱的隐式状态; 4. 非等频多 Optimizer 场景会少计,采集边界异常扩大; 5. 旧接入方式没有使用 PT 已提供的公共 Optimizer hook。 ## 修改方案 本 PR 保留 PTA 非侵入式动态 Profiling 能力和原有启动方式,只替换 Optimizer 事件接入 机制: ~~~text PROF_CONFIG_PATH / MSMONITOR_USE_DAEMON / KINETO_USE_DAEMON -> 原有配置检查 -> dp_init(prof_config_path) -> _register_optimizer_step_hook() -> register_optimizer_step_post_hook(callback) optimizer.step() 正常返回 -> PT instance post-hooks -> PT global post-hooks -> PTA _optimizer_step_post_hook(optimizer, args, kwargs) -> local_step[optimizer] += 1 -> local_step > profiler_step 时调用 dp_step() -> profiler_step = local_step ~~~ 聚合语义为: ~~~text profiler_step = max historical successful_step_count observed ~~~ 一次 callback 只增加一个 Optimizer 的局部计数,因此直接比较更新后的局部值与缓存的 历史全局最大值即可,不需要每次执行 max(values()),热路径为 O(1)。弱字典删除已经 释放的 Optimizer 后,缓存的历史全局值不会回退。 ## 代码修改及原因 ### 1. 删除 PT 私有方法依赖 删除: ~~~python _origin_patch_step_function Optimizer._patch_step_function = ... Optimizer._hook_for_profile = ... ~~~ 原因:上述符号是 PT 私有实现,不提供兼容承诺。当前2.13、2.14、2.15目标版本已经 提供公共 global Optimizer post-hook。 ### 2. 删除 PTA 类级 step wrapper 删除: ~~~text step_wrapper patch_step_function step_hooked check_last_optimizer OPTIMIZER_ID ~~~ 原因: - 不再二次替换 optimizer.__class__.step; - 不影响同类 Optimizer 的其他实例; - 不再依赖 Optimizer 创建顺序; - 不再需要维护重复包装标志; - 消除旧非等频场景只跟踪最后一个 Optimizer的问题。 ### 3. 使用 PT 公共 global post-hook 新增: ~~~python from torch.optim.optimizer import Optimizer, register_optimizer_step_post_hook ~~~ 并通过: ~~~python register_optimizer_step_post_hook(cls._optimizer_step_post_hook) ~~~ 注册回调。 选择 global hook 的原因: - 非侵入式 Profiler 不要求用户逐个修改 Optimizer; - 能覆盖注册前和注册后创建的 Optimizer; - PT 负责 Optimizer step 的 hook 分发; - PTA 不再接管 PT 私有构造/反序列化入口。 选择 post-hook 而不是 pre-hook 的原因: - 与旧实现“原始 step 成功后再调用 dp_step()”的顺序一致; - optimizer.step() 抛异常时 PT 不执行 post-hook; - 不会把失败的参数更新计为有效 Profiler step; - PT instance post-hook 仍先于 PTA global post-hook。 ### 4. 在已有类中保存最小聚合状态 新增: ~~~python _optimizer_step_hook_handle = None _optimizer_steps = WeakKeyDictionary() _profiler_step = 0 ~~~ 各字段作用: | 字段 | 作用 | |---|---| | _optimizer_step_hook_handle | 判断是否已注册,防止重复 callback | | _optimizer_steps | 保存每个 Optimizer 的成功 step 次数 | | _profiler_step | 保存已经推进的最大 step | 没有新增独立 tracker 类,避免引入当前生产调用链不需要的 requester API、reset API 和 额外生命周期。 WeakKeyDictionary 不强引用 Optimizer。Optimizer 被释放后,对应记录可自动删除, 避免普通 dict 延长参数和 Optimizer 状态的生命周期。 ### 5. 新增 O(1) post-hook callback ~~~python @classmethod def _optimizer_step_post_hook( cls, optimizer: Optimizer, _args: tuple, _kwargs: dict, ) -> None: step = cls._optimizer_steps.get(optimizer, 0) + 1 cls._optimizer_steps[optimizer] = step if step > cls._profiler_step: dp_step() cls._profiler_step = step ~~~ 逐行说明: - get(optimizer, 0) + 1:为触发 callback 的 Optimizer 增加局部成功 step; - 写回弱字典:保存该 Optimizer 的后续计数起点; - step > _profiler_step:判断是否出现新的最大进度; - dp_step():只在全局进度增加时推进动态 Profiler; - 成功后更新 _profiler_step:不把失败的 dp_step() 标记为已推进。 callback 必须接受 optimizer, args, kwargs,这是 PT 公共 API 契约。不能直接注册 dp_step,因为 dp_step() 不接受该签名,也无法识别和聚合多个 Optimizer。 ### 6. 新增幂等注册 ~~~python @classmethod def _register_optimizer_step_hook(cls) -> None: if cls._optimizer_step_hook_handle is not None: return cls._optimizer_steps.clear() cls._profiler_step = 0 cls._optimizer_step_hook_handle = register_optimizer_step_post_hook( cls._optimizer_step_post_hook ) ~~~ 逐行说明: - handle 非空时返回:重复 init() 不重复注册; - 注册前清空弱字典:新注册生命周期不继承旧对象状态; - 全局 step 置0:与新初始化的动态 Profiler 对齐; - 保存 PT 返回的 handle:作为注册状态,并保留底层 removable 能力。 最新生产代码不增加 unregister 方法。动态 Profiling 一旦启用,hook 在进程内持续 存在;测试直接使用 handle 清理,不为测试增加生产 API。 ### 7. 保留原有启动条件 没有新增环境变量或配置文件字段。继续使用: ~~~text PROF_CONFIG_PATH MSMONITOR_USE_DAEMON KINETO_USE_DAEMON ~~~ 未启用动态 Profiling 时,init() 在 dp_init() 和 hook 注册前返回,因此默认训练 没有新增 callback 或 WeakKeyDictionary 热路径。 启用后先调用: ~~~python dp_init(prof_config_path) ~~~ 再注册 hook,避免 callback 在动态 Profiler 尚未初始化时调用 dp_step()。 本 PR 不增加 TORCH_NPU_PROFILER_STEP_MODE,不增加 optimizer/manual 分支,不修改 配置 schema。 ### 8. 删除 Python 3.8 Dynolog 死分支 最新代码删除 import sys 以及 Dynolog 的 Python <3.8 判断,直接在 daemon 模式设置 DYNO_CONFIG。 当前2.13~2.15目标兼容线支持的 Python 均高于3.8,该判断在受支持环境中不可达。此项 是独立死代码清理,同时避免原提示行的 F541 风险;不改变支持范围内行为。 # 【行为变化】 ## 正常场景 | 场景 | Optimizer event | 修改前典型 dp_step() | 修改后 dp_step() | |---|---:|---:|---:| | 单 Optimizer,18轮 | 18 | 18 | 18 | | 同步双 Optimizer,各18次 | 36 | 取决于最后 ID,通常18 | 18 | | 主18次、低频辅助6次且辅助最后创建 | 24 | 6 | 18 | ## 已知边界 per-optimizer max 是有约束的进度聚合,不是通用 training iteration 检测器: | 场景 | Optimizer event | 修改后 dp_step() | 说明 | |---|---:|---:|---| | 完全交替9+9 | 18 | 9 | 两个局部计数的最大值为9 | | 运行中替换9+9 | 18 | 9 | 新 Optimizer 从0开始追赶 | | 同一 Optimizer 每轮 step 两次 | 2次/轮 | 2次/轮 | 按 Optimizer event 而不是 iteration | 当前 PR 不引入 manual 模式或训练循环 callback。上述行为作为已知限制写入 RFC 和测试 结论,不宣称支持任意训练拓扑。 梯度累计按真实 optimizer.step() 计数:多次 backward 后只调用一次 optimizer.step(),只推进一次;grad 全为 None 但 step 正常返回时,仍按一个 Optimizer event 计数。 # 【接口与资料变更】 ## Python API 不新增或修改用户可见 Python API。 ## 环境变量和配置文件 不新增环境变量,不修改动态 Profiler 配置文件 schema。 保留原有: - PROF_CONFIG_PATH; - MSMONITOR_USE_DAEMON; - 兼容的 KINETO_USE_DAEMON。 ## 兼容性 不再为缺少公共 global post-hook 的历史 PT 版本回退到私有 API。公共 hook 契约已经在 PT/PTA 2.13、2.14、2.15真实 NPU 环境验证。 PT main 仅用于核对公共机制的当前实现;PT main 比 PTA 目标兼容线更新,兼容结论以 三版本真实环境为准。 ## 资料 已同步更新 RFC,明确: - 私有 patch 到公共 hook 的迁移; - 原有环境变量保持不变; - O(1) per-optimizer max 公式; - 多 Optimizer 正常语义与交替/替换边界; - Trace 范围不等于训练吞吐; - 最新精简实现没有独立 tracker 类、step mode 和生产 unregister。 # 【功能验证】 ## 1. 单元与契约测试 当前测试覆盖15项: 1. 重复注册幂等; 2. 异类同步双 Optimizer; 3. 同类同步双 Optimizer; 4. 非等频主辅 Optimizer; 5. 单 Optimizer 连续 step; 6. 注册前创建的 Optimizer; 7. 注册后创建的 Optimizer; 8. 无 grad 正常 step; 9. 梯度累计; 10. step 抛异常时不推进; 11. instance post-hook 先于 global post-hook; 12. disabled 时不初始化、不注册; 13. MSMonitor 入口; 14. KINETO 兼容入口与弃用提示; 15. 配置路径校验、初始化和注册。 测试清理直接移除 handle 并清空类状态,没有新增仅供测试使用的生产方法。 ## 2. Ascend 910B2 三版本验证 | 兼容线 | PyTorch | TorchNPU | 公共 hook 契约 | 真实 active Trace | |---|---|---|---|---| | 2.13 | 2.13.0a0+gitfad7424 | 2.13.0+git45fbeae | 通过 | 通过 | | 2.14 | 2.14.0a0+git69231fe | 2.14.0+gitee7bc39 | 通过 | 通过 | | 2.15 | 2.15.0.dev20260812 | 2.15.0+git56986bb | 通过 | 通过 | 场景结果: | 场景 | Optimizer 更新 | dp_step() | iteration 对齐 | |---|---:|---:|---| | single | 18 | 18 | 是 | | sync dual | 36 | 18 | 是 | | uneven 18+6 | 24 | 18 | 是 | | alternating 9+9 | 18 | 9 | 否,已知边界 | | replacement 9+9 | 18 | 9 | 否,已知边界 | 每个场景均生成非空 trace_view.json。 有效 run-id: - compact_active_2_13_20260827_r2; - compact_active_2_14_20260827_r1; - compact_active_2_15_20260827_r1。 2.13首轮与2.15并发使用 host IPC 和相同 rank=-1,发生动态 Profiler 共享状态冲突; 串行重跑通过。该首轮结果不作为代码失败。 NPU 矩阵候选源码 SHA256: ~~~text b0e0387e2ae80b729e3d12e46ed6e3ac78a1345fc694e3853bfed81ff855b076 ~~~ 该快照与最新目标代码的 Optimizer hook 热路径一致,但仍保留受支持环境不可达的 Python 3.8判断。删除该死分支后需要至少补跑最终源码的 lint 和 UT;若合入门槛要求 最终 SHA 的 NPU 可追溯性,再补一轮 smoke run。 ## 3. 性能验证 默认未启用动态 Profiling 时不注册 hook,因此没有新增 callback 开销。 2.15 master 配对完整训练结果: | 场景 | 旧 OPTIMIZER_ID | 修改后 O(1) max | 差值 | |---|---:|---:|---:| | 单 Optimizer,counter-only | 0.640% | 1.007% | +0.367个百分点 | | 同步双 Optimizer,counter-only | 0.732% | 0.833% | +0.101个百分点 | | 单 Optimizer,真实 inactive dp_step() | 9.238% | 9.291% | +0.053个百分点 | | 同步双 Optimizer,真实 inactive dp_step() | 5.159% | 5.127% | -0.032个百分点 | 结论: - tracker-only 完整训练开销约1%; - 加入真实空闲态 dp_step() 后修改前后差异很小; - 旧实现非等频场景调用更少来自少计,不构成有效性能优势; - Trace 中 Operator、Kernel 或时间窗口变化表示采集范围变化,不直接表示吞吐变化; - 删除 Python 3.8死分支后的最终 SHA 尚未重跑完整性能矩阵。 # 【风险说明】 1. 当前算法不支持从任意 Optimizer 序列恢复真实 training iteration; 2. 完全交替、动态替换和同一 Optimizer 一轮多次 step 是明确边界; 3. 当前状态无锁,不声明支持多线程并发 optimizer.step(); 4. 生产代码不提供 hook 注销/重装生命周期; 5. 外部若自行移除保存的 handle,类字段仍非空,不能自动重新注册; 6. 极短 Optimizer step 会放大 WeakKeyDictionary 的相对开销; 7. PT main 的实现细节不能代替目标兼容线验证。 # 【CheckList】 ## 代码 - [x] 删除 PTA 对 _patch_step_function 的赋值 - [x] 删除 PTA 对 _hook_for_profile 的赋值 - [x] 删除类级 optimizer.__class__.step 包装 - [x] 删除 step_wrapper、step_hooked 和 OPTIMIZER_ID - [x] 使用公共 register_optimizer_step_post_hook() - [x] 使用 WeakKeyDictionary,不强引用 Optimizer - [x] max 聚合热路径为 O(1) - [x] 注册幂等 - [x] disabled 时不注册 hook - [x] 不新增用户环境变量或配置 schema - [x] 不新增独立 tracker 类 - [x] 不新增仅供测试的生产接口 - [x] 删除 Python 3.8 Dynolog 死分支 ## 验证 - [x] 单 Optimizer - [x] 同类和异类同步双 Optimizer - [x] 非等频主辅 Optimizer - [x] 注册前/后创建 Optimizer - [x] 梯度累计和无 grad step - [x] step 异常不推进 - [x] instance/global hook 顺序 - [x] 三个原有启用入口 - [x] PT/PTA 2.13、2.14、2.15真实 NPU active Trace - [x] 交替与替换边界已验证并记录 - [x] O(1) 热路径性能已有配对数据 - [ ] 删除 Python 3.8死分支后的最终源码 lint/UT - [ ] 若合入要求最终 SHA 性能门槛,补跑最终源码配对性能 # 【结论】 本 PR 保留 PTA 非侵入式动态 Profiling 功能,消除 PTA 对 PT 私有 Optimizer 方法和 类级 step() 的 monkey-patch。 修改后只在原有环境变量真正启用动态 Profiling 时注册 PT 公共 global post-hook; 通过已有 _NonIntrusiveProfile 中的最小弱引用状态,以 O(1) per-optimizer max 语义推进 dp_step()。默认训练不增加 callback,同步多 Optimizer和非等频主辅场景 不再依赖最后创建的 Optimizer。 方案不新增用户配置,也不声称解决任意训练循环 iteration 识别。交替、动态替换和同一 Optimizer 多次更新作为明确边界保留。 See merge request: Ascend/pytorch!44890 | 28 天前 | |
[Fix] Fix static check errors detected by SPACES Co-authored-by: huangjingwei<huangjingwei4@huawei.com> # message auto-generated for no-merge-commit merge: !35981 merge master_lintrunner into master [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!35981 | 4 个月前 | |
| 2 年前 | ||
[Fix] Fix static check errors detected by SPACES Co-authored-by: huangjingwei<huangjingwei4@huawei.com> # message auto-generated for no-merge-commit merge: !35981 merge master_lintrunner into master [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!35981 | 4 个月前 | |
【pytorch_master】 add dynamic step Co-authored-by: hewenbo<hewenbo16@h-partners.com> # message auto-generated for no-merge-commit merge: !37318 merge master into master 【pytorch_master】 add dynamic step Created-by: hewenbo Commit-by: hewenbo Merged-by: ascend-robot Description: <!-- PR描述模板更新日期:20260203 --> # 【合入来源】 > <font color="red">**如有社区issue,请关联issue链接**</font>\ > <font color="red">**请勿携带内部流程信息(需求链接、问题单、内部issue等)**</font> - [x] 需求 - [ ] 问题单 - [x] issue/工单 https://gitcode.com/Ascend/pytorch/issues/2209 - [ ] 重构优化 - [ ] 资料更新 # 【修改方案】 > 请描述修改内容的具体实现,涉及哪些组件之间进行交互,可以用1、2、3、...进行罗列\ > 如果是需求或者重构类的PR,需要补充详细设计文档(说明上下游组件关系、时序图、类图、DFX能力等内容) 在_DynamicProfile类中增加set_state方法用于保存成员属性的值,用于重新拉起的新节点读取故障前的step值 # 【资料变更】 > 请确认是否涉及资料变更。如涉及,需要在PR中体现,并简要说明修改内容。如不涉及,需填写“不涉及” 资料中新增set_state接口 # 【接口变更】 在_DynamicProfile类中增加set_state方法用于保存成员属性的值,用于重新拉起的新节点读取故障前的step值 # 【功能验证】 > 说明测试场景,测试方法。如果本次测试方式与常规单元测试不同,请详细说明您的测试步骤\ > 新增/变更内容是否已新增/适配UT测试用例看护,并补充测试自验证截图 修改前:   修改后:   # 【CheckList】 > PR提交人对以下CheckList自检项进行全量自检,自检通过或不涉及,均修改 [ ] 为 [x] - [x] 代码注释完备,正确记录错误日志 - [x] 代码实现进行了返回值、空指针等校验 - [x] PR标题正确使用类型标签,如:feat、fix、refactor、docs、test等 - [x] PR持续集成流水线(CI)执行通过,代码检查无异常 See merge request: Ascend/pytorch!37318 | 3 个月前 | |
bugfix for profiler FLOPs Co-authored-by: fanglanyue<lanyuefang0916@163.com> # message auto-generated for no-merge-commit merge: !39974 merge mfu_bugfix into master bugfix for profiler FLOPs Created-by: fanglanyue0916 Commit-by: fanglanyue Merged-by: ascend-robot Description: <!-- PR描述模板更新日期:20260203 --> # 【合入来源】 > <font color="red">**如有社区issue,请关联issue链接**</font>\ > <font color="red">**请勿携带内部流程信息(需求链接、问题单、内部issue等)**</font> - [ ] 需求 - [ ] 问题单 - [x] issue/工单: https://gitcode.com/Ascend/pytorch/issues/2608 - [ ] 重构优化 - [ ] 资料更新 # 【修改方案】 > 请描述修改内容的具体实现,涉及哪些组件之间进行交互,可以用1、2、3、...进行罗列\ > 如果是需求或者重构类的PR,需要补充详细设计文档(说明上下游组件关系、时序图、类图、DFX能力等内容) 在 torch_npu/profiler/_flops_formulas.py 中,恢复了 TND 布局下 actual_seq_qlen 与 actual_seq_kvlen 解析结果的条目数一致性校验,同时保留对单条 q_len / kv_len 不等长的支持,覆盖 cross-attention、KV cache 等合法场景,同时避免 batch 维不匹配时被 zip 静默截断,确保非法输入及时报错。 同文件中,为 npu_fusion_attention_flops 增加了 _infer_kv_heads 逻辑,在非 TND 布局下基于 key 的实际 shape 推导 kv_heads,并将其传入通用 FLOPs 计算流程,从而处理 GQA/MQA 等 q heads 与 kv heads 不一致的 attention 场景,修正此前默认复用 head_num 带来的 FLOPs 统计误差。 在 torch_npu/profiler/experimental_config.py 中新增 tx_enabled 属性,内部语义为 self._msprof_tx or self._mstx。在 torch_npu/profiler/profiler_interface.py 中,将 FLOPs hook 的安装和卸载条件切换为使用 experimental_config.tx_enabled,兼容新的 mstx 配置和旧的 msprof_tx 配置。 # 【资料变更】 > 请确认是否涉及资料变更。如涉及,需要在PR中体现,并简要说明修改内容。如不涉及,需填写“不涉及” 不涉及 # 【接口变更】 > 请确认是否涉及跨代码仓或者客户面可见的接口变更。如涉及,需要详细说明接口以及对应的变更内容,同时需要在资料中体现。如不涉及,需填写“不涉及” 不涉及 # 【功能验证】 > 说明测试场景,测试方法。如果本次测试方式与常规单元测试不同,请详细说明您的测试步骤\ > 新增/变更内容是否已新增/适配UT测试用例看护,并补充测试自验证截图 在mindspeed-llm框架中采集profiling数据,并用msprof-analyze -m operator_mfu 计算算子mfu  # 【CheckList】 > PR提交人对以下CheckList自检项进行全量自检,自检通过或不涉及,均修改 [ ] 为 [x] - [ ] 代码注释完备,正确记录错误日志 - [ ] 代码实现进行了返回值、空指针等校验 - [ ] PR标题正确使用类型标签,如:feat、fix、refactor、docs、test等 - [ ] PR持续集成流水线(CI)执行通过,代码检查无异常 See merge request: Ascend/pytorch!39974 | 2 个月前 | |
Add support of Execution Trace Observer object to torch_npu profiler (based on acl_prof). Co-authored-by: ilya_a<abanin.ilya@huawei.com> # message auto-generated for no-merge-commit merge: !43983 merge add_execution_trace_observer_support into master Add support of Execution Trace Observer object to torch_npu profiler (based on acl_prof). Created-by: ilya_a Commit-by: ilya_a Merged-by: ascend-robot Description: <!-- PR描述模板更新日期:20260203 --> # 【合入来源】 > <font color="red">**如有社区issue,请关联issue链接**</font>\ > <font color="red">**请勿携带内部流程信息(需求链接、问题单、内部issue等)**</font> - [x] 需求 - [ ] 问题单 - [ ] issue/工单 - [ ] 重构优化 - [ ] 资料更新 # 【修改方案】 Re-used existing PyTorch Execution Trace Observer object with torch_npu profiler (based on acl_prof). Migrated relevant unit tests from original PyTorch test_execution_trace.py # 【资料变更】 New parameter is added to npu_profiler - execution_trace_observer. Execution Trace Observer implementation with torch_npu profiler must work the same way as with PyTorch community profiler. # 【接口变更】 New parameter is added to npu_profiler - execution_trace_observer. execution_trace_observer (ExecutionTraceObserver) : A PyTorch Execution Trace Observer object. PyTorch Execution Traces <https://arxiv.org/pdf/2305.14516.pdf>__ offer a graph based representation of AI/ML workloads and enable replay benchmarks, simulators, and emulators. When this argument is included the observer start() and stop() will be called for the same time window as npu_profiler. It is the same Execution Trace Observer as the one used by PyTorch community profiler. # 【功能验证】 Build, install, run: export MAX_JOBS=2 TORCH_DEVICE_BACKEND_AUTOLOAD=0 bash ci/build.sh --python=3.11 pip install --no-deps --force-reinstall dist/torch_npu-*.whl ASCEND_LAUNCH_BLOCKING=1 pytest -s test_npu_execution_trace.py # Test results  # 【CheckList】 > PR提交人对以下CheckList自检项进行全量自检,自检通过或不涉及,均修改 [ ] 为 [x] - [x] 代码注释完备,正确记录错误日志 - [x] 代码实现进行了返回值、空指针等校验 - [x] PR标题正确使用类型标签,如:feat、fix、refactor、docs、test等 - [x] PR持续集成流水线(CI)执行通过,代码检查无异常 See merge request: Ascend/pytorch!43983 | 1 个月前 | |
bugfix for profiler FLOPs Co-authored-by: fanglanyue<lanyuefang0916@163.com> # message auto-generated for no-merge-commit merge: !39974 merge mfu_bugfix into master bugfix for profiler FLOPs Created-by: fanglanyue0916 Commit-by: fanglanyue Merged-by: ascend-robot Description: <!-- PR描述模板更新日期:20260203 --> # 【合入来源】 > <font color="red">**如有社区issue,请关联issue链接**</font>\ > <font color="red">**请勿携带内部流程信息(需求链接、问题单、内部issue等)**</font> - [ ] 需求 - [ ] 问题单 - [x] issue/工单: https://gitcode.com/Ascend/pytorch/issues/2608 - [ ] 重构优化 - [ ] 资料更新 # 【修改方案】 > 请描述修改内容的具体实现,涉及哪些组件之间进行交互,可以用1、2、3、...进行罗列\ > 如果是需求或者重构类的PR,需要补充详细设计文档(说明上下游组件关系、时序图、类图、DFX能力等内容) 在 torch_npu/profiler/_flops_formulas.py 中,恢复了 TND 布局下 actual_seq_qlen 与 actual_seq_kvlen 解析结果的条目数一致性校验,同时保留对单条 q_len / kv_len 不等长的支持,覆盖 cross-attention、KV cache 等合法场景,同时避免 batch 维不匹配时被 zip 静默截断,确保非法输入及时报错。 同文件中,为 npu_fusion_attention_flops 增加了 _infer_kv_heads 逻辑,在非 TND 布局下基于 key 的实际 shape 推导 kv_heads,并将其传入通用 FLOPs 计算流程,从而处理 GQA/MQA 等 q heads 与 kv heads 不一致的 attention 场景,修正此前默认复用 head_num 带来的 FLOPs 统计误差。 在 torch_npu/profiler/experimental_config.py 中新增 tx_enabled 属性,内部语义为 self._msprof_tx or self._mstx。在 torch_npu/profiler/profiler_interface.py 中,将 FLOPs hook 的安装和卸载条件切换为使用 experimental_config.tx_enabled,兼容新的 mstx 配置和旧的 msprof_tx 配置。 # 【资料变更】 > 请确认是否涉及资料变更。如涉及,需要在PR中体现,并简要说明修改内容。如不涉及,需填写“不涉及” 不涉及 # 【接口变更】 > 请确认是否涉及跨代码仓或者客户面可见的接口变更。如涉及,需要详细说明接口以及对应的变更内容,同时需要在资料中体现。如不涉及,需填写“不涉及” 不涉及 # 【功能验证】 > 说明测试场景,测试方法。如果本次测试方式与常规单元测试不同,请详细说明您的测试步骤\ > 新增/变更内容是否已新增/适配UT测试用例看护,并补充测试自验证截图 在mindspeed-llm框架中采集profiling数据,并用msprof-analyze -m operator_mfu 计算算子mfu  # 【CheckList】 > PR提交人对以下CheckList自检项进行全量自检,自检通过或不涉及,均修改 [ ] 为 [x] - [ ] 代码注释完备,正确记录错误日志 - [ ] 代码实现进行了返回值、空指针等校验 - [ ] PR标题正确使用类型标签,如:feat、fix、refactor、docs、test等 - [ ] PR持续集成流水线(CI)执行通过,代码检查无异常 See merge request: Ascend/pytorch!39974 | 2 个月前 | |
对齐Pytorch Profiler部分接口 Co-authored-by: xfeng<zchlcw663@163.com> # message auto-generated for no-merge-commit merge: !34296 merge main into master 对齐Pytorch Profiler部分接口 Created-by: zyb_230 Commit-by: xfeng Merged-by: ascend-robot Description: <!-- PR描述模板更新日期:20260203 --> # 【合入来源】 > <font color="red">**如有社区issue,请关联issue链接**</font>\ > <font color="red">**请勿携带内部流程信息(需求链接、问题单、内部issue等)**</font> - [x] 需求 - [ ] 问题单 - [x] issue/工单 https://gitcode.com/Ascend/pytorch/issues/1802 - [ ] 重构优化 - [ ] 资料更新 # 【修改方案】 对齐pytorch profiler的部分接口: 一个是增加一个 skip_first_wait:  一个是custom_trace_id_callback,然后增加两个对应的set和get的接口set_custom_trace_id_callback和get_trace_id   # 【资料变更】 > 请确认是否涉及资料变更。如涉及,需要在PR中体现,并简要说明修改内容。如不涉及,需填写“不涉及” **涉及,需要和资料沟通** # 【接口变更】 > 请确认是否涉及跨代码仓或者客户面可见的接口变更。如涉及,需要详细说明接口以及对应的变更内容,同时需要在资料中体现。如不涉及,需填写“不涉及” 涉及,前面已经说明 # 【功能验证】 **场景1** 设置schedule = torch_npu.profiler.schedule(wait=2, warmup=1, active=1, repeat=2, skip_first=0, skip_first_wait=1) 之前:采集第3和第7个step  现在:采集第1和第5个step  **场景2** 测试get_trace_id接口: …… with torch_npu.profiler.profile( activities=[ torch_npu.profiler.ProfilerActivity.NPU, torch_npu.profiler.ProfilerActivity.CPU, ], with_stack=True, schedule = torch_npu.profiler.schedule(wait=2, warmup=1, active=2, repeat=2, skip_first=1, skip_first_wait=1), on_trace_ready=torch_npu.profiler.tensorboard_trace_handler("./result_profiling"), experimental_config=experimental_config) as prof: for i in range(12): add(x0, x1) prof.step() print(f"step {i}: {prof.get_trace_id()}") ……  默认是一个uuid,是直接从pytorch里面拷贝过来的,现在会在profiler_metadata.json里面落盘,db里面也有    **场景3** 异常的skip_first_wait参数不生效,reset为0 正常: 异常:必须设置为整数,否则有警告信息,reset为0   **场景4:** 设置custom_trace_id_callback,这个trace_id,我们是想和每一份ascend_pt数据或者repeat参数绑定的, class RepeatTraceIdGenerator: def __init__(self): self.repeat_count = 0 # 从 0 开始 def __call__(self) -> str: # 每一轮 profile 启动,计数 +1 current_id = str(self.repeat_count) self.repeat_count += 1 return current_id trace_id_gen = RepeatTraceIdGenerator() …… with torch_npu.profiler.profile( activities=[ torch_npu.profiler.ProfilerActivity.NPU, torch_npu.profiler.ProfilerActivity.CPU, ], with_stack=True, schedule = torch_npu.profiler.schedule(wait=2, warmup=1, active=2, repeat=2, skip_first=1, skip_first_wait=1), on_trace_ready=torch_npu.profiler.tensorboard_trace_handler("./result_profiling"), experimental_config=experimental_config, custom_trace_id_callback=trace_id_gen) as prof: for i in range(12): add(x0, x1) prof.step() print(f"step {i}: {prof.get_trace_id()}")  如果call_back类型不对,会有警告信息,然后使用默认的uuid  # 【CheckList】 > PR提交人对以下CheckList自检项进行全量自检,自检通过或不涉及,均修改 [ ] 为 [x] - [ ] 代码注释完备,正确记录错误日志 - [ ] 代码实现进行了返回值、空指针等校验 - [ ] PR标题正确使用类型标签,如:feat、fix、refactor、docs、test等 - [ ] PR持续集成流水线(CI)执行通过,代码检查无异常 See merge request: Ascend/pytorch!34296 | 4 个月前 |
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 3 个月前 | ||
| 1 个月前 | ||
| 4 个月前 | ||
| 1 个月前 | ||
| 1 年前 | ||
| 2 个月前 | ||
| 3 个月前 | ||
| 3 个月前 | ||
| 28 天前 | ||
| 4 个月前 | ||
| 2 年前 | ||
| 4 个月前 | ||
| 3 个月前 | ||
| 2 个月前 | ||
| 1 个月前 | ||
| 2 个月前 | ||
| 4 个月前 |