已合并
[Test] Add coverage for torch.distributed.device_mesh._mesh_resources.root_to_flatten_mapping.clear #42833
[Test] Add coverage for torch.distributed.device_mesh._mesh_resources.root_to_flatten_mapping.clear #42833
已合并
nwww创建于 25 天前
nwww
25 天前

【合入来源】

关联社区 Issue:

https://gitcode.com/Ascend/pytorch/issues/3175

本 PR 对以下 PyTorch API 补充 Torch-NPU 一致性测试:

torch.distributed.device_mesh._mesh_resources.root_to_flatten_mapping.clear

【修改方案】

1. 修改背景

在 PyTorch v2.7.1 中,torch.distributed.device_mesh._mesh_resources
是 DeviceMesh 模块内部使用的全局 _MeshEnv 实例,用于维护根
DeviceMesh、子 DeviceMesh 以及展平 DeviceMesh 之间的映射关系。

其中:

_mesh_resources.root_to_flatten_mapping

是一个字典类型的内部缓存,其结构为:

dict[DeviceMesh, dict[str, DeviceMesh]]

外层字典的键表示根 DeviceMesh,值表示该根 DeviceMesh 对应的
flattened mesh 缓存;内层字典将 flattened mesh 名称映射到对应的
DeviceMesh 实例。

目标 API:

torch.distributed.device_mesh._mesh_resources.root_to_flatten_mapping.clear()

用于原地清空上述根 Mesh 到 flattened Mesh 的全部缓存关系。

2. PyTorch 官方用例核查结果

对 PyTorch v2.7.1 官方源码和测试进行检索后发现,官方已有以下
DeviceMesh flatten 相关测试:

  • test_flatten_mesh_3d
  • test_flatten_mesh_4d
  • test_reconstruct_mesh_with_flatten_dim

这些测试主要验证以下功能:

  1. 多维 DeviceMesh 的展平结果是否正确;
  2. flattened mesh 的名称是否正确;
  3. flattened mesh 与 root mesh 的依赖关系是否正确;
  4. 使用 flattened mesh 维度重新切分 DeviceMesh 是否正确;
  5. 对已创建的 flattened mesh 是否能够正确复用。

但是,官方测试中没有发现对以下精确 API 的直接调用和验证:

torch.distributed.device_mesh._mesh_resources.root_to_flatten_mapping.clear

因此,本 PR 在 Torch-NPU 自有测试目录中补充该 API 的直接测试,
不修改 PyTorch 官方 upstream patch。

3. 修改文件

本 PR 仅修改以下文件:

test/distributed/test_device_mesh.py

具体修改包括:

  1. 新增 TestMeshResources 测试类;
  2. 新增 test_root_to_flatten_mapping_clear 测试方法;
  3. 在文件头补充 Huawei Copyright;
  4. 在文件头补充 BSD 3-Clause License 声明;
  5. 保留原有 Meta Platforms Copyright 和 Owner 信息。

本 PR 没有修改 Torch-NPU 运行时代码,没有修改算子实现,也没有修改
其他无关测试文件。

根据 Torch-NPU 新增测试用例的代码规范,本 PR 在被修改的测试文件
头部补充:

Copyright (c) 2026 Huawei Technologies Co., Ltd

同时补充 BSD 3-Clause License 声明。

原文件已有的 Meta Platforms Copyright 和 Owner 信息均予以保留,
未删除或覆盖原有版权声明。

文件头当前包含:

Copyright (c) 2026 Huawei Technologies Co., Ltd
BSD 3-Clause License
Copyright (c) Meta Platforms, Inc. and affiliates
Owner(s): ["oncall: distributed"]

Huawei Copyright 在文件中仅出现一次。

本次 Copyright 和许可证修改仅用于满足新增测试用例的版权及许可证规范,
不影响测试逻辑、接口行为和运行结果。

5. 新增测试类和测试方法

新增测试类:

TestMeshResources

新增测试方法:

test_root_to_flatten_mapping_clear

测试直接获取真实的共享映射对象:

mapping = _mesh_resources.root_to_flatten_mapping

并调用目标 API:

mapping.clear()

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:

result = mapping.clear()

并验证全部缓存条目已被删除。

6.3 返回值验证

Python 字典的 clear() 应返回 None,测试对此进行验证:

