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

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

1. 模型概述

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

  • 模型架构: eca_nfnet_l2
  • 输入尺寸: [3, 320, 320]
  • 类别数: 1000
  • 任务类型: 图像分类 (ImageNet-1K 1000类)
  • 模型框架: PyTorch (timm)
  • 原始模型地址: https://www.modelscope.cn/models/timm/eca_nfnet_l2.ra3_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_nfnet_l2.ra3_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_nfnet_l2.ra3_in1k' --model_path <model_checkpoint_dir> --num_tests 5

6. 推理结果

6.1 推理截图

推理截图

6.2 性能对比

指标CPUNPU加速比
平均推理耗时1193.6ms61.9ms19.28x

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重叠相对误差余弦相似度状态
12121True5/50.0055%0.99999990PASS
22121True5/50.0058%0.99999992PASS
32121True5/50.0088%0.99999966PASS
42121True5/50.0070%1.00000000PASS
52121True5/50.0075%0.99999990PASS

7.3 精度汇总

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

详细对比数据

Test 1: MAE=7.0053e-05 MaxDiff=2.8864e-04 RelErr=0.0055% CosSim=0.99999990 CPU=1199.5ms NPU=201.4ms Status=PASS Test 2: MAE=8.2001e-05 MaxDiff=4.0838e-04 RelErr=0.0058% CosSim=0.99999992 CPU=1180.3ms NPU=27.1ms Status=PASS Test 3: MAE=1.1982e-04 MaxDiff=4.2023e-04 RelErr=0.0088% CosSim=0.99999966 CPU=1196.3ms NPU=27.1ms Status=PASS Test 4: MAE=8.9480e-05 MaxDiff=4.3756e-04 RelErr=0.0070% CosSim=1.00000000 CPU=1194.2ms NPU=27.4ms Status=PASS Test 5: MAE=9.4300e-05 MaxDiff=4.4051e-04 RelErr=0.0075% CosSim=0.99999990 CPU=1197.6ms NPU=26.5ms Status=PASS

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

8. 文件结构

eca_nfnet_l2_ra3/
├── 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_nfnet_l2', 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 #NFNet #timm


适配方: Ascend NPU Adaptation

推理成功证据

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

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

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

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