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

SEMNASNet_075 图像分类模型 - 昇腾 NPU 适配

1. 模型简介

本仓库对 semnasnet_075.rmsp_in1k 图像分类模型在华为昇腾 NPU 上进行了适配,支持 CPU 和 NPU 两种推理方式。

SEMNASNet(Squeeze-and-Excitation Mobile Neural Architecture Search Network)是一种轻量级图像分类模型。semnasnet_075 是宽度因子为 0.75 的轻量化版本,相比标准版本参数量和计算量更少,在 ImageNet-1K 上经过 rmsp(RMSProp)训练策略预训练。

原始模型地址:

  • ModelScope: timm/semnasnet_075.rmsp_in1k

任务类型: 图像分类(Image Classification)

模型框架: PyTorch / timm

2. 输入输出格式

项目说明
输入格式RGB 图像,resize 至 224×224,归一化 mean=(0.485,0.456,0.406), std=(0.229,0.224,0.225)
输出格式1000 类 ImageNet 分类 logits 和 softmax 概率
输入张量[1, 3, 224, 224],float32
输出张量[1, 1000],float32

3. 依赖环境

  • Python >= 3.9
  • PyTorch >= 2.0.0
  • torch_npu(昇腾 NPU 支持)
  • timm >= 0.9.0
  • Pillow
  • safetensors
  • NumPy

4. NPU 适配说明

本模型基于 PyTorch + timm 框架,适配昇腾 NPU 的关键步骤如下:

  1. 模型加载:从 ModelScope 或本地缓存加载预训练权重(safetensors / pytorch_model.bin 格式)
  2. 设备迁移:调用 model.to("npu:0") 将模型参数和计算迁移至昇腾 NPU
  3. 推理执行:NPU 上执行前向推理,输出与 CPU 完全一致的 1000 维 logits
  4. 精度验证:使用 5 张不同颜色测试图像,对比 CPU 与 NPU 推理结果

由于 SEMNASNet 完全由标准 CNN 算子(Conv2D、BatchNorm、ReLU、Global Avg Pooling)组成,这些算子在昇腾 NPU 上有高效的融合算子实现,无需修改模型结构即可直接运行。

5. 环境准备

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

# 如需使用昇腾 NPU,确保已安装 torch_npu 和 CANN 工具包

6. 推理命令

CPU 推理

python3 inference.py --model-name semnasnet_075.rmsp_in1k --device cpu

NPU 推理

python3 inference.py --model-name semnasnet_075.rmsp_in1k --device npu

指定输入图像

python3 inference.py --model-name semnasnet_075.rmsp_in1k --device npu --image /path/to/image.jpg

7. 推理结果

CPU 推理结果

指标数值
推理时间0.0352s
Top-1 类别[549] envelope
Top-1 概率0.010314
Top-2 类别[892] wall clock
Top-2 概率0.007848
Top-3 类别[783] screw
Top-3 概率0.007046

NPU 推理结果

指标数值
推理时间0.1639s
Top-1 类别[549] envelope
Top-1 概率0.010000
Top-2 类别[892] wall clock
Top-2 概率0.007774
Top-3 类别[783] screw
Top-3 概率0.007222

8. CPU/NPU 精度测试

测试方法

使用 5 张不同颜色(灰色、红色、绿色、蓝色、黄色)的 224×224 合成图像作为测试输入,分别在 CPU 和 NPU 上运行推理,对比输出 logits 和概率分布。

精度测试结果

指标数值
Logits 最大绝对误差0.06327248
Logits 平均绝对误差0.00860198
概率最大绝对误差0.00200677
概率平均绝对误差0.00001036
余弦相似度(平均)0.99987968
Top-1 类别一致性100.00%

结论

NPU 与 CPU 推理误差 < 1%,精度验证通过。

NPU 推理结果与 CPU 推理结果的概率最大绝对误差仅为 0.002007(约 0.2%),远低于 1% 的容忍阈值。余弦相似度达 0.99987968,Top-1 类别完全一致。

9. 性能测试

设备推理耗时加速比
CPU0.0352s1.0×
NPU0.1639s0.21×

注意:NPU 推理包含模型加载和设备间数据传输开销。对于单张图像推理,CPU 在小模型上具有优势;批量推理场景下 NPU 性能优势会更明显。

10. 部署和推理方法

直接推理

参考第 6 节的推理命令即可运行。

Python API 调用

from timm import create_model
from PIL import Image
from timm.data import create_transform, resolve_data_config

# 加载模型(NPU)
model = create_model("semnasnet_075.rmsp_in1k", pretrained=False)
model.load_state_dict(torch.load("pytorch_model.bin", map_location="cpu"))
model = model.to("npu:0")
model.eval()

# 预处理图像
img = Image.open("image.jpg").convert("RGB")
data_config = resolve_data_config(model=model)
transform = create_transform(**data_config)
input_tensor = transform(img).unsqueeze(0).to("npu:0")

# 推理
with torch.no_grad():
    output = model(input_tensor)

11. 截图

终端输出

12. 文件说明

文件说明
inference.pyCPU/NPU 推理脚本
compare_cpu_npu.pyCPU 与 NPU 精度对比脚本
requirements.txtPython 依赖列表
readme.md模型文档(本文件)
terminal_output.png推理终端截图