z
zkx_/mobilenetv3_small_100.lamb_in1k-ascend
模型介绍文件和版本Pull Requests讨论分析
下载使用量0

mobilenetv3_small_100.lamb_in1k on Ascend NPU

1. 简介

本文档记录 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 适配通路。

相关获取地址:

  • 权重下载地址(HuggingFace):https://huggingface.co/timm/mobilenetv3_small_100.lamb_in1k

2. 验证环境

组件版本
torch2.8.0
torch_npu2.8.0.post4
timm1.0.27
CANN8.5.1
  • NPU:8 × Ascend 910B3
  • 精度对比基准:CPU(x86, PyTorch 2.8.0)
  • 加载方式:timm.create_model() + safetensors(非 HuggingFace AutoModel)

3. 部署使用流程

3.1 环境准备

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/simple

timm 格式模型不需要 transformers 库,直接使用 timm 加载。

3.2 推理脚本使用

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])

4. Smoke 验证

python inference.py --model_path ./mobilenetv3_small_100.lamb_in1k --device npu

预期输出:Top-5 分类索引及置信度,无运行时错误。使用随机合成图像自动生成输入。

5. 性能参考

测试条件:6 张合成 224×224 图像(固定随机种子),batch_size=8,NPU 预热 1 轮。

指标数值
NPU 吞吐量106.0 img/s

MobileNetV3-Small 仅 2.5M 参数(width=1.0),推理速度极快。CNN 卷积在 NPU 上获得原生加速,适合移动端模型的边缘部署。

6. 精度评测

6.1 评测方法

分别在 CPU 和 NPU 上对 6 张合成图像推理(timm.create_model 创建的相同模型,仅设备不同),比较 1000 维 softmax 概率向量的余弦相似度、MAE 和 Top-1 分类一致性。

6.2 评测结果

指标数值
平均余弦相似度0.999993
MAE0.000003
精度误差率0.0007%
Top-1 准确率100.0%

结论:精度误差率 0.0007%,远低于 1% 要求。timm 直接加载方式与 HuggingFace 方式精度完全等价,评测通过。

7. 迁移适配说明

7.1 模型结构

  • Backbone:MobileNetV3-Small(深度可分离卷积 + SE 注意力 + h-swish)
  • Classifier:全局平均池化 + Conv2d 1×1(960 → 1280) + 全连接(1280 → 1000)
  • 参数量:2.5M(极轻量)
  • 输入:224×224 RGB

7.2 timm 加载方式(关键突破)

timm 格式与 HuggingFace 格式的核心差异:

特性HuggingFacetimm
配置键architectures (复数)architecture (单数)
加载 APIAutoModel.from_pretrained()timm.create_model()
权重加载自动load_state_dict(load_file())
预处理AutoImageProcessortimm.data.create_transform()

7.3 关键代码

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)

8. 注意事项

  1. config 键名差异:timm 模型使用 architecture(单数),不是 HuggingFace 的 architectures(复数)。这是用 AutoModel 加载失败的根源——ValueError: Unrecognized model type
  2. timm 必要依赖:需安装 pip install timm safetensors。不需要 transformers 库(但 torch_npu 仍需要)
  3. 预处理管道:timm 使用 timm.data.create_transform(model=model) 自动生成预处理管道(resize + normalize + 可能的增强),与训练时的配置一致
  4. strict=False 加载:load_state_dict(strict=False) 允许部分权重不匹配(如 classifier 的 num_classes 不同),适配时安全忽略
  5. MobileNetV3 系列:Small 1.0(2.5M) > Small 0.75(1.8M) > Small 0.5(1.0M),width multiplier 越小推理越快但精度越低
  6. 首次 NPU 推理:轻量 CNN 算子编译约 2-3 秒,是所有模型中最快的预热时间