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

timm/eca_nfnet_l0 在昇腾 NPU 上的适配与推理验证

1. 模型概述

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

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

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_l0', 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_l0' --model_path <model_checkpoint_dir> --num_tests 5

6. 推理结果

6.1 推理截图

推理截图

6.2 性能对比

指标CPUNPU加速比
平均推理耗时285.8ms47.8ms5.98x

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重叠相对误差余弦相似度状态
1902902True5/50.0045%1.00000000PASS
2902902True5/50.0072%0.99999975PASS
32121True5/50.0136%0.99999946PASS
4644644True5/50.0099%0.99999972PASS
52121True5/50.0051%0.99999991PASS

7.3 精度汇总

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

详细对比数据

Test 1: MAE=5.7017e-05 MaxDiff=2.7119e-04 RelErr=0.0045% CosSim=1.00000000 CPU=291.9ms NPU=198.1ms Status=PASS Test 2: MAE=8.4377e-05 MaxDiff=3.9927e-04 RelErr=0.0072% CosSim=0.99999975 CPU=286.1ms NPU=10.1ms Status=PASS Test 3: MAE=1.8817e-04 MaxDiff=9.1973e-04 RelErr=0.0136% CosSim=0.99999946 CPU=284.3ms NPU=10.4ms Status=PASS Test 4: MAE=1.2906e-04 MaxDiff=5.5999e-04 RelErr=0.0099% CosSim=0.99999972 CPU=284.5ms NPU=10.2ms Status=PASS Test 5: MAE=8.9387e-05 MaxDiff=4.3417e-04 RelErr=0.0051% CosSim=0.99999991 CPU=282.0ms NPU=10.0ms Status=PASS

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

8. 文件结构

eca_nfnet_l0/
├── 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_l0', 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 上推理成功。