已开启
[Bug]: [测试用例解耦][A2/aarch64] test_bias_correction_eager 在量化权重预打包阶段报 unknown architecure #459
coconut创建于  5 天前
coconut
coconut
5 天前 创建

环境信息

设备 Ascend 910B3(A2),设备健康状态正常
CPU 架构 aarch64
操作系统 openEuler 24.03 LTS-SP3
npu-smi 版本 26.1.1
CANN 9.1.0-beta.3
Python 3.12.13
pytest 9.1.1
PyTorch 2.13.0a0+git636bc91
torch_npu 2.13.0+git46936d1
Python 环境路径 /opt/setup/npu-pytorch-setup/venv_npu

🐛 问题描述

二、问题描述

1. 任务背景

  • 任务编号:【发布前填写真实编号】。
  • 目标文件:test/quantization/eager/test_bias_correction_eager.py。
  • 上游 PR:https://github.com/pytorch/pytorch/pull/195989
  • 最终修改:导入 HardwareClassification,为 TestBiasCorrectionEager 添加 hw_classification = HardwareClassification.GENERIC。
  • 最终版本未添加 device 参数、张量设备迁移或 instantiate_device_type_tests,保持原有测试行为。

该测试类包含 test_conv_chain、test_linear_chain 两个用例,验证 eager 量化的偏置校正。虽然在配有 NPU 的容器中执行,但目标用例仍按原有逻辑使用 CPU 量化后端;GENERIC 分类不表示将量化运算移到 NPU。

2. 实际现象

A2 环境中,NPU 张量创建、加法、同步及结果拷回 CPU 均成功,但两个目标用例在量化权重预打包阶段失败,报相同错误:

RuntimeError: unknown architecure

architecure 为实际报错原文中的拼写,本文保留原样。

用例 结果 失败操作
test_conv_chain FAILED quantized.conv2d_prepack
test_linear_chain FAILED quantized.linear_prepack

主验证结果:2 failed,5 warnings,耗时 32.49s,退出码 1。两个用例均未跳过;失败发生在模型量化转换/预打包阶段,尚未完成偏置校正结果断言。

三、复现步骤

1. 完整目标用例验证

在已配置 CANN、安装 torch_npu 并应用附件枚举兼容补丁的环境中执行:

cd /workspace/pytorch831
/opt/setup/npu-pytorch-setup/venv_npu/bin/python -u \
  /workspace/npu_decouple_validation_20261009/run_a2_bias_validation.py
echo "EXIT_CODE=$?"

上述脚本作为附件提供,依次执行以下操作:

  1. 导入 torch、torch_npu、pytest,打印版本和量化后端信息。
  2. 查询 NPU 可用性及设备数量。
  3. 创建 torch.ones(2, 2, device='npu:0'),执行加法,将结果拷回 CPU,并同步。
  4. 通过 pytest.main 运行目标文件,参数为 -v -rs --tb=long。

附件路径是本次验证实际路径。其他环境复现时,应先放置附件脚本和目标源码,并相应调整路径;不要求使用相同目录名。

2. 不加载 torch_npu 的最小 CPU 复现

为区分 NPU 初始化问题与 CPU 量化后端问题,额外关闭设备后端自动加载,执行以下最小脚本:

import platform
import sys
import traceback
import torch

print('ARCH:', platform.machine(), flush=True)
print('TORCH:', torch.__version__, flush=True)
print('TORCH_NPU_LOADED:', 'torch_npu' in sys.modules, flush=True)
print('QUANTIZED_ENGINE:', torch.backends.quantized.engine, flush=True)
print('SUPPORTED_ENGINES:', torch.backends.quantized.supported_engines, flush=True)
print('CPU_ONLY_REPRO_NO_NPU_TENSORS', flush=True)
weight = torch.quantize_per_tensor(torch.ones(1, 1), 1.0, 0, torch.qint8)
print('WEIGHT_DEVICE:', weight.device, flush=True)
try:
    torch.ops.quantized.linear_prepack(weight, None)
    print('PREPACK_OK', flush=True)
except Exception:
    traceback.print_exc()
    sys.exit(1)

实际执行命令:

TORCH_DEVICE_BACKEND_AUTOLOAD=0 \
/opt/setup/npu-pytorch-setup/venv_npu/bin/python -u \
  /workspace/npu_decouple_validation_20261009/repro_a2_fbgemm.py
echo "EXIT_CODE=$?"

该脚本只创建 CPU 量化张量,不创建 NPU 张量,仍复现同一异常。

四、关键日志

以下为原始日志摘录;完整输出见附件。

