已合并
test:This PR adds missing test cases for torch._utils._unflatten_dense_tensors, as there are currently no community-provided tests for this function. #42051
创建于 7月18日
test:This PR adds missing test cases for torch._utils._unflatten_dense_tensors, as there are currently no community-provided tests for this function. #42051
已合并
创建于 7月18日
已删除 :test_unflatten_dense_tensors_v2.12.0合入到Ascend/pytorchv2.12.0
7月18日

【合入来源】

如有社区issue,请关联issue链接
请勿携带内部流程信息(需求链接、问题单、内部issue等)

issue任务地址:https://gitcode.com/Ascend/pytorch/issues/2932

【修改方案】

torch._utils._unflatten_dense_tensors 新增 NPU 设备回归测试用例,放置在 test/test_unflatten_dense_tensors.py

  1. PyTorch 社区对该 API 仅有 C++ 层单元测试(test/cpp/api/tensor_flatten.cpp),Python 层面无任何测试用例,且缺少 NPU 设备上的运行验证。
  2. 新增 8 个测试用例,基于 PyTorch 标准 TestCase 框架,通过 torch.accelerator.current_accelerator() 自动获取 NPU 设备并完成张量迁移,覆盖以下维度:
    • 展平-还原往返操作正确性
    • 单张量与多张量(1D/2D/3D 不同形状)
    • 空张量混合与全空张量边界场景
    • float32 / float16 / int32 多 dtype 兼容性
    • 50 个大数量张量压力场景
    • tuple 类型输入兼容性
  3. 遵循 NPU 测试用例规范:导入顺序为 torchtorch.testing._internal.common_utils,不依赖 torch_npu,使用 self.assert* 断言,无 print/try-except,注释精简英文。

【资料变更】

不涉及。torch._utils._unflatten_dense_tensors 为 PyTorch 内部工具函数(_ 前缀),不属于公开文档覆盖范围。

【接口变更】

不涉及。仅新增测试文件,无对外接口变更。

【功能验证】

测试场景:在 NPU 设备上验证 torch._utils._unflatten_dense_tensors 将展平 1D 张量按目标形状还原为多个张量的功能正确性。

2.7.1
执行命令

python test_unflatten_dense_tensors.py -v

结果

test_all_empty_tensors (__main__.TestUnflattenDenseTensors.test_all_empty_tensors) ... ok
test_different_dtypes (__main__.TestUnflattenDenseTensors.test_different_dtypes) ... ok
test_empty_tensor_in_list (__main__.TestUnflattenDenseTensors.test_empty_tensor_in_list) ... ok
test_large_num_tensors (__main__.TestUnflattenDenseTensors.test_large_num_tensors) ... ok
test_multiple_tensors_different_sizes (__main__.TestUnflattenDenseTensors.test_multiple_tensors_different_sizes) ... ok
test_round_trip_basic (__main__.TestUnflattenDenseTensors.test_round_trip_basic) ... ok
test_single_tensor (__main__.TestUnflattenDenseTensors.test_single_tensor) ... ok
test_tuple_input (__main__.TestUnflattenDenseTensors.test_tuple_input) ... ok

----------------------------------------------------------------------
Ran 8 tests in 1.339s

OK

2.9.0
执行命令

python test_unflatten_dense_tensors.py -v

结果

test_all_empty_tensors (__main__.TestUnflattenDenseTensors.test_all_empty_tensors) ... ok
test_different_dtypes (__main__.TestUnflattenDenseTensors.test_different_dtypes) ... ok
test_empty_tensor_in_list (__main__.TestUnflattenDenseTensors.test_empty_tensor_in_list) ... ok
test_large_num_tensors (__main__.TestUnflattenDenseTensors.test_large_num_tensors) ... ok
test_multiple_tensors_different_sizes (__main__.TestUnflattenDenseTensors.test_multiple_tensors_different_sizes) ... ok
test_round_trip_basic (__main__.TestUnflattenDenseTensors.test_round_trip_basic) ... ok
test_single_tensor (__main__.TestUnflattenDenseTensors.test_single_tensor) ... ok
test_tuple_input (__main__.TestUnflattenDenseTensors.test_tuple_input) ... ok

----------------------------------------------------------------------
Ran 8 tests in 1.331s

OK

2.11.0
执行命令

python test_unflatten_dense_tensors.py -v

结果

