

Pull Request已成功合入, 合并人@ascend-robot
(感谢 王超 的贡献)Thanks for your pull-request.
The full list of commands accepted by me can be found at here。
You can get sig-info at here
PR Approval Progress
✅ Congratulations! All modules have met the lgtm and approve requirements.
Module Approval Details
| module | lgtm status | approve status |
|---|---|---|
| repo-Ascend/pytorch | ✅ liwei386, zqwenn (2/2) | ✅ liwei386, zqwenn (2/1) |
| test | ✅ liwei386, zqwenn (2/2) | ✅ liwei386, zqwenn (2/1) |
| torch_npu/_inductor | ✅ liwei386, zqwenn (2/2) | ✅ liwei386, zqwenn (2/1) |
| torch_npu/distributed | ✅ liwei386, zqwenn (2/2) | ✅ zqwenn, liwei386 (2/1) |
| torch_npu/npu | ✅ liwei386, zqwenn (2/2) | ✅ liwei386, zqwenn (2/1) |
| torch_npu/utils | ✅ liwei386, zqwenn (2/2) | ✅ liwei386, zqwenn (2/1) |
💡 Tip:
- Committer can comment
/approveor/lgtm- Commenting
/approveimplies both code review (lgtm) and intent to merge (approve)


代码逻辑和结构: 在_npugraph_trees.disable_cpu_input_check属性的setter方法中,逻辑存在矛盾。注释说明当disable_cpu_input_check为True时,应将slow_path_cudagraph_asserts设置为True以跳过CPU检查。但实际代码中,当value为True时,却将其设置为False。这会导致实际行为与注释描述相反,可能引发预期外的行为或错误。
问题类型: 代码逻辑和结构
文件路径: torch_npu/_inductor/config.py
行号: 66
问题代码:
# When disable_cpu_input_check is True, set slow_path_cudagraph_asserts to True to skip the CPU check.
if value:
torch._inductor.config.triton.slow_path_cudagraph_asserts = False
修改建议:
根据注释的意图,应将`torch._inductor.config.triton.slow_path_cudagraph_asserts`设置为True。建议修改为:`torch._inductor.config.triton.slow_path_cudagraph_asserts = True`。同时,建议检查`slow_path_cudagraph_asserts`配置项在PyTorch Inductor中的确切含义,确保修改后的逻辑符合预期。
此评论由代码审查工具自动生成


语法错误: 第304行存在与第303行相同的语法错误。代码中使用了 'None, if actual_seq_kvlen is None else Replicate()',这在Python中是无效的语法。正确的语法应该是 'None if actual_seq_kvlen is None else Replicate()'。
问题类型: 语法错误
文件路径: torch_npu/distributed/tensor/_attention.py
行号: 304
问题代码:
None, if actual_seq_kvlen is None else Replicate(), # actual_seq_kvlen
修改建议:
将第304行的 'None, if actual_seq_kvlen is None else Replicate()' 修改为 'None if actual_seq_kvlen is None else Replicate()',删除多余的逗号。
此评论由代码审查工具自动生成


语法错误: 第347行存在与第303行相同的语法错误。代码中使用了 'None, if actual_seq_qlen is None else Replicate()',这在Python中是无效的语法。
问题类型: 语法错误
文件路径: torch_npu/distributed/tensor/_attention.py
行号: 347
问题代码:
None, if actual_seq_qlen is None else Replicate(), # actual_seq_qlen
修改建议:
将第347行的 'None, if actual_seq_qlen is None else Replicate()' 修改为 'None if actual_seq_qlen is None else Replicate()',删除多余的逗号。
此评论由代码审查工具自动生成


语法错误: 第348行存在与第304行相同的语法错误。代码中使用了 'None, if actual_seq_kvlen is None else Replicate()',这在Python中是无效的语法。
问题类型: 语法错误
文件路径: torch_npu/distributed/tensor/_attention.py
行号: 348
问题代码:
None, if actual_seq_kvlen is None else Replicate(), # actual_seq_kvlen
修改建议:
将第348行的 'None, if actual_seq_kvlen is None else Replicate()' 修改为 'None if actual_seq_kvlen is None else Replicate()',删除多余的逗号。
此评论由代码审查工具自动生成


