e
gcw_GSiqzzLf/eca_resnet33ts-npu
模型介绍文件和版本Pull Requests讨论分析
下载使用量0

timm/eca_resnet33ts.ra2_in1k 在昇腾 NPU 上的适配与推理验证

1. 模型概述

本文档记录 timm/eca_resnet33ts.ra2_in1k 在华为昇腾 Ascend 910B NPU 上的适配、推理与精度测试。

  • 模型架构: eca_resnet33ts
  • 输入尺寸: [3, 256, 256]
  • 类别数: 1000
  • 任务类型: 图像分类 (ImageNet-1K 1000类)
  • 模型框架: PyTorch (timm)
  • 原始模型地址: https://www.modelscope.cn/models/timm/eca_resnet33ts.ra2_in1k

2. 验证环境

组件版本
CANN8.5.1
torch2.9.0
torch_npu2.9.0
timm1.0.27
torchvision0.24.0
modelscope1.35.3
  • NPU: Ascend 910B (32GB HBM)
  • 操作系统: Linux 5.10.0 aarch64

3. 环境准备

# 使用清华 PyPI 镜像安装依赖
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple torch torch_npu timm torchvision pillow numpy modelscope

确保 CANN 和 torch_npu 已正确安装,NPU 设备可用:

python3 -c "import torch; print('NPU:', torch.npu.is_available(), 'Device:', torch.npu.get_device_name(0))"

4. 模型下载

from modelscope.hub.snapshot_download import snapshot_download
snapshot_download('timm/eca_resnet33ts.ra2_in1k', cache_dir='./model')

5. 推理方法

方式一:直接推理

# NPU 推理
python3 inference.py --device npu --model_path <model_checkpoint_dir>

# CPU 推理
python3 inference.py --device cpu --model_path <model_checkpoint_dir>

方式二:CPU vs NPU 精度对比

python3 compare_cpu_npu.py --model_name 'timm/eca_resnet33ts.ra2_in1k' --model_path <model_checkpoint_dir> --num_tests 5

6. 推理结果

6.1 推理截图

推理截图

6.2 性能对比

指标CPUNPU加速比
平均推理耗时228.5ms40.1ms5.70x

NPU 推理使用 torch.npu.synchronize() 精确计时,首次推理含模型加载和编译预热,后续推理为稳定态延迟。

7. CPU/NPU 精度对比

7.1 测试方法

在 CPU 和 NPU 上分别加载同一模型权重,使用相同的随机输入张量(5个不同随机种子),运行推理后对比输出 logits。

评估指标:MAE(平均绝对误差)、最大差异、余弦相似度、相对误差百分比、Top-1 匹配率。

7.2 测试结果

测试编号CPU Top-1NPU Top-1Top-1 一致Top-5重叠相对误差余弦相似度状态
1885885True5/50.0078%0.99999955PASS
2111111True5/50.0087%0.99999951PASS
3885885True5/50.0080%0.99999962PASS
4885885True5/50.0081%0.99999968PASS
5885885True5/50.0077%0.99999963PASS

7.3 精度汇总

指标数值
测试用例数5
Top-1 匹配5/5
平均 MAE3.251568e-04
平均相对误差0.0081%
平均余弦相似度0.99999960
精度要求NPU vs CPU 误差 < 1%
精度结论✅ 通过
总体状态PASS

详细对比数据

Test 1: MAE=3.2621e-04 MaxDiff=1.3750e-03 RelErr=0.0078% CosSim=0.99999955 CPU=236.0ms NPU=177.4ms Status=PASS Test 2: MAE=3.6460e-04 MaxDiff=3.7673e-03 RelErr=0.0087% CosSim=0.99999951 CPU=228.7ms NPU=5.9ms Status=PASS Test 3: MAE=3.1516e-04 MaxDiff=1.3067e-03 RelErr=0.0080% CosSim=0.99999962 CPU=225.7ms NPU=5.8ms Status=PASS Test 4: MAE=3.2312e-04 MaxDiff=1.4179e-03 RelErr=0.0081% CosSim=0.99999968 CPU=226.5ms NPU=5.6ms Status=PASS Test 5: MAE=2.9670e-04 MaxDiff=1.3895e-03 RelErr=0.0077% CosSim=0.99999963 CPU=225.7ms NPU=5.6ms Status=PASS

精度测试结论:NPU 与 CPU 推理结果误差为 0.0081%,小于 1%,符合精度要求。

8. 文件结构

eca_resnet33ts/
├── inference.py                 # NPU/CPU 推理脚本
├── compare_cpu_npu.py           # CPU vs NPU 精度对比脚本
├── requirements.txt             # 依赖清单
├── accuracy_report.json         # 精度测试报告
├── terminal_screenshot.png      # 推理运行截图
└── readme.md                    # 本文档

9. NPU 适配说明

适配要点

  1. 使用 torch_npu 将 PyTorch 模型迁移至 Ascend NPU
  2. 利用 transfer_to_npu 自动完成 CUDA 到 NPU 的 API 映射
  3. 模型权重加载到 NPU 设备后直接推理,无需修改模型结构
  4. 通过 CPU/NPU 输出对比确保推理精度一致

核心推理代码

import torch
import timm
import torch_npu

# 加载模型
device = torch.device("npu:0" if torch.npu.is_available() else "cpu")
model = timm.create_model('eca_resnet33ts', pretrained=False, num_classes=1000)
state_dict = torch.load("pytorch_model.bin", map_location="cpu", weights_only=True)
model.load_state_dict(state_dict, strict=True)
model = model.to(device)
model.eval()

# 推理
with torch.no_grad():
    output = model(input_tensor.to(device))
probs = torch.nn.functional.softmax(output[0], dim=0)
top5 = torch.topk(probs, k=5)

10. 注意事项

  1. 首次导入 torch_npu 会有设备替换警告,属正常现象
  2. NPU 推理前需确保 CANN 环境正确配置
  3. 建议使用 torch.no_grad() 上下文进行推理以节省显存
  4. 推理完成后调用 torch.npu.empty_cache() 释放 NPU 显存
  5. 多个模型串行测试时,每个模型后需主动释放资源

11. 标签

#NPU #Ascend #CV #图像分类 #ECA #ResNet #timm


适配方: Ascend NPU Adaptation

推理成功证据

本仓库提供完整的推理脚本,支持 CPU 和 NPU 双平台推理:

# NPU 推理
python3 inference.py --device npu

# CPU 推理
python3 inference.py --device cpu

推理完成后会输出推理结果和耗时,表明模型在 NPU 上推理成功。