已合并
Bugfix: add tuple support for device_ids in transfer_to_npu #41613
yinglinwei创建于 7月14日
Bugfix: add tuple support for device_ids in transfer_to_npu #41613
已合并
yinglinwei创建于 7月14日
yinglinwei
7月14日

【合入来源】

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

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

【修改方案】

请描述修改内容的具体实现,涉及哪些组件之间进行交互,可以用1、2、3、...进行罗列
如果是需求或者重构类的PR,需要补充详细设计文档(说明上下游组件关系、时序图、类图、DFX能力等内容)

问题: _wrapper_cuda 和 _patch_nametuple 对 device_ids 只处理了 list 类型,tuple 类型会被跳过,cuda→npu 替换不生效。

修复: 在两处各新增 elif isinstance(device_ids, tuple) 分支,将 tuple 转 list 做替换后再转回 tuple 写回 kwargs。同时将 type() is list 改为 isinstance() ,并修复局部变量未回写 kwargs 的 bug。

【资料变更】

请确认是否涉及资料变更。如涉及,需要在PR中体现,并简要说明修改内容。如不涉及,需填写“不涉及”

不涉及

【接口变更】

请确认是否涉及跨代码仓或者客户面可见的接口变更。如涉及,需要详细说明接口以及对应的变更内容,同时需要在资料中体现。如不涉及,需填写“不涉及”

不涉及

【功能验证】

说明测试场景,测试方法。如果本次测试方式与常规单元测试不同,请详细说明您的测试步骤
新增/变更内容是否已新增/适配UT测试用例看护,并补充测试自验证截图

image.png

【CheckList】

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

likedislike
Pull Request已成功合入, 合并人@ascend-robot
(感谢 yinglinwei 的贡献)
Yyinglinwei
7月14日 创建了 pull request,commit fde6cbf1
atomgit-bot
atomgit-bot
7月14日 评论:

变更摘要

本次变更主要修复了 transfer_to_npu 模块中 device_ids 参数仅支持 list 类型、不支持 tuple 类型的问题,同时修复了替换结果未正确写回 kwargs 的潜在 bug,并为测试用例补充了设备默认值恢复逻辑及针对 tuple 类型的单元测试。

主要改动

  • _wrapper_cuda 新增 tuple 支持并修复 kwargs 回写:在 torch_npu/contrib/transfer_to_npu.py 中,对 device_ids 的处理从仅判断 list 类型扩展为同时判断 tuple 类型;tuple 场景下先转为 list 调用 _replace_cuda_to_npu_in_list 处理后再转回 tuple。同时将原来的局部变量赋值改为直接写入 kwargs["device_ids"],确保替换结果正确传递。
  • _patch_nametuple 新增 tuple 支持并修复 kwargs 回写:与 _wrapper_cuda 同步修改,_patch_nametuple 函数中对 device_ids 的处理同样新增 tuple 类型分支,并将替换结果写回 kwargs
  • 新增 test_wrapper_cuda_device_ids_tuple 测试:在 test/contrib/test_transfer_to_npu.py 中新增测试用例,验证 _wrapper_cuda 装饰器对 device_ids 为 tuple(如 ('cuda:0', 'cuda:1'))和 list 两种类型均能正确转换为 NPU 设备标识。
  • 修复测试默认设备副作用:在 test/contrib/test_transfer_to_npu.pytest/contrib/test_transfer_to_npu_env.pytest_set_default_device 方法中,使用 try/finally 包裹测试逻辑,确保测试结束后调用 torch.set_default_device(None) 恢复默认设备,避免影响后续测试用例。
likedislike
atomgit-bot
atomgit-bot
7月14日 评论:

代码审查

经过仔细审查,此 diff 中的更改是正确的,没有发现任何缺陷。

更改摘要

torch_npu/contrib/transfer_to_npu.py

  • _wrapper_cuda(第 188-192 行):将 type(device_ids) == list 替换为 isinstance(device_ids, list),将结果写回 kwargs["device_ids"],并添加了 elif isinstance(device_ids, tuple) 分支以支持元组。由于元组是不可变的,元组分支正确地通过 list() 创建了一个新的可变列表,调用 _replace_cuda_to_npu_in_list,然后使用 tuple() 转换回元组。
  • _patch_nametuple(第 422-426 行):与 _wrapper_cuda 修改模式相同,并始终传入 replace_int=False

test/contrib/test_transfer_to_npu.py

  • test_set_default_device(第 106-110 行):现在将断言包裹在 try/finally 中,以确保即使测试失败也能重置默认设备。
  • test_wrapper_cuda_device_ids_tuple(第 412-425 行):新增测试,验证 _wrapper_cuda 对元组和列表格式的 device_ids 均能正确转换。

test/contrib/test_transfer_to_npu_env.py

  • test_set_default_device(第 107-111 行):与上述相同的 try/finally 修复。

发现的问题数量: 0(P0: 0, P1: 0, P2: 0, P3: 0)

总体风险评估:低。 此更改解决了两个真正的错误:1) device_ids 元组输入被静默忽略;2) 替换后的值未写回 kwargs,对于元组来说这是一个严重问题(因为元组是不可变的,需要在 kwargs 中放置一个新对象)。该修复范围精准,测试覆盖也与之匹配。

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

likedislike
ascend-robotascend-robot成员
7月14日 添加了label:ascend-cla/yes
此处折叠了47条消息 查看更多
ascend-robotascend-robot成员
7月17日 添加了label:approved
chenhao_1209成员
7月17日 评论:

/approve

likedislike
ascend-robotascend-robot成员
7月17日 添加了label:lgtm
ascend-robotascend-robot成员
7月17日 合入了pull request
ascend-robot
ascend-robot成员
7月17日 评论:
流水线 pytorch_gitcode_PR_multiVersion#12752 [ commitID:84426b95 ] 已完成
likedislike