本仓库对 semnasnet_075.rmsp_in1k 图像分类模型在华为昇腾 NPU 上进行了适配,支持 CPU 和 NPU 两种推理方式。
SEMNASNet(Squeeze-and-Excitation Mobile Neural Architecture Search Network)是一种轻量级图像分类模型。semnasnet_075 是宽度因子为 0.75 的轻量化版本,相比标准版本参数量和计算量更少,在 ImageNet-1K 上经过 rmsp(RMSProp)训练策略预训练。
原始模型地址:
任务类型: 图像分类(Image Classification)
模型框架: PyTorch / timm
| 项目 | 说明 |
|---|---|
| 输入格式 | 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 |
本模型基于 PyTorch + timm 框架,适配昇腾 NPU 的关键步骤如下:
model.to("npu:0") 将模型参数和计算迁移至昇腾 NPU由于 SEMNASNet 完全由标准 CNN 算子(Conv2D、BatchNorm、ReLU、Global Avg Pooling)组成,这些算子在昇腾 NPU 上有高效的融合算子实现,无需修改模型结构即可直接运行。
# 安装依赖
pip install torch torchvision
pip install timm Pillow safetensors numpy
# 如需使用昇腾 NPU,确保已安装 torch_npu 和 CANN 工具包python3 inference.py --model-name semnasnet_075.rmsp_in1k --device cpupython3 inference.py --model-name semnasnet_075.rmsp_in1k --device npupython3 inference.py --model-name semnasnet_075.rmsp_in1k --device npu --image /path/to/image.jpg| 指标 | 数值 |
|---|---|
| 推理时间 | 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 |
| 指标 | 数值 |
|---|---|
| 推理时间 | 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 |
使用 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 类别完全一致。
| 设备 | 推理耗时 | 加速比 |
|---|---|---|
| CPU | 0.0352s | 1.0× |
| NPU | 0.1639s | 0.21× |
注意:NPU 推理包含模型加载和设备间数据传输开销。对于单张图像推理,CPU 在小模型上具有优势;批量推理场景下 NPU 性能优势会更明显。
参考第 6 节的推理命令即可运行。
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)
| 文件 | 说明 |
|---|---|
| inference.py | CPU/NPU 推理脚本 |
| compare_cpu_npu.py | CPU 与 NPU 精度对比脚本 |
| requirements.txt | Python 依赖列表 |
| readme.md | 模型文档(本文件) |
| terminal_output.png | 推理终端截图 |