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

Sequencer2D_l NPU 适配

1. 模型介绍

Sequencer2D_l 是 Sequencer2D 系列的最大规模变体,基于 Sequence-to-Sequence 机制实现图像分类。该模型使用双向 LSTM 替代传统自注意力机制进行图像序列建模,在 ImageNet-1K 数据集上预训练,适用于 1000 类图像分类任务。相比 sequencer2d_s/m 具有最大的模型容量和最佳的分类性能。

原始模型地址:

  • ModelScope: timm/sequencer2d_l.in1k

2. 任务类型

图像分类(Image Classification)

3. 模型框架

  • PyTorch + timm
  • 输入格式:图像,RGB 三通道,224×224 分辨率
  • 输出格式:1000 类分类 logits

4. 依赖环境

组件版本
Python3.11.14
torch2.9.0
torch_npu2.9.0.post1
timm1.0.27
Pillow12.2.0
numpy1.24+

5. NPU 适配说明

该模型基于 PyTorch + timm 框架实现,在华为昇腾 NPU(Ascend 910)上可直接通过 torch_npu 进行推理加速。适配过程未修改模型架构,仅通过 model.to(torch.device("npu")) 将模型加载到 NPU 设备。

主要适配步骤:

  1. 从 ModelScope 下载模型权重
  2. 使用 timm 创建模型并加载本地权重
  3. 将模型迁移到 NPU 设备
  4. 执行推理并验证精度

6. 环境准备

# 安装依赖
pip install -r requirements.txt

7. 推理命令

CPU 推理

python3 inference.py --model sequencer2d_l.in1k \
  --weights /path/to/weights/model.safetensors \
  --device cpu \
  --dump logits_cpu.npy

NPU 推理

python3 inference.py --model sequencer2d_l.in1k \
  --weights /path/to/weights/model.safetensors \
  --device npu \
  --dump logits_npu.npy

CPU/NPU 精度对比

python3 compare_cpu_npu.py --cpu logits_cpu.npy --npu logits_npu.npy --model sequencer2d_l

8. 推理结果

指标CPUNPU
Top-1 类别549549
Top-1 概率0.0042810.004293
Top-5 类别[549, 769, 405, 701, 554][549, 769, 405, 701, 554]
平均延迟1267.59 ms129.00 ms
加速比-9.83x

9. CPU/NPU 精度测试方法

  1. 使用同一张测试图像(默认灰色 224×224 图像)
  2. 分别使用 CPU 和 NPU 对模型进行推理
  3. 记录两次推理的 logits 输出
  4. 计算多种精度指标,包括最大绝对误差、余弦相似度、误差率等

10. CPU/NPU 精度测试结果

指标值
最大绝对误差7.43e-03
平均绝对误差1.39e-03
最大概率差异2.10e-05
平均概率差异1.59e-06
L2 距离5.68e-02
余弦相似度0.99999380
CPU logits 范围2.435103
误差率0.305%

结论:NPU 与 CPU 推理结果误差 < 1%

精度测试结果显示,NPU 与 CPU 推理结果的误差率仅为 0.305%,远低于 1% 的阈值。Top-1 和 Top-5 类别完全一致,余弦相似度达到 0.99999380,表明 NPU 推理精度与 CPU 几乎一致。

11. 性能测试结果

设备平均延迟 (ms)加速比
CPU1267.591x (基准)
NPU (Ascend 910)129.009.83x

12. 模拟终端输出截图

推理截图

13. 部署和推理方法

快速开始

import torch
import torch_npu
from timm import create_model
from timm.data import resolve_data_config
from timm.data.transforms_factory import create_transform
from PIL import Image

# 创建模型并加载权重
model = create_model("sequencer2d_l.in1k", pretrained=False)
state_dict = torch.load("model.safetensors", map_location="cpu")
model.load_state_dict(state_dict)
model.eval()

# 迁移到 NPU
device = torch.device("npu")
model.to(device)

# 准备输入
img = Image.open("input.jpg").convert("RGB")
config = resolve_data_config({}, model=model)
transform = create_transform(**config)
input_tensor = transform(img).unsqueeze(0).to(device)

# 推理
with torch.no_grad():
    output = model(input_tensor)
    probs = torch.softmax(output, dim=1)
    top1 = torch.argmax(probs, dim=1)
    print(f"Top-1 class: {top1.item()}")

模型标签

  • #+NPU
  • #+CV
  • #+昇腾
  • #+图像分类
  • #+Sequencer2D