m0_74196153/test_nfnet.r160_in1k-npu
模型介绍文件和版本Pull Requests讨论分析
下载使用量0

test_nfnet.r160_in1k-NPU

1. 简介

本项目在 昇腾 NPU(Ascend)上适配了 test_nfnet.r160_in1k 图像分类模型。NFNet(Normalizer-Free ResNet)是一种无归一化层的残差网络架构,在保持训练稳定性的同时去除了 Batch Normalization,从而减少计算开销。该模型为 NFNet 的轻量测试版本,参数量 0.4M,输入尺寸 160x160,基于 ImageNet-1k 预训练。

原始模型地址:timm/test_nfnet.r160_in1k

2. 任务类型

  • 任务类型:图像分类(Image Classification)
  • 模型框架:PyTorch (timm 1.0.27)
  • 输入格式:图像 (3×160×160),RGB,归一化 mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5]
  • 输出格式:1000 类 ImageNet 分类 logits

3. 依赖环境

组件版本
Python3.11.14
PyTorch2.9.0
torch_npu2.9.0.post1
timm1.0.27
torchvision0.24.0
Ascend CANN8.5.1
操作系统Linux aarch64

4. NPU 适配说明

该模型基于 timm 框架,使用纯 PyTorch 算子,无需修改模型源代码即可在昇腾 NPU 上运行。适配过程仅需:

  1. 使用 timm.create_model() 加载预训练权重
  2. 通过 model.to("npu") 将模型迁移至 NPU 设备
  3. 将输入张量移至 NPU 设备执行推理

5. 环境准备

# 安装依赖
pip install torch torchvision timm Pillow numpy requests

# 验证 NPU 可用性
python3 -c "import torch; print('NPU available:', torch.npu.is_available())"

6. 推理命令

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

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

# 使用指定图片推理
python3 inference.py --device npu --image /path/to/image.jpg

7. 推理结果

7.1 CPU 推理结果

RankClass IDProbability(%)
13930.1036
27060.1031
36950.1030
45630.1030
55740.1029
  • CPU 推理耗时:0.0265s

7.2 NPU 推理结果

RankClass IDProbability(%)
13930.1036
27060.1031
36950.1030
45630.1030
55740.1029
  • NPU 推理耗时:0.1581s

7.3 模拟终端输出截图

Inference Results

8. 部署和推理方法

8.1 Python 脚本方式

import torch
import timm
from PIL import Image
from timm.data import resolve_model_data_config, create_transform

# 加载模型(NPU)
model = timm.create_model("test_nfnet.r160_in1k", pretrained=True).eval().to("npu")

# 准备输入
img = Image.open("example.jpg").convert("RGB")
data_config = resolve_model_data_config(model)
transform = create_transform(**data_config, is_training=False)
input_tensor = transform(img).unsqueeze(0).to("npu")

# 推理
with torch.no_grad():
    output = model(input_tensor)
    probs = torch.nn.functional.softmax(output, dim=1)
    top5 = torch.topk(probs, k=5, dim=1)
    print(top5)

8.2 批量推理方式

# 执行完整 CPU / NPU 精度对比
python3 compare_cpu_npu.py

9. CPU/NPU 精度测试方法

  1. 设置固定随机种子(torch.manual_seed(42))
  2. 分别在 CPU 和 NPU 上对相同随机输入执行推理
  3. 收集两端的 logits 输出
  4. 计算以下指标:
    • MAE(平均绝对误差)
    • MSE / RMSE
    • 最大绝对误差
    • 余弦相似度
    • 相对误差
    • Softmax 概率差异
    • Top-1 / Top-5 一致率

10. CPU/NPU 精度测试结果

10.1 精度指标

指标值
MAE (Mean Absolute Error)0.00001548
MSE0.00000000
RMSE0.00001928
Max Absolute Error0.00006037
Cosine Similarity0.99999877
Relative Error0.5571%
Prob MAE0.00000002
Prob Max Abs Error0.00000006
Top-1 MatchTrue (均为 Class 393)
Top-5 Overlap5/5 (完全一致)

10.2 Top-5 概率对比

RankCPU Class IDCPU Prob(%)NPU Class IDNPU Prob(%)
13930.10363930.1036
27060.10317060.1031
36950.10306950.1030
45630.10305630.1030
55740.10295740.1029

10.3 模拟终端输出截图

Accuracy Comparison

10.4 精度结论

NPU 与 CPU 推理结果相对误差 < 1%(0.5571%),精度测试通过。

  • Top-1 类别完全一致(Class 393)
  • Top-5 类别完全一致,顺序完全相同
  • 余弦相似度 0.99999877,近乎完全一致

11. 性能测试结果

设备推理耗时 (s)
CPU0.0265
NPU (Ascend)0.1581

说明:该模型参数量仅 0.4M,属于超轻量模型,CPU 可直接快速完成推理。NPU 推理包含设备数据传输开销,对大 batch 和大模型场景优势更明显。

12. 资源释放

import gc
gc.collect()
torch.npu.empty_cache()

13. 许可证

Apache-2.0