已合并
[Test] Add coverage for torch.distributed.device_mesh._mesh_resources.root_to_flatten_mapping.clear #42833
nwww创建于 25 天前
[Test] Add coverage for torch.distributed.device_mesh._mesh_resources.root_to_flatten_mapping.clear #42833
已合并
Pull Request已成功合入, 合并人@ascend-robot
(感谢 nwww 的贡献)atomgit-bot
25 天前 评论:
25 天前 评论:
变更摘要
此 PR 为 torch.distributed.device_mesh._mesh_resources.root_to_flatten_mapping.clear() 补充 Torch-NPU 一致性测试,新增 TestMeshResources 测试类及其测试方法 test_root_to_flatten_mapping_clear,覆盖该字典 clear() 方法在空映射、非空映射、重复清空及非法参数场景下的行为验证。
主要改动
- 新增
TestCase导入: 在test/distributed/test_device_mesh.py中导入from torch.testing._internal.common_utils import TestCase,为独立于DTensorTestBase的纯单元测试提供基类。 - 新增
TestMeshResources测试类: 继承TestCase(而非DTensorTestBase),专门测试_mesh_resources内部缓存结构,避免分布式环境依赖。 - 新增
test_root_to_flatten_mapping_clear测试方法: 覆盖root_to_flatten_mapping.clear()的核心场景——通过addCleanup恢复原始映射以保证测试隔离;验证空映射清空、添加条目后清空、清空返回值None、清空后对象身份不变、重复清空为无操作,以及传入非法位置参数和关键字参数时抛出TypeError。


ascend-robot
25 天前 评论:
25 天前 评论:
atomgit-bot
25 天前 评论:
25 天前 评论:
代码审查
经过对 test/distributed/test_device_mesh.py 中所有变更行的逐条审查(包括新增注释、TestCase 导入、TestMeshResources 测试类及其 test_root_to_flatten_mapping_clear 方法),我完成了以下维度的检查:
- 逻辑正确性:
addCleanup的 LIFO 清理顺序(先mapping.clear()再mapping.update(original_mapping))能正确恢复全局共享 dict 的原始状态;dict.clear()的返回值、空映射清除、重复清除、参数拒绝等断言均与 Pythondict.clear()标准行为一致。 - 安全:无 SQL/命令注入、路径遍历、硬编码密钥等风险;测试仅操作标准
dict方法。 - 可靠性:
addCleanup在所有测试路径(成功、断言失败)下均能恢复_mesh_resources.root_to_flatten_mapping的原始状态,无残留污染风险。 - 资源管理:测试使用
object()实例作为临时键/值,无外部资源需要释放。
审查总结
- P0: 0
- P1: 0
- P2: 0
- P3: 0
整体风险评估:无风险。 该变更是一个干净的测试补充,逻辑正确,资源清理完备,不存在正确性、安全性、可靠性或回归方面的问题。
已审查的变更文件:
test/distributed/test_device_mesh.py— 无问题。
⚠️ 已识别出整体风险,但无法提取行内评论,请参考整体评估。


此处折叠了108条消息 查看更多
9 天前 添加了label:lgtm
9 天前 关闭了关联的issue
9 天前 合入了pull request
ascend-robot
9 天前 评论:
9 天前 评论:
Pull Request 已合并或已关闭。
If you want to solve this problem, you can click here to do it in the FAQs.


ascend-robot
9 天前 评论:
9 天前 评论:
流水线 pytorch_gitcode_PR_multiVersion#13885 [ commitID:bc9e1170 ] 运行失败


