已合并
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
已合并
Pull Request已成功合入, 合并人@ascend-robot
(感谢 yinglinwei 的贡献)7月14日 创建了 pull request,commit fde6cbf1
atomgit-bot
7月14日 评论:
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.py和test/contrib/test_transfer_to_npu_env.py的test_set_default_device方法中,使用try/finally包裹测试逻辑,确保测试结束后调用torch.set_default_device(None)恢复默认设备,避免影响后续测试用例。


ascend-robot
7月14日 评论:
7月14日 评论:
atomgit-bot
7月14日 评论:
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 中放置一个新对象)。该修复范围精准,测试覆盖也与之匹配。
⚠️ 已识别出整体风险,但无法提取行内评论,请参考整体评估。


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


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


【合入来源】
https://gitcode.com/Ascend/pytorch/issues/1583
【修改方案】
问题: _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。
【资料变更】
不涉及
【接口变更】
不涉及
【功能验证】
【CheckList】