本文档记录 mobilenetv3_small_100.lamb_in1k MobileNetV3-Small 图像分类模型在昇腾 NPU(Ascend 910B3)上的迁移适配、精度评测与性能验证结果。
该模型是 MobileNetV3-Small 架构(width multiplier=1.0),使用 LAMB 优化器在 ImageNet-1k 上训练。MobileNetV3 是 Google 提出的轻量级 CNN,通过 NAS(神经架构搜索)和 NetAdapt 算法优化,采用深度可分离卷积 + SE(Squeeze-and-Excitation)注意力 + h-swish 激活函数组合。该模型以 timm 格式发布,配置文件使用 architecture(单数)而非 HuggingFace 标准的 architectures(复数)。
适配突破:本模型无法通过 HuggingFace AutoModel 加载(config 缺 architectures 字段),采用 timm.create_model() 直接创建模型 + safetensors.torch.load_file() 加载权重的方式完成适配,打通了 timm 格式模型的 NPU 适配通路。
相关获取地址:
| 组件 | 版本 |
|---|---|
torch | 2.8.0 |
torch_npu | 2.8.0.post4 |
timm | 1.0.27 |
CANN | 8.5.1 |
8 × Ascend 910B3timm.create_model() + safetensors(非 HuggingFace AutoModel)conda create -n timm-models python=3.11 -y
conda activate timm-models
pip install torch==2.8.0 torch_npu==2.8.0.post4 \
-i https://pypi.tuna.tsinghua.edu.cn/simple
pip install timm safetensors pillow numpy \
-i https://pypi.tuna.tsinghua.edu.cn/simpletimm 格式模型不需要
transformers库,直接使用timm加载。
python inference.py \
--model_path /path/to/mobilenetv3_small_100.lamb_in1k \
--image photo.jpg --device npu编程接口:
from inference import TimmClassifier
clf = TimmClassifier(
model_path="./mobilenetv3_small_100.lamb_in1k", device="npu"
)
probs = clf.predict(["photo.jpg"])
# probs.shape → (1, 1000), Top-1 index = np.argmax(probs[0])python inference.py --model_path ./mobilenetv3_small_100.lamb_in1k --device npu预期输出:Top-5 分类索引及置信度,无运行时错误。使用随机合成图像自动生成输入。
测试条件:6 张合成 224×224 图像(固定随机种子),batch_size=8,NPU 预热 1 轮。
| 指标 | 数值 |
|---|---|
| NPU 吞吐量 | 106.0 img/s |
MobileNetV3-Small 仅 2.5M 参数(width=1.0),推理速度极快。CNN 卷积在 NPU 上获得原生加速,适合移动端模型的边缘部署。
分别在 CPU 和 NPU 上对 6 张合成图像推理(timm.create_model 创建的相同模型,仅设备不同),比较 1000 维 softmax 概率向量的余弦相似度、MAE 和 Top-1 分类一致性。
| 指标 | 数值 |
|---|---|
| 平均余弦相似度 | 0.999993 |
| MAE | 0.000003 |
| 精度误差率 | 0.0007% |
| Top-1 准确率 | 100.0% |
结论:精度误差率 0.0007%,远低于 1% 要求。timm 直接加载方式与 HuggingFace 方式精度完全等价,评测通过。
timm 格式与 HuggingFace 格式的核心差异:
| 特性 | HuggingFace | timm |
|---|---|---|
| 配置键 | architectures (复数) | architecture (单数) |
| 加载 API | AutoModel.from_pretrained() | timm.create_model() |
| 权重加载 | 自动 | load_state_dict(load_file()) |
| 预处理 | AutoImageProcessor | timm.data.create_transform() |
import timm, torch, json
import torch_npu
from safetensors.torch import load_file
# 1. 从 config.json 读取架构名
with open("config.json") as f:
cfg = json.load(f)
arch = cfg["architecture"] # 注意:单数 architecture
# 2. 创建模型并加载权重
model = timm.create_model(arch, pretrained=False, num_classes=cfg["num_classes"])
model.load_state_dict(load_file("model.safetensors"), strict=False)
model.to("npu:0").eval()
# 3. 获取预处理参数
data_cfg = timm.data.resolve_data_config(model=model)
transform = timm.data.create_transform(**data_cfg, is_training=False)
# 4. 推理
from PIL import Image
img = transform(Image.open("photo.jpg").convert("RGB")).unsqueeze(0)
with torch.no_grad():
probs = torch.softmax(model(img.to("npu:0")), dim=-1)architecture(单数),不是 HuggingFace 的 architectures(复数)。这是用 AutoModel 加载失败的根源——ValueError: Unrecognized model typepip install timm safetensors。不需要 transformers 库(但 torch_npu 仍需要)timm.data.create_transform(model=model) 自动生成预处理管道(resize + normalize + 可能的增强),与训练时的配置一致load_state_dict(strict=False) 允许部分权重不匹配(如 classifier 的 num_classes 不同),适配时安全忽略