self.assertIsNone(result)

6.4 原地清空验证

clear() 应清空原字典对象,而不是用另一个新字典替换原对象。

测试通过以下断言确认映射对象身份未发生变化:

self.assertIs(
    mapping,
    _mesh_resources.root_to_flatten_mapping,
)

6.5 重复清空验证

在映射已经为空的情况下再次调用:

mapping.clear()

验证重复清空不会报错,返回值仍为 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 按后进先出的顺序执行,测试结束后会:

  1. 清空测试过程中写入的临时数据;
  2. 恢复执行测试前保存的原始映射内容。

即使测试中间出现断言失败,也能够执行清理操作,避免全局缓存状态
影响后续测试。

7. NPU 适配分析

该 API 的实际对象是 Python 字典:

_mesh_resources.root_to_flatten_mapping

目标操作是 Python 字典的:

clear()

该 API 具有以下特点:

  1. 不接收 Tensor;
  2. 不执行 PyTorch 算子;
  3. 不调用 NPU Kernel;
  4. 不涉及 CPU/NPU 数据迁移;
  5. 不涉及 dtype;
  6. 不涉及 HCCL 集合通信;
  7. 不依赖多卡环境;
  8. 不需要初始化分布式进程组。

因此,本测试不添加与目标 API 无关的 NPU Tensor,也不引入不必要的
HCCL 初始化。

本次测试在 Ascend NPU 环境中执行,并单独确认:

NPU available: True
NPU count: 1
NPU health: OK

8. 版本适配分析

对目标 API 在各版本中的存在情况进行了核查:

分支 核查结果 本任务处理
v2.7.1 _mesh_resources.root_to_flatten_mapping 存在,官方无直接 clear() 测试 本 PR 补充测试
v2.9.0 当前任务规则中属于维护版本 不提交代码或测试 PR
v2.10.0 当前任务规则中属于维护版本 不提交代码或测试 PR
v2.11.0 精确 API 已不存在,缓存结构已重构 不补充旧 API 测试
v2.12.0 精确 API 已不存在,缓存结构已重构 不补充旧 API 测试
master 精确 API 已不存在,缓存结构已重构 不补充旧 API 测试

在较新版本中,flattened mesh 缓存已重构为 DeviceMesh 实例上的:

DeviceMesh._flatten_mapping

该属性与 Issue #3175 指定的以下精确 API 不相同:

torch.distributed.device_mesh._mesh_resources.root_to_flatten_mapping.clear

因此,没有将新版 _flatten_mapping.clear() 强行视为同一 API,也没有
在不存在目标 API 的分支中添加无效测试。

【资料变更】

不涉及资料文件修改。

本次补充的 API 位于:

torch.distributed.device_mesh._mesh_resources

其中 _mesh_resources 以下划线开头,属于 PyTorch 内部私有对象,
不是面向用户公开承诺的公共 API。

根据 API 一致性任务的资料要求,PyTorch 私有 API 不需要在以下目录
补充公开资料:

docs/zh/api/native_api

因此,本任务不提交资料修改,也不创建单独的资料 PR。

本 PR 对测试文件头部补充的 Huawei Copyright 和 BSD 3-Clause License
属于测试代码版权规范调整,不属于原生 API 使用资料变更。

【接口变更】

不涉及。

本 PR 仅新增单元测试并补充测试文件 Copyright 和许可证声明,不修改
以下内容:

  1. 不修改 Torch-NPU 运行时代码;
  2. 不新增公共 Python API;
  3. 不修改已有 API 的参数;
  4. 不修改已有 API 的返回值;
  5. 不修改算子行为;
  6. 不修改跨仓调用关系;
  7. 不修改客户可见接口;
  8. 不修改 DeviceMesh 内部实现;
  9. 不修改 PyTorch upstream patch。

【功能验证】

1. 验证环境

NPU: Ascend 910B4
NPU health: OK
npu-smi version: 25.5.2
Python: 3.11
torch: 2.9.0+cpu
torch_npu: 2.9.0rc1
NPU available: True
NPU count: 1

说明:

torch 2.9.0+cpu

是当前任务镜像中安装的 PyTorch 包版本标识。NPU 能力由
torch_npu 后端扩展提供,测试过程中 torch_npu 已成功从
site-packages 加载,且:

torch.npu.is_available()

