已开启
【测试用例解耦(9)】test_fake_quantize.py 在 Ascend NPU 环境运行 2 个用例失败(test_forward / test_backward,经定位为社区上游用例缺陷) #461
olpk创建于  12 天前
olpk
olpk
12 天前 创建

环境信息

  • 操作系统:Linux(A2/A3:aarch64;A5:x86_64)
  • 昇腾硬件信息:Ascend 910B3(A2/A3 平台)、Ascend 950PR_9579(A5 平台)
  • CANN 软件版本:9.1.0(V100R001C11SPC001B243,A2/A3)、9.0.0(V100R001C10SPC001B250,A5)
  • 安装的对应软件版本:
    • Python:3.11.15(A2/A3)、3.12.13(A5)
    • torch:2.9.0+cpu(A2/A3)、2.12.0+cpu(A5)
    • torch_npu:2.9.0.post6(A2/A3)、2.12.0.post2(A5)
    • npu-smi:26.1.1(A2/A3)、25.7.rc1.10(A5)
    • torch_npu.npu.is_available():True(两平台一致)

🐛 问题描述

问题现象

目标测试文件:test/quantization/core/experimental/test_fake_quantize.py(TestFakeQuantize 类,共 4 个用例)。

在 Ascend NPU 软件栈环境下运行该社区原生测试文件,结果为 2 passed / 2 failed:

结果 用例
PASS test_fake_calc_qparams、test_forward_exception
FAIL test_forward、test_backward

A2/A3(Ascend 910B3 + CANN 9.1.0 + torch 2.9.0 / torch_npu 2.9.0.post6)与 A5(Ascend 950PR + CANN 9.0.0 + torch 2.12.0 / torch_npu 2.12.0.post2)两个平台结果逐字一致(同为 2 passed / 2 failed),pytest --collect-only 均为 4 tests collected。

该文件无任何硬件耦合:未使用 @onlyCUDA / @deviceCountAtLeast 等设备装饰器,未写死 cuda 设备字符串,未调用 .cuda() 或 torch.cuda.*,未使用 pytest is_cuda 参数,未接收 device 参数,Tensor 默认创建在 CPU 上,用例数值计算全部发生在 CPU。按社区分类框架属于「无设备参数化,Tensor 默认在 CPU」类型(HardwareClassification.GENERIC)。

复现步骤

git clone https://github.com/pytorch/pytorch.git
cd pytorch/test/quantization/core/experimental

# 全量运行(与社区原文件运行方式一致)
python test_fake_quantize.py -v

# 用例收集
python -m pytest test_fake_quantize.py --collect-only -q

环境说明:910 环境的 torch 2.9.0 已移除 torch.ao.quantization.experimental 模块,验证时以社区 main 分支同名模块补齐后运行,测试文件本身未做任何修改。

实际结果

(1)test_forward —— TypeError: APoTFakeQuantize.forward() takes 2 positional arguments but 3 were given

Traceback (most recent call last):
  File "/usr/local/python3.12.13/lib/python3.12/unittest/case.py", line 58, in testPartExecutor
    yield
  File "/usr/local/python3.12.13/lib/python3.12/unittest/case.py", line 634, in run
    self._callTestMethod(testMethod)
  File "/usr/local/python3.12.13/lib/python3.12/unittest/case.py", line 589, in _callTestMethod
    if method() is not None:
  File "/workspace/PY/pytorch-task9/test/quantization/core/experimental/test_fake_quantize.py", line 64, in test_forward
    X_reduced_precision_fp = apot_fake.forward(torch.clone(X), False)
TypeError: APoTFakeQuantize.forward() takes 2 positional arguments but 3 were given

(2)test_backward —— TypeError: only integer tensors of a single element can be converted to an index

