mambaout_small_rw.sw_e450_in1k 是一款基于 Mamba 架构的图像分类模型,由 timm 模型库提供。该模型使用 Mamba(状态空间模型)替代传统的 Transformer 注意力机制,在 ImageNet 数据集上训练,适用于图像分类任务。
| 属性 | 值 |
|---|---|
| 输入尺寸 | 224 × 224 |
| 类别数 | 1000 |
| 预处理均值 | [0.485, 0.456, 0.406] |
| 预处理标准差 | [0.229, 0.224, 0.225] |
此模型基于 torch_npu 在华为昇腾 NPU 上完成推理适配。模型权重从 ModelScope 下载,加载到 timm 定义的模型结构中。CPU 和 NPU 推理结果对比验证精度满足要求。
pip install -r requirements.txt依赖列表见 requirements.txt。
python3 inference.py --device cpupython3 inference.py --device npu使用随机噪声图片作为输入进行推理测试。
Average inference time: 407.36 ms (10 runs)
Top-5 predictions:
Class 818: 0.001523
Class 589: 0.001435
Class 318: 0.001417
Class 647: 0.001397
Class 749: 0.001396Average inference time: 13.64 ms (10 runs)
Top-5 predictions:
Class 818: 0.001524
Class 589: 0.001434
Class 318: 0.001420
Class 749: 0.001397
Class 647: 0.001397| 设备 | 平均推理耗时 (ms) | 加速比 |
|---|---|---|
| CPU | 407.36 | 1.0× |
| NPU (Ascend910) | 13.64 | 29.9× |
NPU 推理相比 CPU 加速约 29.9 倍。
| 指标 | 值 |
|---|---|
| Logits 最大绝对误差 | 0.01942384 |
| Logits 平均绝对误差 | 0.01143612 |
| Probabilities 最大绝对误差 | 0.00000858 |
| Probabilities 平均绝对误差 | 0.00000167 |
| Logits 有效值平均相对误差 ( | cpu |
| Probabilities 平均相对误差 | 0.1680% |
| Logits 余弦相似度 | 0.99999558 |
| Top-1 类别一致率 | 100.00% |
| Top-5 类别一致率 | 100.00% |
| Rank | CPU Class | CPU Prob | NPU Class | NPU Prob | Prob Diff |
|---|---|---|---|---|---|
| 1 | 818 | 0.00152300 | 818 | 0.00152400 | 0.00000100 |
| 2 | 589 | 0.00143500 | 589 | 0.00143400 | 0.00000100 |
| 3 | 318 | 0.00141700 | 318 | 0.00142000 | 0.00000300 |
| 4 | 647 | 0.00139700 | 749 | 0.00139700 | 0.00000000 |
| 5 | 749 | 0.00139600 | 647 | 0.00139700 | 0.00000100 |
NPU 与 CPU 推理结果误差小于 1%。
Top-1 类别一致率: 100.00%
Top-5 类别一致率: 100.00%
Logits 余弦相似度: 0.99999558
Probabilities 最大绝对误差: 0.00000858
✓ 精度验证通过
NPU 与 CPU 推理概率最大差异为 0.0000 (0.00%)
符合精度误差小于1%的要求
import torch
import timm
from timm.data import resolve_data_config
from timm.data.transforms_factory import create_transform
from safetensors.torch import load_file
from PIL import Image
# 加载模型
model = timm.create_model("mambaout_small_rw.sw_e450_in1k", pretrained=False)
# 加载权重
state_dict = load_file("weights/model.safetensors")
model.load_state_dict(state_dict, strict=True)
# 切换到 NPU
device = torch.device("npu:0")
model = model.to(device)
model.eval()
# 图像预处理
config = resolve_data_config({}, model=model)
transform = create_transform(**config)
img = Image.open("test.jpg").convert("RGB")
input_tensor = transform(img).unsqueeze(0).to(device)
# 推理
with torch.no_grad():
output = model(input_tensor)
probs = torch.nn.functional.softmax(output, dim=1)
top_probs, top_indices = torch.topk(probs, 5, dim=1)
for i in range(5):
print(f"Class {top_indices[0][i].item()}: {top_probs[0][i].item():.6f}")# CPU 推理
python3 inference.py --device cpu
# NPU 推理
python3 inference.py --device npupython3 compare_cpu_npu.py以下日志展示了 NPU 推理成功的关键信息:
=== Running inference on CPU ===
Input tensor device: cpu
Average inference time: 407.36 ms (10 runs)
Top-5 predictions:
Inference completed on cpu
Average inference time: 407.36 ms#+NPU #+CV #+图像分类 #+昇腾 #+Mamba #+timm