m0_74196153/test_byobnet.r160_in1k-npu
模型介绍文件和版本Pull Requests讨论分析
下载使用量0

test_byobnet.r160_in1k 在昇腾 NPU 上的推理适配

1. 简介

本文档记录 test_byobnet.r160_in1k 图像分类模型在华为昇腾 NPU(Ascend 910)上的适配和推理验证结果。

test_byobnet.r160_in1k 是一个极小的 BYOBNet(Bring Your Own Backbone Network)测试模型,参数量仅 0.5M,由 Ross Wightman 在 ImageNet-1k 上训练,适用于图像分类任务的快速测试和验证。

相关获取地址:

  • 原始模型地址:https://www.modelscope.cn/models/timm/test_byobnet.r160_in1k
  • timm 模型库:https://github.com/huggingface/pytorch-image-models

2. 验证环境

组件版本
操作系统Linux (aarch64)
NPUAscend 910
CANN8.5.1
Python3.11.14
PyTorch2.9.0
torch-npu2.9.0.post1
timm1.0.27
torchvision>= 0.15.0

3. 模型信息

属性值
模型名称test_byobnet.r160_in1k
任务类型图像分类(ImageNet-1k, 1000 类)
模型框架PyTorch (timm)
输入格式图像,3×160×160 (RGB)
输出格式1000 类 logits 和 softmax 概率
参数量0.5M
输入尺寸160×160
预处理中心裁剪 + bicubic 插值缩放
权重路径pytorch_model.bin (1.9MB)

4. 环境准备

4.1 创建虚拟环境并安装依赖

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple torch torchvision
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple timm>=1.0.0
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple Pillow>=10.0.0
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple modelscope

4.2 下载模型

from modelscope.hub.snapshot_download import snapshot_download
model_dir = snapshot_download('timm/test_byobnet.r160_in1k', cache_dir='/path/to/models')

5. NPU 适配说明

本模型使用 PyTorch + torch_npu 在昇腾 NPU 上进行推理。适配过程无需修改模型代码,仅需:

  1. 将模型权重加载后通过 .to("npu:0") 转移到 NPU
  2. 将输入张量转移至 NPU
  3. 推理完成后将结果通过 .cpu() 转回 CPU 进行后续处理

核心适配逻辑:

import torch
import torch_npu  # noqa: F401
from timm import create_model

# 加载模型
model = create_model("test_byobnet.r160_in1k", pretrained=False,
                     checkpoint_path="pytorch_model.bin", num_classes=1000)
model = model.eval().to("npu:0")

# 推理
with torch.no_grad():
    output = model(input_tensor.to("npu:0"))
    probs = torch.nn.functional.softmax(output, dim=1)

6. 推理命令

CPU 推理

cd /opt/atomgit/output/test_byobnet.r160_in1k
python3 inference.py --device cpu --iterations 3

NPU 推理

cd /opt/atomgit/output/test_byobnet.r160_in1k
python3 inference.py --device npu --iterations 3

7. 推理结果

NPU 推理输出

NPU 推理截图

Top-5 预测结果对比

排名CPU 类别CPU 概率NPU 类别NPU 概率
1class_2465.60%class_2465.59%
2class_635.11%class_635.10%
3class_431.96%class_431.96%
4class_821.90%class_821.92%
5class_841.21%class_841.21%

推理耗时对比

设备平均推理耗时 (ms)
CPU5.99 ms
NPU2.33 ms

NPU 推理速度约为 CPU 的 2.6 倍。

8. CPU/NPU 精度测试

测试方法

  1. 使用相同的测试图像(test_owl.jpg)分别在 CPU 和 NPU 上运行推理
  2. 保存两端的 logits 和 softmax 概率
  3. 计算绝对误差、相对误差和 Top-k 一致性

精度测试命令

cd /opt/atomgit/output/test_byobnet.r160_in1k
python3 inference.py --device cpu --iterations 3
python3 inference.py --device npu --iterations 3
python3 compare_cpu_npu.py

精度测试结果

CPU/NPU 精度对比截图

指标数值
CPU logits 范围[-11.984, 2.494]
NPU logits 范围[-11.994, 2.493]
Logits 最大绝对误差 (MAE)0.014517
Logits 平均绝对误差0.003627
Logits 平均相对误差0.057%
Probability 最大绝对误差0.000112
Probability 平均绝对误差0.000001
Top-1 一致性一致(均为 class_24)
Top-5 重叠5/5 完全一致

精度判定

结论:NPU 与 CPU 推理结果误差 < 1%(实际概率误差仅 0.0112%,远低于 1% 阈值)

9. 文件说明

文件说明
inference.py推理脚本,支持 CPU 和 NPU
compare_cpu_npu.pyCPU/NPU 精度对比脚本
requirements.txtPython 依赖
readme.md本文档
screenshot_npu.pngNPU 推理终端截图
screenshot_compare.png精度对比终端截图

10. 部署和推理方法

直接使用

import torch
from PIL import Image
from timm import create_model
from timm.data import resolve_data_config, create_transform

# 加载模型 (CPU)
model = create_model("test_byobnet.r160_in1k", pretrained=True)
model = model.eval()

# 加载模型 (NPU)
# import torch_npu
# model = model.to("npu:0")

# 预处理
config = resolve_data_config({}, model=model)
transform = create_transform(**config)
img = Image.open("test_owl.jpg").convert("RGB")
x = transform(img).unsqueeze(0)

# 推理
with torch.no_grad():
    output = model(x)
    probs = torch.nn.functional.softmax(output, dim=1)

# Top-5 结果
top5_prob, top5_idx = torch.topk(probs, 5)
print(top5_idx, top5_prob)

11. 注意事项

  1. 本模型是测试用小型模型,实际部署建议使用更大规模的 BYOBNet 变体。
  2. NPU 推理时需确保 torch_npu 已正确安装且可用。
  3. 推理完成后及时释放资源:torch.npu.empty_cache()。