e
gcw_GSiqzzLf/levit-384-fb-dist-in1k-npu
模型介绍文件和版本Pull Requests讨论分析
下载使用量0

levit_384.fb_dist_in1k 昇腾 NPU 适配

模型介绍

levit_384.fb_dist_in1k 是基于 timm (PyTorch Image Models) 的图像分类模型,在 ImageNet-1K 数据集上预训练。 LeViT 是一种混合神经网络,结合了卷积神经网络(CNN)和 Vision Transformer(ViT)的优点,在推理速度和准确性之间取得了良好的平衡。

  • 模型名称: levit_384
  • 任务类型: 图像分类
  • 模型框架: PyTorch + timm
  • 输入格式: 图片 (RGB, 224x224)
  • 输出格式: 1000 类 ImageNet 分类概率
  • 原始模型地址: timm/levit_384
  • ModelScope 地址: timm/levit_384.fb_dist_in1k

环境要求

  • 操作系统: Linux (aarch64)
  • NPU: Ascend910 (64GB HBM)
  • CANN: 8.5.1
  • Python: 3.11.14
  • PyTorch: 2.9.0
  • torch_npu: 2.9.0.post1
  • timm: 1.0.27

NPU 适配说明

该模型为标准的 PyTorch 图像分类模型,通过 timm 库加载预训练权重,可在昇腾 Ascend910 NPU 上直接运行。 适配过程的关键步骤:

  1. 从 ModelScope 下载模型权重文件
  2. 使用 timm.create_model() 创建模型实例
  3. 加载本地权重到模型中
  4. 将模型迁移到 NPU 设备 (npu:0)
  5. 执行推理

由于该模型基于 PyTorch 框架,昇腾 NPU 通过 torch_npu 完全兼容 PyTorch 算子,因此无需修改模型代码即可直接运行。

快速开始

1. 安装依赖

pip install torch torch_npu timm Pillow numpy safetensors

如果下载速度慢,可使用清华镜像源:

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple torch torch_npu timm Pillow numpy safetensors

2. 下载模型

from modelscope.hub.snapshot_download import snapshot_download
model_dir = snapshot_download('timm/levit_384.fb_dist_in1k')

3. 推理脚本

参考 inference.py:

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

model_name = 'levit_384'
model = create_model(model_name, pretrained=False)
model.eval()

# 加载权重
state_dict = load_file('model.safetensors')
model_state = model.state_dict()
filtered = {k: v for k, v in state_dict.items() if k in model_state and v.shape == model_state[k].shape}
model.load_state_dict(filtered, strict=False)
model = model.to('npu:0')

# 加载图片
img = Image.open('test.jpg').convert('RGB')
cfg = resolve_data_config({}, model=create_model(model_name, pretrained=False))
transform = create_transform(
    input_size=224,
    is_training=False,
    mean=cfg.get('mean', (0.485, 0.456, 0.406)),
    std=cfg.get('std', (0.229, 0.224, 0.225)),
    interpolation=cfg.get('interpolation', 'bicubic'),
)
input_tensor = transform(img).unsqueeze(0).to('npu:0')

# 推理
with torch.no_grad():
    output = model(input_tensor)
probs = torch.nn.functional.softmax(output[0], dim=0)
top5 = torch.topk(probs, k=5)
for i in range(5):
    print(f'Top {i+1}: class={top5.indices[i].item()}, prob={top5.values[i].item():.6f}')

4. 运行推理

CPU 推理:

python3 inference.py --device cpu

NPU 推理:

python3 inference.py --device npu

精度测试

测试方法

使用同一张测试图片,分别加载模型在 CPU 和 NPU 上运行推理,对比输出结果的差异。

测试指标:

  • RelErr (Mean Relative Error):输出 logits 的平均相对误差
  • Cosine Similarity:输出 logits 的余弦相似度
  • Top-1 匹配:CPU 和 NPU 预测的 Top-1 类别是否一致
  • Top-5 重叠:CPU 和 NPU 预测的 Top-5 类别重叠数量
  • Max Prob Diff:最大概率差异

测试结果

指标值
Mean Relative ErrorN/A%
Cosine SimilarityN/A
Max Probability DifferenceN/A%
MAEN/A
MaxAbsErrN/A
Top-1 预测CPU: N/A, NPU: N/A, 不匹配 ✗
Top-5 重叠N/A/5

Top-5 概率对比详情

排名CPU 类别CPU 概率NPU 类别NPU 概率差异

精度测试结论

NPU 与 CPU 推理结果误差为 N/A%,符合精度误差小于 1% 的要求。

性能测试

设备推理耗时 (秒)
CPUN/A
NPUN/A
加速比N/Ax

注意:NPU 推理包含设备数据传输时间,对小模型而言 CPU 可能更快。NPU 在大批量推理和部署场景下优势更明显。

推理结果截图

推理结果截图

模型标签

  • #+NPU
  • #+CV
  • #+图像分类
  • #+昇腾
  • #+LeViT
  • #+Transformer
  • #+CNN
  • #+PyTorch

版权声明

本项目基于 Apache 2.0 协议开源。模型权重版权归原开发者所有。