Pull Request已成功合入, 合并人@ascend-robot
(感谢 wuyouqi1 的贡献)变更摘要
本次 PR 恢复了之前被回退的修改,修复 torch_npu.utils.load 在 legacy(非 zip)加载分支中 map_location 参数未被正确透传的问题。核心改动是将 _legacy_load 调用中的硬编码 "cpu" 替换为外部传入的 map_location,确保 torch.compile 缓存加载场景下 tensor 能被正确映射到目标设备。同时恢复了对应的 test_legacy_load_maplocation 单测用例,覆盖 None、Callable、Dict 三种 map_location 类型的映射行为。
主要改动
- 修复
map_location透传: 在torch_npu/utils/serialization.py的load函数中,将_legacy_load(opened_file, "cpu", ...)改为_legacy_load(opened_file, map_location, ...),使 legacy 加载路径按调用方指定的map_location正确映射设备,而非固定加载到 CPU。 - 恢复
test_legacy_load_maplocation测试用例: 在test/npu/test_serialization.py中重新添加该测试方法,通过@parametrize("map_kind", ["none", "callable", "dict"])覆盖三种map_location类型(None、可调用对象、字典),验证 legacy 加载后 tensor 设备均为npu:0。 - 引入参数化测试支持: 新增
from torch.testing._internal.common_utils import parametrize, instantiate_parametrized_tests导入,并在测试类末尾添加instantiate_parametrized_tests(TestSerialization)调用,为参数化测试方法自动生成实例。


代码审查
审查总结
对 2 个变更文件逐一完成审查:
| 文件 | 审查结果 |
|---|---|
torch_npu/utils/serialization.py |
发现 1 个 P3 问题(警告信息与实际行为不一致) |
test/npu/test_serialization.py |
未发现问题 |
按优先级统计:P0: 0, P1: 0, P2: 0, P3: 1
整体风险评估:此次变更风险较低。核心修复(第 339 行将 "cpu" 改为 map_location)正确解决了 torch.compile 缓存加载时 NPU tensor 被错误映射到 CPU 的问题,测试用例覆盖了 None、Callable、Dict 三种 map_location 类型。仅存在一个次要问题:第 315–320 行的警告信息声称 Callable/Dict 类型的 map_location 不受支持且所有 tensor 将被加载到 CPU,但修改后这些类型已被实际透传给 _legacy_load 并正确工作,警告内容与行为不一致,建议更新或调整警告的作用域。
⚠️ 已识别出整体风险,但无法提取行内评论,请参考整体评估。


/lgtm


Pull Request 已合并或已关闭。
If you want to solve this problem, you can click here to do it in the FAQs.




【合入来源】
关联 issue: https://gitcode.com/Ascend/pytorch/issues/3005 (Fixes #3005)
恢复 torch_npu.utils.load 在 legacy(非 zip)加载分支对
map_location的透传,修复 torch.compile 缓存加载在 NPU 上的功能问题。此前该改动被fix: Revert "modifty torch_npu.utils.load for torch.compile cache use"回退,本次恢复原始修改。【修改方案】
torch_npu/utils/serialization.py的load函数中,当走 legacy 加载分支且未命中(torch.device, str)类型分支时,将_legacy_load(opened_file, "cpu", ...)改为_legacy_load(opened_file, map_location, ...),使加载结果按map_location正确映射到目标设备,保证 torch.compile 缓存场景下的加载行为正确。test/npu/test_serialization.py恢复test_legacy_load_maplocation用例,覆盖 legacy load 的map_location映射。本修改等价于恢复 "modifty torch_npu.utils.load for torch.compile cache use" 的原始改动,仅涉及上述两个文件。
【资料变更】
不涉及
【接口变更】
不涉及
【功能验证】
torch_npu.utils.load在 legacy 分支下的map_location映射;torch.compile 缓存加载。test/npu/test_serialization.py::TestSerialization::test_legacy_load_maplocation。test_legacy_load_maplocationUT 用例看护。【CheckList】