已开启
[Bug]: 【硬件解耦任务】test_qlinear_packed_params.py 用例运行失败--weights-only 默认加载策略与完整模块反序列化不兼容导致 UnpicklingError,A5 环境复现 #457
kevin_lee1231创建于  5 天前
kevin_lee1231
kevin_lee1231
5 天前 创建

环境信息

环境项 A5
芯片 950PR
CANN 版本 9.1.0
PyTorch 版本 2.15.0a0+git70c2918
torch_npu 版本 2.15.0+git9cd8d1f
Python 3.12.13

🐛 问题描述

1、背景

测试用例重构倡议(pytorch/pytorch#185590)任务 6:test/ao/sparsity/test_qlinear_packed_params.py(上游分类 PR pytorch/pytorch#193177 已合入,交付 PR pytorch-ecosystem!33)的 3 条用例在 NPU 环境运行全部失败。

失败性质为框架兼容性(错误类型:功能不支持/反序列化限制),非解耦代码问题:A/B 实证显示未修改的原始测试源码在相同环境下失败集合逐字一致,单独设置 TORCH_FORCE_NO_WEIGHTS_ONLY_LOAD=1 后 3/3 通过(详见交付报告 4.2/4.3 节)。历史验证(2026-09-14)A2(910B3)与 A5(950PR)双环境均失败;2026-10-09 在 A5 新环境(torch 2.15.0a0+git70c2918 + torch_npu 2.15.0+git9cd8d1f)复现,报错依旧。

2、复现步骤

前置条件:venv(torch + torch_npu)环境。

cd pytorch/test/ao/sparsity
python -m unittest test_qlinear_packed_params -v

注意:该测试文件无 __main__ 入口,需通过 python -m unittest 或 pytest 运行。

涉及用例(3 条,Node ID):

  • TestQlinearPackedParams::test_qlinear_packed_params_fbgemm
  • TestQlinearPackedParams::test_qlinear_packed_params_fbgemm_qnnpack_cross_compatibility
  • TestQlinearPackedParams::test_qlinear_packed_params_qnnpack

3、报错日志

3 条用例全部报同一错误(ERROR,Ran 3 tests ... FAILED (errors=3)):

_pickle.UnpicklingError: Unsupported global: GLOBAL torch.ao.nn.sparse.quantized.dynamic.linear.Linear was not an allowed global by default. Please use `torch.serialization.add_safe_globals([torch.ao.nn.sparse.quantized.dynamic.linear.Linear])` or the `torch.serialization.safe_globals([torch.ao.nn.sparse.quantized.dynamic.linear.Linear])` context manager to allowlist this global if you trust this class/function.

错误关键帧:

File ".../torch/_weights_only_unpickler.py", line 374, in load
    raise UnpicklingError(...)

4、原因分析

错误类型为 _pickle.UnpicklingError,源于 torch.load weights-only 默认加载策略与完整模块反序列化写法不兼容:

  • 测试语义:3 条用例均通过 torch.save(lin, ...) 保存完整的稀疏量化 Linear 模块(torch.ao.nn.sparse.quantized.dynamic.linear.Linear),再用未显式指定 weights_only 的 torch.load(...) 读取,验证打包参数的序列化/反序列化与 FBGEMM/QNNPACK 跨引擎兼容性;该写法在 CPU/CUDA 的社区 CI 中通过;
  • NPU 环境实际行为:当前 PyTorch 版本 torch.load 默认 weights_only=True,该模块类型不在默认允许列表中,加载即抛 UnpicklingError;
  • 降级链路:torch.save(完整模块) → torch.load()(默认 weights-only) → _weights_only_unpickler 拒绝未授权全局 → 3 条用例 ERROR;
  • 已排除因素:非解耦分类标注引入(未修改源码 A/B 失败一致);非 FBGEMM/QNNPACK 缺失(torch.backends.quantized.supported_engines 含 qnnpack/fbgemm)。

修复方向分析(供参考):

方向 1:环境侧兼容(torch_npu / 运行环境)——将 torch.ao.nn.sparse.quantized.dynamic.linear.Linear 及稀疏量化模块相关类型纳入反序列化安全全局列表(torch.serialization.add_safe_globals),或在环境初始化中提供兼容加载配置;对用户自行加载完整模块的场景可给出显式报错提示。

方向 2:上游测试语义适配(pytorch 侧)——测试以显式 weights_only=False(或 safe_globals 上下文)调用 torch.load,使序列化语义显式化;该改动涉及社区测试语义,需上游社区评审。

在修复前,可通过 TORCH_FORCE_NO_WEIGHTS_ONLY_LOAD=1 临时处置(诊断验证 3/3 通过),但该变量不应作为默认运行方式。

关联信息

条目 链接 / 说明
任务来源 测试用例重构倡议 pytorch/pytorch#185590,任务 6
上游分类 PR https://github.com/pytorch/pytorch/pull/193177(已合入)
交付 PR https://gitcode.com/Ascend/pytorch-ecosystem/pull/33(已合入)
交付报告 01_tasks/2026/test_case_refactoring/task_6_test_qlinear_packed_params/test_qlinear_packed_params解耦交付报告.md(4.2/4.3 节含完整失败统计与分析)
归类 场景四(无需解耦改造,NPU 测试失败),错误类型:框架兼容性;非解耦代码问题,由华为方后续修复

标签建议

标签类型 建议标签
内容类型 bug
模块归属 torch.serialization / torch.ao.nn.sparse.quantized(weights-only 反序列化策略兼容)
优先级 medium priority(社区原生稀疏量化序列化用例在 NPU 环境全量失败)

欢迎加入社区,感谢您对社区的贡献 🎉

likedislike
TorchNPU-BotTorchNPU-Bot
5 天前 添加了label:help-wantedbot-triagedevent: accelerator-agnostic
TorchNPU-Bot
TorchNPU-Bot
5 天前 评论:

检测到社区任务相关 issue,自动添加标签:event: accelerator-agnostic、help-wanted

likedislike
ascend-robotascend-robot成员
5 天前 添加了label:bug
kevin_lee1231kevin_lee1231
5 天前 关联了pull request:【社区任务】Ascend for PyTorch测试用例解耦(6) 交付件补充 NPU 失败 issue 链接
kevin_lee1231kevin_lee1231
5 天前 修改了issue 的描述