已合并
test(nn): adapt PackedSequence tests on NPU #37115
test(nn): adapt PackedSequence tests on NPU #37115
已合并
Jinfan Liu创建于 5月29日
Jinfan Liu
Jinfan Liu
5月29日

【合入来源】

https://gitcode.com/Ascend/pytorch/issues/2003
请勿携带内部流程信息(需求链接、问题单、内部issue等)

[x] 问题单

【修改方案】

一、API功能说明

API范围:
- torch.nn.utils.rnn.PackedSequence
- torch.nn.utils.rnn.PackedSequence.count
- torch.nn.utils.rnn.PackedSequence.index
- torch.nn.utils.rnn.PackedSequence.is_pinned
- torch.nn.utils.rnn.PackedSequence.to

1. torch.nn.utils.rnn.PackedSequence
   是 PyTorch RNN 工具模块中表示变长序列压缩结果的数据结构,主要由 torch.nn.utils.rnn.pack_padded_sequence、torch.nn.utils.rnn.pack_sequence 等接口构造,也可以直接由 data、batch_sizes、sorted_indices、unsorted_indices 四元组构造。
   核心能力:保存压缩后的 data Tensor、每个 time step 的 batch_sizes,以及可选的 sorted_indices / unsorted_indices,用于在压缩序列和 padded 序列之间恢复顺序关系。
   设备约束:data 可以位于 NPU;sorted_indices / unsorted_indices 跟随 data 的设备;batch_sizes 是序列结构元数据,按 PyTorch 接口约束保持 CPU int64 Tensor。

2. torch.nn.utils.rnn.PackedSequence.to
   是 PackedSequence 的设备和 dtype 迁移接口,语义对齐 torch.Tensor.to。
   核心能力:对 data 执行目标 device / dtype 转换,并同步迁移 sorted_indices / unsorted_indices;当 data 已满足目标配置时返回 self,避免不必要拷贝。
   边界约束:to 不迁移 batch_sizes,保持 PackedSequence 对 batch_sizes 的 CPU 元数据约束。

3. torch.nn.utils.rnn.PackedSequence.count / torch.nn.utils.rnn.PackedSequence.index
   是 PackedSequence 继承自 NamedTuple 的实例方法。
   核心能力:count 返回指定成员值在 PackedSequence 四元组中的出现次数;index 返回指定成员值首次出现的位置。
   验证重点:PackedSequence 有自定义构造逻辑,需要在真实 PackedSequence 实例上确认 NamedTuple 的 tuple-like 行为没有被破坏。

4. torch.nn.utils.rnn.PackedSequence.is_pinned
   是 PackedSequence 的 pinned memory 状态查询接口。
   核心能力:返回 self.data.is_pinned() 的结果,用于判断 PackedSequence 的实际 data Tensor 是否处于 pinned memory 状态。
   设备边界:NPU Tensor 不走 CPU pinned memory 语义,验证重点是接口可调用、返回值稳定,并且不会破坏 PackedSequence 的 NPU data Tensor 路径。

二、测试用例完备性说明

PyTorch 官方 test/nn/test_packed_sequence.py 是 PackedSequence 的集中测试文件,已有 torch.nn.utils.rnn.PackedSequence.to 的直接用例,也有 pack/pad/unpack 等 PackedSequence 集成路径。本 PR 复用该社区用例文件并做 NPU 适配:
1. test_to:保留上游 CPU/CUDA 迁移验证中的 CUDA 分支,通过 import torch_npu 和 transfer_to_npu 将 torch.cuda、Tensor.cuda()、to("cuda") 等 CUDA 兼容入口自动映射到 NPU,验证 PackedSequence.to 在 NPU 设备上的迁移、NPU 到 CPU 回迁、CPU 到 NPU 迁移,以及 torch.int32 / torch.int64 dtype 转换。
2. pad_sequence、unpad_sequence、unpack_sequence、pad_sequence_with_tensor_sequences 以及当前版本已有的 empty PackedSequence 路径,将参与验证的 data/expected Tensor 迁移到 NPU,覆盖 PackedSequence 在 RNN 工具链中的 NPU 数据流。
3. lengths、batch_sizes 等结构元数据保持 CPU,是 PyTorch PackedSequence/RNN utility 的接口约束;pack_sequence、pack_padded_sequence 等对 CPU 元数据语义敏感的路径保持社区原逻辑,避免改变上游用例验证目标。