【合入来源】
关联社区 Issue:
https://gitcode.com/Ascend/pytorch/issues/3175
本 PR 对以下 PyTorch API 补充 Torch-NPU 一致性测试:
【修改方案】
1. 修改背景
在 PyTorch v2.7.1 中,
torch.distributed.device_mesh._mesh_resources是 DeviceMesh 模块内部使用的全局
_MeshEnv实例,用于维护根DeviceMesh、子 DeviceMesh 以及展平 DeviceMesh 之间的映射关系。
其中:
是一个字典类型的内部缓存,其结构为:
dict[DeviceMesh, dict[str, DeviceMesh]]外层字典的键表示根 DeviceMesh,值表示该根 DeviceMesh 对应的
flattened mesh 缓存;内层字典将 flattened mesh 名称映射到对应的
DeviceMesh 实例。
目标 API:
用于原地清空上述根 Mesh 到 flattened Mesh 的全部缓存关系。
2. PyTorch 官方用例核查结果
对 PyTorch v2.7.1 官方源码和测试进行检索后发现,官方已有以下
DeviceMesh flatten 相关测试:
test_flatten_mesh_3dtest_flatten_mesh_4dtest_reconstruct_mesh_with_flatten_dim这些测试主要验证以下功能:
但是,官方测试中没有发现对以下精确 API 的直接调用和验证:
因此,本 PR 在 Torch-NPU 自有测试目录中补充该 API 的直接测试,
不修改 PyTorch 官方 upstream patch。
3. 修改文件
本 PR 仅修改以下文件:
具体修改包括:
TestMeshResources测试类;test_root_to_flatten_mapping_clear测试方法;本 PR 没有修改 Torch-NPU 运行时代码,没有修改算子实现,也没有修改
其他无关测试文件。
4. Copyright 和许可证说明
根据 Torch-NPU 新增测试用例的代码规范,本 PR 在被修改的测试文件
头部补充:
同时补充 BSD 3-Clause License 声明。
原文件已有的 Meta Platforms Copyright 和 Owner 信息均予以保留,
未删除或覆盖原有版权声明。
文件头当前包含:
Huawei Copyright 在文件中仅出现一次。
本次 Copyright 和许可证修改仅用于满足新增测试用例的版权及许可证规范,
不影响测试逻辑、接口行为和运行结果。
5. 新增测试类和测试方法
新增测试类:
新增测试方法:
测试直接获取真实的共享映射对象:
并调用目标 API:
6. 测试覆盖场景
6.1 空映射清理
首先清空当前映射,并确认映射类型和内容:
mapping.clear() self.assertIsInstance(mapping, dict) self.assertEqual(mapping, {})验证在映射为空的情况下调用
clear()不会出现异常。6.2 非空映射清理
向映射中添加一条具有代表性的 root mesh 到 flattened mesh 的缓存:
root_mesh = object() flattened_mesh = object() mapping[root_mesh] = {"dp_tp": flattened_mesh}随后确认测试数据已正确写入:
self.assertEqual(len(mapping), 1) self.assertIs(mapping[root_mesh]["dp_tp"], flattened_mesh)然后调用目标 API:
并验证全部缓存条目已被删除。
6.3 返回值验证
Python 字典的
clear()应返回None,测试对此进行验证:self.assertIsNone(result)6.4 原地清空验证
clear()应清空原字典对象,而不是用另一个新字典替换原对象。测试通过以下断言确认映射对象身份未发生变化:
self.assertIs( mapping, _mesh_resources.root_to_flatten_mapping, )6.5 重复清空验证
在映射已经为空的情况下再次调用:
验证重复清空不会报错,返回值仍为
None,映射仍保持为空:self.assertIsNone(mapping.clear()) self.assertEqual(mapping, {})6.6 非法位置参数验证
dict.clear()不接受位置参数,测试验证传入非法位置参数时抛出TypeError:with self.assertRaises(TypeError): mapping.clear("unexpected")6.7 非法关键字参数验证
dict.clear()不接受关键字参数,测试验证传入非法关键字参数时抛出
TypeError:with self.assertRaises(TypeError): mapping.clear(unexpected=True)6.8 全局共享状态恢复
_mesh_resources是 DeviceMesh 模块内部共享的全局对象,root_to_flatten_mapping可能被同一测试进程中的其他测试使用。为避免本测试污染其他 DeviceMesh 测试,本用例在执行前保存原始映射:
original_mapping = dict(mapping)并通过
addCleanup注册清理操作:self.addCleanup(mapping.update, original_mapping) self.addCleanup(mapping.clear)由于 cleanup 按后进先出的顺序执行,测试结束后会:
即使测试中间出现断言失败,也能够执行清理操作,避免全局缓存状态
影响后续测试。
7. NPU 适配分析
该 API 的实际对象是 Python 字典:
目标操作是 Python 字典的:
该 API 具有以下特点:
因此,本测试不添加与目标 API 无关的 NPU Tensor,也不引入不必要的
HCCL 初始化。
本次测试在 Ascend NPU 环境中执行,并单独确认:
8. 版本适配分析
对目标 API 在各版本中的存在情况进行了核查:
_mesh_resources.root_to_flatten_mapping存在,官方无直接clear()测试在较新版本中,flattened mesh 缓存已重构为 DeviceMesh 实例上的:
该属性与 Issue #3175 指定的以下精确 API 不相同:
因此,没有将新版
_flatten_mapping.clear()强行视为同一 API,也没有在不存在目标 API 的分支中添加无效测试。
【资料变更】
不涉及资料文件修改。
本次补充的 API 位于:
其中
_mesh_resources以下划线开头,属于 PyTorch 内部私有对象,不是面向用户公开承诺的公共 API。
根据 API 一致性任务的资料要求,PyTorch 私有 API 不需要在以下目录
补充公开资料:
因此,本任务不提交资料修改,也不创建单独的资料 PR。
本 PR 对测试文件头部补充的 Huawei Copyright 和 BSD 3-Clause License
属于测试代码版权规范调整,不属于原生 API 使用资料变更。
【接口变更】
不涉及。
本 PR 仅新增单元测试并补充测试文件 Copyright 和许可证声明,不修改
以下内容:
【功能验证】
1. 验证环境
说明:
是当前任务镜像中安装的 PyTorch 包版本标识。NPU 能力由
torch_npu后端扩展提供,测试过程中torch_npu已成功从site-packages加载,且:返回
True。目标 API 在 PyTorch v2.7.1 中的存在性、定义位置及官方用例完整性,
通过 PyTorch v2.7.1 官方源码仓核查确认。
该 API 不执行 NPU 算子,测试环境中的 NPU 可用性检查用于确认测试运行
环境符合 Ascend 环境要求,不代表目标 API 本身会调用 NPU Kernel。
2. 语法检查
执行:
PYTHONDONTWRITEBYTECODE=1 \ python3 -m py_compile test/distributed/test_device_mesh.py结果:
说明 Python 语法检查通过。
3. Git diff 格式检查
执行:
结果:
未发现空白符错误或 Git diff 格式错误。
4. Copyright 和文件头检查
执行:
sed -n '1,42p' test/distributed/test_device_mesh.py grep -cF \ "# Copyright (c) 2026 Huawei Technologies Co., Ltd" \ test/distributed/test_device_mesh.py检查结果:
文件头确认包含:
Huawei Copyright 仅出现一次,原有 Meta Platforms Copyright 和
Owner 信息保持不变。
5. unittest 目标用例验证
在补充 Huawei Copyright 和 BSD 3-Clause License,并完成原提交 amend
后,重新执行目标测试。
执行命令:
cd /tmp TORCH_DEVICE_BACKEND_AUTOLOAD=0 \ PYTHONDONTWRITEBYTECODE=1 \ python3 \ /workspace/pytorch/test/distributed/test_device_mesh.py \ TestMeshResources.test_root_to_flatten_mapping_clear \ -v执行结果:
结果说明:
6. pytest 目标用例验证
执行命令:
cd /tmp PYTHONPATH= python3 -m pytest -q \ /workspace/pytorch/test/distributed/test_device_mesh.py::TestMeshResources::test_root_to_flatten_mapping_clear执行结果:
7. 测试结果说明
目标用例验证了:
clear()返回值为None;clear()不会报错;TypeError;TypeError;8. 提交和修改范围验证
补充 Copyright 后,通过
git commit --amend --no-edit更新原提交,未新增额外提交。
最新提交:
提交信息:
提交仅修改:
原 PR 分支通过
--force-with-lease安全更新,远端更新结果:本地与远端提交已确认一致:
PR 仍保持单个 Signed-off-by 提交。
9. 自验证截图
已完成以下内容的自验证:
npu-smi info状态;torch.npu.is_available()和 NPU 数量;git diff --check检查;【CheckList】