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

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

1. 模型概述

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

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

6. 推理结果

6.1 推理截图

推理截图

6.2 性能对比

指标CPUNPU加速比
平均推理耗时159.2ms46.7ms3.41x

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重叠相对误差余弦相似度状态
1363363True5/50.0221%0.99999927PASS
26565True5/50.0183%0.99999904PASS
36565True5/50.0170%0.99999907PASS
46565True5/50.0150%0.99999913PASS
56565True5/50.0151%0.99999904PASS

7.3 精度汇总

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

详细对比数据

Test 1: MAE=7.1391e-04 MaxDiff=3.2797e-03 RelErr=0.0221% CosSim=0.99999927 CPU=168.0ms NPU=209.0ms Status=PASS Test 2: MAE=5.1128e-04 MaxDiff=1.9797e-03 RelErr=0.0183% CosSim=0.99999904 CPU=159.4ms NPU=6.0ms Status=PASS Test 3: MAE=4.9124e-04 MaxDiff=2.1815e-03 RelErr=0.0170% CosSim=0.99999907 CPU=155.6ms NPU=6.0ms Status=PASS Test 4: MAE=4.1943e-04 MaxDiff=2.4246e-03 RelErr=0.0150% CosSim=0.99999913 CPU=155.9ms NPU=6.2ms Status=PASS Test 5: MAE=4.4391e-04 MaxDiff=2.4271e-03 RelErr=0.0151% CosSim=0.99999904 CPU=157.1ms NPU=6.0ms Status=PASS

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

8. 文件结构

eca_botnext26ts_256/
├── 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_botnext26ts_256', 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 #BotNet #timm


适配方: Ascend NPU Adaptation

推理成功证据

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

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

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

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