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

google/efficientnet-b0 on Ascend NPU

1. 简介

本文档记录 google/efficientnet-b0 EfficientNet-B0 图像分类模型在昇腾 NPU(Ascend 910B3)上的迁移适配、精度评测与性能验证结果。

EfficientNet 是 Google 提出的通过 NAS(神经架构搜索)优化的 CNN 系列,B0 是最轻量基线版本(5.3M 参数)。通过复合缩放策略(同时调整深度/宽度/分辨率)实现极佳的精度-效率权衡。在 ImageNet-1k 上训练,支持 1000 类分类。以 timm 格式发布,采用 timm.create_model() 加载。

相关获取地址:

  • 权重下载地址(HuggingFace):https://huggingface.co/google/efficientnet-b0

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(timm 格式)

3. 部署使用流程

3.1 环境准备

conda create -n google--efficientnet-b0 python=3.11 -y
conda activate google--efficientnet-b0

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

3.2 推理

python inference.py --model_path ./google--efficientnet-b0 --image photo.jpg --device npu
from inference import TimmClassifier
clf = TimmClassifier(model_path="./google--efficientnet-b0", device="npu")
probs = clf.predict(["photo.jpg"])
# probs.shape → (1, 1000)

4. Smoke 验证

python inference.py --model_path ./google--efficientnet-b0 --device npu

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

5. 性能参考

测试条件:6 张合成 224×224 图像,batch_size=8,NPU 预热 1 轮。

指标数值
NPU 吞吐量115.2 img/s
CPU/NPU 加速比49.8 ×

EfficientNet-B0 仅 5.3M 参数,NPU 加速比高达 49.8×,得益于 CNN 卷积在 NPU 上的原生优化。适合实时图像分类场景。

6. 精度评测

6.1 评测方法

分别在 CPU 和 NPU 上对 6 张合成图像推理(timm.create_model 创建的相同模型),从以下维度评估:

  • 余弦相似度:1000 维 softmax 概率向量的方向一致性
  • 精度误差率:(1 - 余弦相似度) × 100%(要求 < 1.0%)
  • MAE:逐元素平均绝对误差,衡量概率值精度
  • Top-1 准确率:最高概率分类标签是否一致

6.2 评测结果

指标数值说明
平均余弦相似度0.999997接近完美
MAE0.000002逐元素误差极小
精度误差率0.0003%远低于 1% 要求
Top-1 准确率100.0%6/6 完全一致

6.3 逐图像结果

图像CPU Top-1NPU Top-1匹配余弦
0984984✅0.999997
1984984✅0.999998
2984984✅0.999996
3984984✅0.999997
4984984✅0.999997
5984984✅0.999998

结论:精度误差率 0.0003%,远低于 1% 阈值。NPU 与 CPU 输出在分类概率和 Top-1 标签上完全一致,评测通过。

7. 迁移适配说明

7.1 模型结构

  • Backbone:EfficientNet-B0(MBConv 模块 + SE 注意力 + Swish 激活)
  • Classifier:全局平均池化 + Dropout + 全连接(1280 → 1000)
  • 参数量:5.3M(极轻量,同精度下比 MobileNetV3 更高效)
  • 输入:224×224 RGB

7.2 timm 加载适配

import timm, json
from safetensors.torch import load_file

with open("config.json") as f: cfg = json.load(f)
model = timm.create_model(cfg["architecture"], pretrained=False, num_classes=1000)
model.load_state_dict(load_file("model.safetensors"), strict=False)
model.to("npu:0").eval()

7.3 关键代码

import timm, torch, torch_npu
from safetensors.torch import load_file
from PIL import Image

model = timm.create_model('efficientnet_b0', pretrained=False, num_classes=1000)
model.load_state_dict(load_file('model.safetensors'), strict=False)
model.to('npu:0').eval()

data_cfg = timm.data.resolve_data_config(model=model)
transform = timm.data.create_transform(**data_cfg, is_training=False)

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. EfficientNet 系列:B0(5.3M)→B1(7.8M)→B2(9.2M)→...→B7(66M),参数量和精度逐级提升
  2. timm 格式:使用 timm.create_model() 加载,非 HuggingFace AutoModel
  3. 首次 NPU 推理:5.3M 轻量模型,算子编译约 2-3 秒
  4. 同参数最优:EfficientNet 在同参数量级下精度通常优于 MobileNet/ResNet 系列
  5. SE 注意力:Squeeze-and-Excitation 模块在 NPU 上通过全局池化+FC 实现,原生支持