Traceback (most recent call last):
  File "/usr/local/python3.12.13/lib/python3.12/unittest/case.py", line 58, in testPartExecutor
    yield
  File "/usr/local/python3.12.13/lib/python3.12/unittest/case.py", line 634, in run
    self._callTestMethod(testMethod)
  File "/usr/local/python3.12.13/lib/python3.12/unittest/case.py", line 589, in _callTestMethod
    if method() is not None:
  File "/workspace/PY/pytorch-task9/test/quantization/core/experimental/test_fake_quantize.py", line 98, in test_backward
    gradcheck(fake_quantize_function.apply, (input, alpha, gamma, quantization_levels, level_indices), atol=1e-4)
  File "/workspace/PY/venv_npu/lib/python3.12/site-packages/torch/autograd/gradcheck.py", line 2104, in gradcheck
    return _gradcheck_helper(**args)
  File "/workspace/PY/venv_npu/lib/python3.12/site-packages/torch/autograd/gradcheck.py", line 2133, in _gradcheck_helper
    _gradcheck_real_imag(
  File "/workspace/PY/venv_npu/lib/python3.12/site-packages/torch/autograd/gradcheck.py", line 1517, in _gradcheck_real_imag
    gradcheck_fn(
  File "/workspace/PY/venv_npu/lib/python3.12/site-packages/torch/autograd/gradcheck.py", line 1652, in _slow_gradcheck
    analytical = _check_analytical_jacobian_attributes(
  File "/workspace/PY/venv_npu/lib/python3.12/site-packages/torch/autograd/gradcheck.py", line 798, in _check_analytical_jacobian_attributes
    vjps1 = _compute_analytical_jacobian_rows(vjp_fn, output.clone())
  File "/workspace/PY/venv_npu/lib/python3.12/site-packages/torch/autograd/gradcheck.py", line 916, in _compute_analytical_jacobian_rows
    grad_inputs = vjp_fn(grad_out_base)
  File "/workspace/PY/venv_npu/lib/python3.12/site-packages/torch/autograd/gradcheck.py", line 789, in vjp_fn
    return torch.autograd.grad(
  File "/workspace/PY/venv_npu/lib/python3.12/site-packages/torch/autograd/__init__.py", line 530, in grad
    result = _engine_run_backward(
  File "/workspace/PY/venv_npu/lib/python3.12/site-packages/torch/autograd/graph.py", line 882, in _engine_run_backward
    return Variable._execution_engine.run_backward(...)
  File "/workspace/PY/venv_npu/lib/python3.12/site-packages/torch/autograd/function.py", line 317, in apply
    return user_fn(self, *args)
  File "/workspace/PY/venv_npu/lib/python3.12/site-packages/torch/ao/quantization/experimental/fake_quantize_function.py", line 35, in backward
    return grad_output * mask
TypeError: only integer tensors of a single element can be converted to an index

说明:上述报错堆栈全部位于 unittest / torch 内部,不含任何 torch_npu 栈帧。

定位结论(该失败非 NPU 平台问题)

# 证据 内容
1 纯 CPU 最小复现 用仅含 torch 的最小脚本(不调用任何 NPU API)在 CPU 路径上复现出完全相同的两个 TypeError
2 静态代码证据 test_forward 调用 forward(X, False)(2 个位置参数),而社区实现为 forward(self, X)(仅 1 个位置参数),API 签名不匹配,属纯 Python 层错误
3 栈帧检查 报错 traceback 全在 torch 内部,无任何 torch_npu 帧
4 双平台一致性 910B3(torch 2.9.0 + CANN 9.1.0)与 950PR(torch 2.12.0 + CANN 9.0.0)结果逐字一致
5 版本无关性 upstream main 与 2.6.0 的 fake_quantize_function.py 实现逐字一致,测试与实现的 API 不匹配在社区 main 分支上即存在
6 社区 CI 未覆盖 该文件不在社区 CI 覆盖范围(tools/testing/discover_tests.py blocklist 排除 quantization 目录、test/test_quantization.py 聚合入口未 import 本文件)

补充:test_forward_exception 之所以「通过」,是因为其 assertRaises(Exception) 恰好捕获了 test_forward 中的同一个 TypeError。

期望结果

社区原生测试文件在 NPU 软件栈环境下运行结果应与 CPU/CUDA 环境一致,即 4 个用例全部通过。

关联信息

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

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

likedislike
olpkolpk
12 天前 修改了issue 的描述
TorchNPU-BotTorchNPU-Bot
12 天前 添加了label:bot-triaged;删除了label:triage-review
TorchNPU-Bot
TorchNPU-Bot
12 天前 评论:

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

likedislike