1. NPU 基础运算正常

NPU_SMOKE [[2.0, 2.0], [2.0, 2.0]]

主验证同时确认 NPU 可用,设备数量为 1,NPU 同步成功。

2. 卷积用例失败位置

/opt/setup/npu-pytorch-setup/pytorch/torch/ao/nn/quantized/modules/conv.py:567

失败链路进入 torch.ops.quantized.conv2d_prepack,最终抛出 RuntimeError: unknown architecure。完整调用栈见主测试日志。

3. 最小 CPU 复现输出

ARCH: aarch64
TORCH: 2.13.0a0+git636bc91
TORCH_NPU_LOADED: False
QUANTIZED_ENGINE: x86
SUPPORTED_ENGINES: ['qnnpack', 'x86', 'fbgemm']
CPU_ONLY_REPRO_NO_NPU_TENSORS
WEIGHT_DEVICE: cpu

原始日志中另有弃用警告;此处省略警告,仅保留异常栈:

Traceback (most recent call last):
  File "/workspace/npu_decouple_validation_20261009/repro_a2_fbgemm.py", line 15, in <module>
    torch.ops.quantized.linear_prepack(weight, None)
  File "/opt/setup/npu-pytorch-setup/pytorch/torch/_ops.py", line 1279, in __call__
    return self._op(*args, **kwargs)
RuntimeError: unknown architecure

五、对照验证与初步原因分析

1. 对照验证

对照项 实际结果 能说明什么及限制
A2 原运行时自带的原始测试文件(未添加分类标签) 两个用例同样失败,耗时 17.14s 异常在原测试中也存在;不是完整最终源码环境的基线测试
A2 最终目标文件 + 枚举兼容补丁 2 failed,32.49s 分类标注后仍为同一预打包异常
A2 禁止自动加载后端、未导入 torch_npu 的最小 CPU 复现 linear_prepack 同样失败 该异常不依赖 NPU 张量或 torch_npu 加载
A2 独立 NPU 基础运算 成功 NPU 基础可用;不代表所有 NPU 算子均正常
CPU x86_64、最终源码编译环境 目标文件 2 passed,19.81s 最终目标文件可在此 CPU 环境通过;该次完整输出为用户提供记录
CPU x86_64、独立基线/最终文件复核 基线 2 passed,2.85s;最终 2 passed,2.78s 收集到的两个测试 ID 一致;属于独立快照复核
A5/950PR、x86_64,旧运行时 + 同类枚举兼容补丁 NPU 基础运算成功;目标文件 2 passed,1.93s 支持平台差异分析;目标用例仍是 CPU 量化逻辑

跨平台记录的架构、运行时版本和验证方式并非全部一致,不能仅据通过/失败对比就断言所有 aarch64 环境都不支持该操作。

2. 已确认事实

  • A2 当前构建在 CPU 量化预打包阶段抛出架构相关异常。
  • 当前量化引擎为 x86,支持列表包含 qnnpack、x86、fbgemm。
  • 原测试的 skipIfNoFBGEMM 根据支持列表判断,列表包含 fbgemm 时不会跳过;这一判断不能证明当前 CPU 架构上的预打包实际可执行。
  • 原始测试文件及不加载 torch_npu 的 CPU 最小复现均能触发异常。
  • 本次未观察到添加 HardwareClassification.GENERIC 引入不同失败现象。

3. 初步判断及待确认事项

证据指向当前 A2/aarch64 构建的 CPU 量化后端架构兼容性或后端可用性声明问题。FBGEMM 相关预打包路径值得重点排查,但目前尚未通过后端源码逐层定位确认具体抛错分支。

不能将此问题直接表述为已确认的 CANN/NPU 量化算子故障,也不能据此认定更改硬件分类标签即可修复。需要维护者进一步确认构建选项、CPU ISA 支持、量化后端选择和支持列表注册是否一致。

likedislike
TorchNPU-BotTorchNPU-Bot
5 天前 添加了label:triage-review
TorchNPU-Bot
TorchNPU-Bot
5 天前 评论:

issue待分派,添加triage-review标签

likedislike
ascend-robotascend-robot成员
5 天前 添加了label:bug
coconutcoconut
5 天前 关联了pull request:【社区任务】Ascend for PyTorch测试用例解耦(15)交付件
TorchNPU-BotTorchNPU-Bot
5 天前 添加了label:bot-triaged;删除了label:triage-review
TorchNPU-Bot
TorchNPU-Bot
5 天前 评论:

检测到当前 issue 已关联 PR,自动添加标签:bot-triaged

likedislike