Interlinked7/swin-transformer-npu
模型介绍文件和版本Pull Requests讨论分析
下载使用量0

Swin-Transformer-NPU

#+NPU #+昇腾 #+Ascend910 #+CV #+图像分类 #+Swin-Transformer #+Transformer #+ViT

模型介绍

本仓库包含了 Swin-Transformer 在华为昇腾 Ascend910 NPU 上的适配版本,支持 CPU 和 NPU 两种推理方式,并提供了完整的精度验证流程。

Swin-Transformer(Shifted Window Transformer)是一种基于 Vision Transformer(ViT)架构的改进模型,由 Microsoft 研究院于 2021 年提出(ICCV 2021 最佳论文)。其核心创新是引入移动窗口(Shifted Window)注意力机制,在非重叠的局部窗口内计算自注意力,并通过窗口移动实现跨窗口信息交互。这种设计既保持了 Transformer 的强大建模能力,又大幅降低了计算复杂度,使其能够高效处理高分辨率图像。

原始模型地址: AIBSECO/Swin-Transformer

任务类型

图像分类(Image Classification),1000 类 ImageNet 分类

模型框架

PyTorch(torchvision)

输入格式

图像(Image),RGB 格式,预处理后为 224×224 张量

输出格式

1000 个类别的分类 logits 和概率分数

依赖环境

依赖版本
Python>= 3.8
PyTorch>= 2.0.0
torch_npu>= 2.0.0
torchvision>= 0.15.0
NumPy>= 1.20.0
Pillow>= 9.0.0

NPU 适配说明

本适配基于华为 Ascend910 NPU(CANN 8.5.1,显存 64GB)完成。适配内容包括:

  1. 使用 torchvision 加载 Swin-Transformer 预训练模型(swin_t)
  2. 通过 model.to("npu:0") 将模型权重迁移到 NPU 设备实现加速推理
  3. 对输入张量进行设备迁移以确保在 NPU 上正确运行
  4. 实现了 CPU 与 NPU 推理结果的精度对比验证

环境准备

# 安装基础依赖
pip install torch torchvision torch_npu numpy Pillow -i https://mirrors.aliyun.com/pypi/simple/

# 设置 NPU 环境变量
export ASCEND_RT_VISIBLE_DEVICES=0

推理命令

CPU 推理:

python3 inference.py --device cpu

NPU 推理:

python3 inference.py --device npu

CPU vs NPU 精度对比:

python3 compare_cpu_npu.py

部署和推理方法

方式一:直接运行推理脚本

# CPU 推理
python3 inference.py --device cpu

# NPU 推理
python3 inference.py --device npu

方式二:自定义 NPU 推理

import torch
from torchvision.models import swin_t, Swin_T_Weights
from PIL import Image
from torchvision import transforms

# 加载模型
model = swin_t(weights=Swin_T_Weights.DEFAULT)
model = model.to("npu:0")

# 图像预处理
transform = transforms.Compose([
    transforms.Resize(256),
    transforms.CenterCrop(224),
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.485, 0.456, 0.406],
                         std=[0.229, 0.224, 0.225]),
])
image = Image.open("test_image.jpg").convert("RGB")
input_tensor = transform(image).unsqueeze(0).to("npu:0")

# 推理
with torch.no_grad():
    output = model(input_tensor)

probs = torch.nn.functional.softmax(output, dim=-1)
print(probs)

CPU/NPU 精度测试方法

  1. 使用 torchvision 加载 Swin-Transformer 预训练模型
  2. 在 CPU 上执行推理,记录输出分数和标签
  3. 将模型迁移到 NPU 设备,在 NPU 上执行相同推理
  4. 对比 CPU 与 NPU 输出的差异

关键比较指标:

  • 最大绝对误差(Max Absolute Difference):逐元素比较输出分数的最大差异
  • 平均绝对误差(Mean Absolute Difference):逐元素比较输出分数的平均差异
  • 相对误差(Relative Error):最大绝对误差 / 最大分数值
  • 余弦相似度(Cosine Similarity):衡量输出向量的方向一致性
  • Top-1 匹配率:最高概率标签是否一致
  • Top-5 一致率:前5个预测标签的重叠比例

CPU/NPU 精度测试结果

指标值
最大绝对误差6.155252e-03
平均绝对误差9.441043e-04
相对误差0.1163%
余弦相似度0.9999991059
最大概率绝对误差6.046519e-05
平均概率绝对误差1.030756e-06
Top-1 标签匹配True
Top-5 一致率100%
CPU 推理耗时207.68 ms
NPU 推理耗时228.12 ms

Top-5 分类结果对比

排名CPU 类别CPU 分数NPU 类别NPU 分数
Top-1kite0.087094kite0.087119
Top-2black stork0.067353black stork0.067352
Top-3vulture0.048732vulture0.048792
Top-4space shuttle0.029926space shuttle0.029954
Top-5bald eagle0.026306bald eagle0.026252

精度结论

NPU 与 CPU 推理结果误差 < 1%(实际相对误差为 0.1163%),精度完全满足要求。余弦相似度为 0.9999991059,Top-1 和 Top-5 结果完全一致,NPU 推理结果与 CPU 推理结果高度一致。

性能测试结果

平台推理耗时 (ms)加速比
CPU207.681.00x
NPU (Ascend910)228.120.91x

注:Swin-T 模型为 28M 参数的中等规模模型,在 NPU 上的推理性能与 CPU 接近。对于更大规模的 Swin-B/L 模型,NPU 的加速效果会更明显。

运行截图

推理截图

推理

精度对比截图

精度对比

模型标签

#+NPU #+昇腾 #+Ascend910 #+CV #+图像分类 #+Swin-Transformer #+Transformer #+ViT