语法错误: 第383行存在与第303行相同的语法错误。代码中使用了 'None, if actual_seq_qlen is None else Replicate()',这在Python中是无效的语法。
问题类型: 语法错误
文件路径: torch_npu/distributed/tensor/_attention.py
行号: 383
问题代码:
None, if actual_seq_qlen is None else Replicate(), # actual_seq_qlen
修改建议:
将第383行的 'None, if actual_seq_qlen is None else Replicate()' 修改为 'None if actual_seq_qlen is None else Replicate()',删除多余的逗号。
此评论由代码审查工具自动生成


语法错误: 第384行存在与第304行相同的语法错误。代码中使用了 'None, if actual_seq_kvlen is None else Replicate()',这在Python中是无效的语法。
问题类型: 语法错误
文件路径: torch_npu/distributed/tensor/_attention.py
行号: 384
问题代码:
None, if actual_seq_kvlen is None else Replicate(), # actual_seq_kvlen
修改建议:
将第384行的 'None, if actual_seq_kvlen is None else Replicate()' 修改为 'None if actual_seq_kvlen is None else Replicate()',删除多余的逗号。
此评论由代码审查工具自动生成


语法错误: 第427行存在语法错误。代码中使用了 'None, if seed is None else Replicate()',这在Python中是无效的语法。正确的语法应该是 'None if seed is None else Replicate()'。
问题类型: 语法错误
文件路径: torch_npu/distributed/tensor/_attention.py
行号: 427
问题代码:
None, if seed is None else Replicate(), # seed
修改建议:
将第427行的 'None, if seed is None else Replicate()' 修改为 'None if seed is None else Replicate()',删除多余的逗号。
此评论由代码审查工具自动生成


语法错误: 第428行存在语法错误。代码中使用了 'None, if offset is None else Replicate()',这在Python中是无效的语法。正确的语法应该是 'None if offset is None else Replicate()'。
问题类型: 语法错误
文件路径: torch_npu/distributed/tensor/_attention.py
行号: 428
问题代码:
None, if offset is None else Replicate(), # offset
修改建议:
将第428行的 'None, if offset is None else Replicate()' 修改为 'None if offset is None else Replicate()',删除多余的逗号。
此评论由代码审查工具自动生成


语法错误: 第430行存在语法错误。代码中使用了 'None, if actual_seq_qlen is None else Replicate()',这在Python中是无效的语法。正确的语法应该是 'None if actual_seq_qlen is None else Replicate()'。
问题类型: 语法错误
文件路径: torch_npu/distributed/tensor/_attention.py
行号: 430
问题代码:
None, if actual_seq_qlen is None else Replicate(), # actual_seq_qlen
修改建议:
将第430行的 'None, if actual_seq_qlen is None else Replicate()' 修改为 'None if actual_seq_qlen is None else Replicate()',删除多余的逗号。
此评论由代码审查工具自动生成


语法错误: 第431行存在语法错误。代码中使用了 'None, if actual_seq_kvlen is None else Replicate()',这在Python中是无效的语法。正确的语法应该是 'None if actual_seq_kvlen is None else Replicate()'。
问题类型: 语法错误
文件路径: torch_npu/distributed/tensor/_attention.py
行号: 431
问题代码:
None, if actual_seq_kvlen is None else Replicate(), # actual_seq_kvlen
修改建议:
将第431行的 'None, if actual_seq_kvlen is None else Replicate()' 修改为 'None if actual_seq_kvlen is None else Replicate()',删除多余的逗号。
此评论由代码审查工具自动生成