返回 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

结果:

py_compile exit code: 0

说明 Python 语法检查通过。

3. Git diff 格式检查

执行:

git diff --check

结果:

diff check exit code: 0

未发现空白符错误或 Git diff 格式错误。

执行:

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 header count: 1

文件头确认包含:

Copyright (c) 2026 Huawei Technologies Co., Ltd
BSD 3-Clause License
Copyright (c) Meta Platforms, Inc. and affiliates
Owner(s): ["oncall: distributed"]

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

执行结果:

test_root_to_flatten_mapping_clear
(__main__.TestMeshResources.test_root_to_flatten_mapping_clear) ... ok

----------------------------------------------------------------------
Ran 1 test in 0.004s

OK

结果说明:

  • 补充 Copyright 和许可证声明后 Python 文件能够正常加载;
  • 目标测试成功执行;
  • 全部断言通过;
  • 测试结束后共享映射状态能够正常恢复。

6. pytest 目标用例验证

执行命令:

cd /tmp

PYTHONPATH= python3 -m pytest -q \
  /workspace/pytorch/test/distributed/test_device_mesh.py::TestMeshResources::test_root_to_flatten_mapping_clear

执行结果:

.                                                                        [100%]

1 passed in 8.53s

7. 测试结果说明

目标用例验证了:

  • 空映射可正常清空;
  • 非空映射中的所有条目可正常删除;
  • clear() 返回值为 None
  • 映射对象在原位置被清空;
  • 重复调用 clear() 不会报错;
  • 非法位置参数会抛出 TypeError
  • 非法关键字参数会抛出 TypeError
  • 测试结束后能够恢复原始共享缓存状态。

8. 提交和修改范围验证

补充 Copyright 后,通过 git commit --amend --no-edit 更新原提交,
未新增额外提交。

最新提交:

4bceec1c2c3613bb2baf002b5185392d0386b1dd

提交信息:

test: add root_to_flatten_mapping clear coverage

Signed-off-by: nannan-2026 <1794949109@qq.com>

提交仅修改:

test/distributed/test_device_mesh.py

原 PR 分支通过 --force-with-lease 安全更新,远端更新结果:

58cb53f92ad3af595e6868de6ad0036e298b8499
    ->
4bceec1c2c3613bb2baf002b5185392d0386b1dd

本地与远端提交已确认一致:

Local commit:
4bceec1c2c3613bb2baf002b5185392d0386b1dd

Remote commit:
4bceec1c2c3613bb2baf002b5185392d0386b1dd

PR 仍保持单个 Signed-off-by 提交。

9. 自验证截图

已完成以下内容的自验证:

  • Ascend 910B4 npu-smi info 状态;
  • torch.npu.is_available() 和 NPU 数量;
  • unittest 目标测试执行结果;
  • pytest 目标测试执行结果;
  • Python 语法检查;
  • git diff --check 检查;
  • Huawei Copyright 数量检查;
  • 修改文件范围检查;
  • Signed-off-by 检查;
  • 本地和远端提交一致性检查。

屏幕截图 2026-07-26 182325.png

屏幕截图 2026-07-26 182347.png

屏幕截图 2026-07-26 182424.png

屏幕截图 2026-07-26 182455.png

【CheckList】

likedislike
Pull Request已成功合入, 合并人@ascend-robot
(感谢 nwww 的贡献)
Nnwww
25 天前 创建了 pull request,commit 369c7e45
Nnwww
25 天前 关联了issue:【社区任务】7月社区任务第三期-Ascend for PyTorch API 一致性开发(67)
atomgit-bot
atomgit-bot
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
likedislike
atomgit-bot
atomgit-bot
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() 的返回值、空映射清除、重复清除、参数拒绝等断言均与 Python dict.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 — 无问题。

⚠️ 已识别出整体风险,但无法提取行内评论,请参考整体评估。

likedislike
此处折叠了108条消息 查看更多
ascend-robotascend-robot成员
9 天前 添加了label:lgtm
ascend-robotascend-robot成员
9 天前 关闭了关联的issue
ascend-robotascend-robot成员
9 天前 合入了pull request
ascend-robot
ascend-robot成员
9 天前 评论:

Pull Request 已合并或已关闭。

If you want to solve this problem, you can click here to do it in the FAQs.

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