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

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

1. 模型概述

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

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

6. 推理结果

6.1 推理截图

推理截图

6.2 性能对比

指标CPUNPU加速比
平均推理耗时153.8ms38.8ms3.97x

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.0131%0.99999944PASS
2885885True5/50.0196%0.99999883PASS
3885885True5/50.0184%0.99999927PASS
42121True5/50.0150%0.99999948PASS
5885885True5/50.0205%0.99999884PASS

7.3 精度汇总

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

详细对比数据

Test 1: MAE=5.7294e-04 MaxDiff=2.3085e-03 RelErr=0.0131% CosSim=0.99999944 CPU=162.3ms NPU=174.6ms Status=PASS Test 2: MAE=8.1121e-04 MaxDiff=4.5403e-03 RelErr=0.0196% CosSim=0.99999883 CPU=154.6ms NPU=4.8ms Status=PASS Test 3: MAE=7.6600e-04 MaxDiff=4.0278e-03 RelErr=0.0184% CosSim=0.99999927 CPU=151.0ms NPU=4.8ms Status=PASS Test 4: MAE=6.0993e-04 MaxDiff=2.9545e-03 RelErr=0.0150% CosSim=0.99999948 CPU=150.4ms NPU=4.8ms Status=PASS Test 5: MAE=8.6592e-04 MaxDiff=4.3107e-03 RelErr=0.0205% CosSim=0.99999884 CPU=150.4ms NPU=4.8ms Status=PASS

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

8. 文件结构

eca_resnext26ts/
├── 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_resnext26ts', 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 #ResNeXt #timm


适配方: Ascend NPU Adaptation

推理成功证据

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

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

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

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