test_all_empty_tensors (__main__.TestUnflattenDenseTensors.test_all_empty_tensors) ... ok
test_different_dtypes (__main__.TestUnflattenDenseTensors.test_different_dtypes) ... [W718 07:12:27.082786050 NPUCachingAllocator.cpp:201] Warning: The current CANN and Soc versions require processing for 32 padding size, with memory allocation. (function operator())
ok
test_empty_tensor_in_list (__main__.TestUnflattenDenseTensors.test_empty_tensor_in_list) ... ok
test_large_num_tensors (__main__.TestUnflattenDenseTensors.test_large_num_tensors) ... ok
test_multiple_tensors_different_sizes (__main__.TestUnflattenDenseTensors.test_multiple_tensors_different_sizes) ... ok
test_round_trip_basic (__main__.TestUnflattenDenseTensors.test_round_trip_basic) ... ok
test_single_tensor (__main__.TestUnflattenDenseTensors.test_single_tensor) ... ok
test_tuple_input (__main__.TestUnflattenDenseTensors.test_tuple_input) ... ok

----------------------------------------------------------------------
Ran 8 tests in 1.357s

OK

2.12.0
执行命令

python test_unflatten_dense_tensors.py -v

结果

W0718 07:12:38.397000 45485 opt/conda/envs/v2.12.0/lib/python3.12/site-packages/torch/_native/cutedsl_utils.py:55] CuTeDSL operators require optional Python packages `nvidia-cutlass-dsl` and `apache-tvm-ffi`; missing optional dependency `nvidia_cutlass_dsl` (importlib.util.find_spec(nvidia_cutlass_dsl) failed)
test_all_empty_tensors (__main__.TestUnflattenDenseTensors.test_all_empty_tensors) ... ok
test_different_dtypes (__main__.TestUnflattenDenseTensors.test_different_dtypes) ... [W718 07:12:39.554782459 NPUCachingAllocator.cpp:201] Warning: The current CANN and Soc versions require processing for 32 padding size, with memory allocation. (function operator())
ok
test_empty_tensor_in_list (__main__.TestUnflattenDenseTensors.test_empty_tensor_in_list) ... ok
test_large_num_tensors (__main__.TestUnflattenDenseTensors.test_large_num_tensors) ... ok
test_multiple_tensors_different_sizes (__main__.TestUnflattenDenseTensors.test_multiple_tensors_different_sizes) ... ok
test_round_trip_basic (__main__.TestUnflattenDenseTensors.test_round_trip_basic) ... ok
test_single_tensor (__main__.TestUnflattenDenseTensors.test_single_tensor) ... ok
test_tuple_input (__main__.TestUnflattenDenseTensors.test_tuple_input) ... ok

----------------------------------------------------------------------
Ran 8 tests in 1.374s

OK

master
执行命令

python test_unflatten_dense_tensors.py -v

结果

test_all_empty_tensors (__main__.TestUnflattenDenseTensors.test_all_empty_tensors) ... ok
test_different_dtypes (__main__.TestUnflattenDenseTensors.test_different_dtypes) ... [W718 07:12:49.941707130 NPUCachingAllocator.cpp:174] Warning: The current CANN and Soc versions require processing for 32 padding size, with memory allocation. (function operator())
ok
test_empty_tensor_in_list (__main__.TestUnflattenDenseTensors.test_empty_tensor_in_list) ... ok
test_large_num_tensors (__main__.TestUnflattenDenseTensors.test_large_num_tensors) ... ok
test_multiple_tensors_different_sizes (__main__.TestUnflattenDenseTensors.test_multiple_tensors_different_sizes) ... ok
test_round_trip_basic (__main__.TestUnflattenDenseTensors.test_round_trip_basic) ... ok
test_single_tensor (__main__.TestUnflattenDenseTensors.test_single_tensor) ... ok
test_tuple_input (__main__.TestUnflattenDenseTensors.test_tuple_input) ... ok

----------------------------------------------------------------------
Ran 8 tests in 1.372s

OK

【CheckList】

PR提交人对以下CheckList自检项进行全量自检,自检通过或不涉及,均修改 [ ] 为 [x]

likedislike
Pull Request已成功合入, 合并人@ascend-robot
(感谢 的贡献)
-此账号已注销
7月18日 创建了 pull request,commit c019f641
-此账号已注销
7月18日 关联了issue:【社区任务】7月社区任务第二期-Ascend for PyTorch API 一致性开发(19)
atomgit-bot
atomgit-bot
7月18日 评论:

变更摘要

该 PR 为 PyTorch 内部工具函数 torch._utils._unflatten_dense_tensors 新增了 NPU 设备上的 Python 单元测试。PyTorch 社区此前仅在 C++ 层(test/cpp/api/tensor_flatten.cpp)有相关测试,Python 层面无任何验证用例。本次变更新增文件 test/test_unflatten_dense_tensors.py,包含 8 个测试用例,通过 torch.accelerator.current_accelerator() 自动适配设备,覆盖展平-还原往返操作、多形状/多 dtype/空张量边界、tuple 输入及大数量压力场景。

主要改动

  • 新增测试文件 test/test_unflatten_dense_tensors.py:创建了包含 TestUnflattenDenseTensors 类的独立测试模块,继承自 PyTorch 标准 TestCase,共 128 行代码。
  • 设备自动适配机制:通过 setUp 中调用 torch.accelerator.current_accelerator() 获取当前加速器类型,_to_device 辅助方法将张量迁移至对应设备,无需硬编码 NPU 设备名。
  • 8 个覆盖多场景的测试用例:包括 test_round_trip_basic 往返验证、test_single_tensor 单张量、test_multiple_tensors_different_sizes 多维不同形状、test_empty_tensor_in_listtest_all_empty_tensors 空张量边界、test_different_dtypes 多 dtype(float32/float16/int32)、test_large_num_tensors 50 张量压力及 test_tuple_input 元组输入兼容性测试。
  • _flatten_dense_tensors 配对验证:每个测试用例均通过 torch._utils._flatten_dense_tensors 展平后,再用 torch._utils._unflatten_dense_tensors 还原,通过 self.assertEqual 校验形状、元素数量和数值一致性。
likedislike
atomgit-bot
atomgit-bot
7月18日 评论:

代码审查

经过全面审查,该测试文件 test/test_unflatten_dense_tensors.py 没有发现任何实际问题。

审查结论

文件:test/test_unflatten_dense_tensors.py — 无问题。

该文件是一个新增的 NPU 设备回归测试文件,包含 8 个测试用例,覆盖了 torch._utils._unflatten_dense_tensors / torch._utils._flatten_dense_tensors 的往返正确性、多张量、空张量边界、多种 dtype、大批量张量压力、以及 tuple 输入兼容性等场景。逐项核查如下:

  • 设备选择逻辑(第 16–17 行):torch.accelerator.current_accelerator() 返回 None 时回退到 "cpu",有加速器时使用 acc.type,逻辑正确且健壮。
  • _to_device 方法(第 19–20 行):正确地将张量迁移到目标设备,CPU 回退场景下 t.to("cpu") 为无操作拷贝。
  • _flatten_dense_tensors / _unflatten_dense_tensors 调用签名:所有测试均使用一致的往返模式 flat = _flatten_dense_tensors(tensors)result = _unflatten_dense_tensors(flat, tensors),签名正确。
  • dtype 一致性:每个测试内的张量均使用相同 dtype(float32 或显式指定),满足 _flatten_dense_tensors 要求所有张量 dtype 一致的合约。
  • 空张量处理torch.tensor([]) 创建 shape (0,) 的 float32 张量,与其他同测试内的 float32 张量 dtype 一致;NPU 自定义 kernel (FlattenDenseTensorsKernelNpu.cpp) 对空张量的 .view({-1})at::cat 均能正确处理。
  • NPU 规范遵循:导入顺序正确(torchtorch.testing._internal.common_utils),不依赖 torch_npu,使用 self.assert* 断言,无 print/try-except,注释精简英文。

本次变更风险判断:低风险。 这是一个纯粹的测试文件新增,不涉及任何生产代码变更。测试逻辑正确,覆盖全面,无安全性、可靠性或回归风险。

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

likedislike
此处折叠了103条消息 查看更多
梁松伟
梁松伟成员
7月23日 评论:

/approve

likedislike
ascend-robotascend-robot成员
7月23日 添加了label:approvedlgtm
ascend-robotascend-robot成员
7月23日 合入了pull request
ascend-robot
ascend-robot成员
7月23日 评论:
流水线 pytorch_gitcode_PR_multiVersion#13031 [ commitID:1ff5eb34 ] 已完成
likedislike
xin0366
10 天前 评论:

image.png
由于此前账号资料调整,该任务由本人承接与完成,特此说明。

likedislike