问题/功能描述
本次PR旨在增强NPU(昇腾)在PyTorch分布式训练和Inductor编译后端中的功能支持与性能优化。主要包含三个核心部分:1) 为npu_fusion_attention及其v3版本算子新增分布式张量(DTensor)测试,以验证其在多种输入布局和稀疏注意力模式下,于分布式环境中的前向与反向传播正确性;2) 扩展分布式张量计算框架,为npu_fusion_attention_v3和npu_fusion_attention_grad_v3算子新增数据并行和张量并行的分片策略支持,以支持大规模模型训练;3) 优化NPU Inductor的图优化能力与日志系统,通过新增配置允许在特定场景下跳过CPU输入检查,从而优化图融合过程,并完善ACL图模块的日志记录功能。
修改方案描述
修改方案涉及多个文件,具体包括:1) 在测试文件test_attention_ops.py中新增四个测试方法,通过对比单设备基准结果与分布式环境下的计算结果,验证npu_fusion_attention算子在多种布局和稀疏模式下的分布式正确性。2) 在分布式策略注册中,新增npu_fusion_attention_v3_strategy和npu_fusion_attention_grad_v3_strategy函数,定义了完整的复制、数据并行和张量并行策略,并更新统一处理函数以适配不同版本的算子。3) 在torch_npu/_inductor/config.py中新增_npugraph_trees配置类,提供disable_cpu_input_check属性以优化图融合;在torch_npu/_logging/_internal.py中注册"aclgraph"日志模块;并在多个图优化相关函数中引入对该配置的检查,以灵活处理CPU节点,同时将多处日志更新为f-string格式以提升可读性。


| 阶段 | 任务名 | 状态 | 详情 |
|---|---|---|---|
| 编译构建 | Build_X86 | 🕚 | >>> |
| Build_LibTorch | 🕚 | >>> | |
| Build_ARM | 🕚 | >>> | |
| Build_ARM_inductor | 🕚 | >>> | |
| Build_X86_py311 | 🕚 | >>> | |
| Build_ARM_py311 | 🕚 | >>> | |
| 恶意代码检查 | Antipoison | ✅ | >>> |
| 编码安全与规范检查 | CodeCheck | ❌ | >>> |
| check_error | ✅ | >>> | |
| 开源片段检查 | SCA | ✅ | >>> |
| 开发者测试 | UT_DIST_X86 | 🕚 | >>> |
| UT_X86_Part_01 | 🕚 | >>> | |
| UT_X86_Part_02 | 🕚 | >>> | |
| UT_ARM_A2_Part_01 | 🕚 | >>> | |
| UT_ARM_A2_Part_02 | 🕚 | >>> | |
| UT_inductor_Part_01 | 🕚 | >>> | |
| UT_inductor_Part_02 | 🕚 | >>> | |
| UT_inductor_Part_03 | 🕚 | >>> | |
| UT_inductor_Part_04 | 🕚 | >>> | |
| 流水线 | PR-pipeline_pytorch | ❌ | >>> |


| 阶段 | 任务名 | 状态 | 详情 |
|---|---|---|---|
| 编译构建 | Build_X86 | ✅ | >>> |
| Build_LibTorch | ✅ | >>> | |
| Build_ARM | ✅ | >>> | |
| Build_ARM_inductor | 🛑 | >>> | |
| Build_X86_py311 | 🛑 | >>> | |
| Build_ARM_py311 | 🛑 | >>> | |
| 恶意代码检查 | Antipoison | ✅ | >>> |
| 编码安全与规范检查 | CodeCheck | ✅ | >>> |
| check_error | ✅ | >>> | |
| 开源片段检查 | SCA | ✅ | >>> |
| 开发者测试 | UT_DIST_X86 | ✅ | >>> |
| UT_X86_Part_01 | ✅ | >>> | |
| UT_X86_Part_02 | ✅ | >>> | |
| UT_ARM_A2_Part_01 | 🛑 | >>> | |
| UT_ARM_A2_Part_02 | 🛑 | >>> | |
| UT_inductor_Part_01 | 🛑 | >>> | |
| UT_inductor_Part_02 | 🛑 | >>> | |
| UT_inductor_Part_03 | 🛑 | >>> | |
| UT_inductor_Part_04 | 🛑 | >>> | |
| 流水线 | PR-pipeline_pytorch | ✅ | >>> |


/approve