PyTorch 官方 test/nn/test_packed_sequence.py 缺少 torch.nn.utils.rnn.PackedSequence.count、torch.nn.utils.rnn.PackedSequence.index、torch.nn.utils.rnn.PackedSequence.is_pinned 的直接用例。本 PR 因此在 torch-npu test 目录新增 test/nn/test_packed_sequence_api.py,包含 3 个直接用例:
1. test_packed_sequence_constructor_and_to_on_npu:构造 NPU data + CPU batch_sizes + NPU sorted/unsorted indices 的 PackedSequence,验证构造、设备约束、is_pinned,以及 to("cpu") / to("npu") 迁移。
2. test_packed_sequence_namedtuple_methods_on_optional_indices:验证 count(None)、index(None)、count("non_existent") 和 index 不存在成员抛 ValueError。未使用 count(batch_sizes) / index(batch_sizes),原因是 tuple 方法会先比较 NPU data Tensor 和 CPU batch_sizes Tensor,容易触发 Tensor 比较的设备/布尔歧义错误,不能稳定表达 NamedTuple 方法语义。
3. test_packed_sequence_rejects_accelerator_batch_sizes:验证 NPU batch_sizes 按 PyTorch 约束抛出 ValueError,明确 batch_sizes 作为结构元数据必须保留 CPU。

三、NPU适配方案

1. API 源码无需修改:上述 API 位于 PyTorch 框架层,核心逻辑为 PackedSequence 结构管理、Tensor.to 调用转发和 NamedTuple 行为,不涉及新增 NPU kernel、通信后端或 stream/event 语义。
2. PyTorch 社区用例适配:验收要求涉及张量的用例必须覆盖 NPU 设备路径。原社区用例主要覆盖 CPU/CUDA,不能证明 NPU 设备迁移和 NPU data Tensor 下的 PackedSequence 行为,因此需要 test_upstream patch。
3. torch-npu 原生用例补充:针对 PyTorch 社区缺少直接用例的 count/index/is_pinned,新增 test/nn/test_packed_sequence_api.py;data Tensor 放在 NPU,batch_sizes 按 PackedSequence 接口约束保留 CPU,并补充 to 与非法 NPU batch_sizes 的直接验证。
4. 分支处理:2.10.0 分支 test_upstream 原无 test/nn/test_packed_sequence.py.patch,本 PR 新增对应 patch,并新增 test/nn/test_packed_sequence_api.py。

【资料变更】

已检查 v2.7.1 docs/zh/native_apis 中各版本 torch-nn.md,以及 v2.12.0 docs/api/torch_npu_apis.md。torch.nn.utils.rnn.PackedSequence、torch.nn.utils.rnn.PackedSequence.count、torch.nn.utils.rnn.PackedSequence.index、torch.nn.utils.rnn.PackedSequence.is_pinned、torch.nn.utils.rnn.PackedSequence.to 均已列入 API 支持列表。本次只补充/适配测试用例,不涉及资料补充。

【接口变更】

不涉及。API 源码无修改,不新增、删除或变更对外接口。

【功能验证】

已在 2.10.0 torch-npu 环境应用本 PR 改动后执行 PyTorch 社区用例和新增 torch-npu 原生用例,结果如下:

python test/nn/test_packed_sequence.py
Ran 13 tests in 2.597s
OK
python test/nn/test_packed_sequence_api.py
Ran 3 tests in 1.218s
OK
likedislike
Pull Request已成功合入, 合并人@ascend-robot
(感谢 Jinfan Liu 的贡献)
Jinfan LiuJinfan Liu
5月29日 创建了 pull request,commit 04c815cc
Jinfan LiuJinfan Liu
5月29日 关联了issue:[Usage]: API一致性说明:torch.nn.utils.rnn.PackedSequence 相关 API 需做 NPU 测试适配
ascend-robot
ascend-robot成员
5月29日 评论:

The repo or branch is not access to PR-cooperate, please check the current repo https://gitcode.com/Ascend/pytorch.git, branch=v2.10.0

likedislike
ascend-robotascend-robot成员
5月29日 添加了label:ascend-cla/yes
ascend-robot
ascend-robot成员
5月29日 评论:

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
test 李伟, sunyu-xuan (2/2) 李伟 (1/1)
test_upstream 李伟, sunyu-xuan (2/2) 李伟 (1/1)

💡 Tip:

  • Committer can comment /approve or /lgtm
  • Commenting /approve implies both code review (lgtm) and intent to merge (approve)

CLA Signature Pass

JfanLiu, thanks for your pull request. All authors of the commits have signed the CLA. 👍

likedislike
ascend-robot
ascend-robot成员
5月29日 评论:

当前仓库存在以下 保护分支

Protected Branch Version Release
master
v2.10.0
v2.11.0
v2.9.0
v2.7.1
v2.12.0

评论 /sync <branch1> <branch2> ... 可将当前 PR 修改同步到其它分支(创建同步 PR):
a) 如果当前 PR 是 Open 状态,同步操作将延迟到 PR 被合并时执行
b) 如果当前 PR 已经 Merged,将立即执行同步操作

注意:

  1. /sync 命令可以指定同步到多个分支,仅最后一个 /sync 命令生效
  2. 如果创建的同步 PR 不正确,可通过向同步 PR 的源分支提交轻量级 PR 完善,或使用 /close 命令关闭
likedislike
Jinfan LiuJinfan Liu
5月29日 修改了pull request 的描述
Jinfan Liu
Jinfan Liu
5月29日 评论:

compile

likedislike
ascend-robotascend-robot成员
5月29日 添加了label:ci-pipeline-running
ascend-robotascend-robot成员
5月29日 删除了label:ci-pipeline-running
ascend-robotascend-robot成员
5月29日 添加了label:ci-pipeline-passed
ascend-robot
ascend-robot成员
5月29日 评论:
流水线 PR-pipeline_pytorch#27974 已完成
阶段 任务名 状态 详情
编译构建 Build_X86 >>>
Build_ARM >>>
Build_LibTorch_x86 >>>
Build_LibTorch_ARM >>>
Build_X86_torchair 🛑 >>>
Build_ARM_torchair 🛑 >>>
patch_test >>>
恶意代码检查 Antipoison >>>
编码安全与规范检查 CodeCheck >>>
check_error >>>
CodeCheck_lintrunner >>>
开源片段检查 SCA >>>
开发者测试 UT_X86_Part_01 🛑 >>>
UT_X86_Part_02 🛑 >>>
UT_ARM_A3_Part_01 🛑 >>>
UT_ARM_A3_Part_02 🛑 >>>
UT_ARM_A2_Part_01 >>>
UT_ARM_A2_Part_02 >>>
UT_ARM_A2_Part_03 >>>
UT_inductor_Part_01 🛑 >>>
UT_inductor_Part_02 🛑 >>>
UT_inductor_Part_03 🛑 >>>
UT_inductor_Part_04 🛑 >>>
UT_DIST_ARM_Part_01 🛑 >>>
UT_DIST_ARM_Part_02 🛑 >>>
UT_DIST_ARM_Part_03 🛑 >>>
UT_DIST_ARM_Part_04 🛑 >>>
流水线 PR-pipeline_pytorch >>>
likedislike
sunyu-xuan成员
5月30日 评论:

/lgtm

likedislike
liwei386成员
6月1日 评论:

/approve

likedislike
ascend-robotascend-robot成员
6月1日 添加了label:approvedlgtm
ascend-robotascend-robot成员
6月1日 合入了pull request
ascend-robot
ascend-robot成员
6月1日 评论:
流水线 pytorch_gitcode_PR_multiVersion#9763 [ commitID:ec9c160f ] 已完成
likedislike