0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何优雅地将Swin Transformer模型部署到AX650N Demo板上?

爱芯元智AXERA 来源:爱芯元智AXERA 2023-04-15 10:15 次阅读

01

背景

今年来以ChatGPT为代表的大模型的惊艳效果,让AI行业迎来了新的动力。各种AIGC的应用接踵而至。我们知道类似ChatGPT的大模型,其核心网络结构均基于Google 2017年的论文提出的Transformer的论文《Attention Is All You Need》。在计算机视觉建模一直由卷积神经网络(CNN)主导,基于Transformer结构的网络模型长时间停留在各大顶会“刷榜”阶段,真正大规模落地并不突出。直到ICCV 2021的最佳论文《Swin Transformer》才达到了准确率和性能双佳的效果。

但是到目前为止,类似Swin Transformer的视觉类Transformer网络模型大多数还是部署在云端服务器上,原因是GPU对于MHA结构计算支持更友好,反而边缘侧/端侧AI芯片由于其DSA架构限制,为了保证CNN结构的模型效率更好,基本上对MHA结构没有过多性能优化,甚至需要修改网络结构才能勉强部署。这也间接限制了算法工程师在边缘计算应用上进一步发挥Transformer网络的想象力。

今年3月,爱芯元智发布了新一代产品AX650N,内置了其自主研发的第三代神经网络单元,进一步提升了最新AI算法模型的部署能力,可帮助用户在智慧城市,智慧教育,智能制造等领域发挥更大的价值。最近我通过正式渠道有幸拿到了一块AX650N Demo板进行尝鲜体验。

本文的目的是简单介绍基于AX650N Demo配套的新一代AI工具链如何优雅地将Swin Transformer模型部署到AX650N Demo板上,希望能给算法工程师们在Transformer网路部署落地上提供一种新的思路和途径。

02

Swin Transformer

b18a3090-daca-11ed-bfe3-dac502259ad0.png

The architecture of a Swin Transformer

目前Transformer应用到图像领域主要有两大挑战:

视觉实体变化大,在不同场景下视觉Transformer性能未必很好;

图像分辨率高,像素点多,Transformer基于全局自注意力的计算导致计算量较大。

2.1 原理

针对上述两个问题,微软在《Swin Transformer》的论文中提出了一种包含滑窗操作。其中滑窗操作包括不重叠的local window,和重叠的cross-window。将注意力计算限制在一个窗口中,一方面能引入CNN卷积操作的局部性,另一方面能节省计算量。在各大图像任务上,Swin Transformer都具有很好的性能。

2.2 分析

相比常见CNN网络模型,其实也就是新增了MHA(Multi Head Attention)的关键算子

LayerNormalization

Matmul

GELU

量化

LN、GELU、Matmul存在掉点风险

计算效率

占比最大的计算操作由Conv变成Matmul,因此要求硬件平台MatMul计算能力强

03

模型转换

Pulsar2介绍

Pulsar2(暂定名)是我们的新一代AI工具链,在吸取上一代工具链Pulsar的优秀行业经验和不足之处的反思后进行的重构,依然包含“模型转换、离线量化、模型编译、异构调度”四合一功能,进一步强化的网络模型快速、高效的部署需求。在针对第三NPU架构进行了深度定制优化的同时,也扩展了算子&模型支持的能力及范围,对Transformer结构的网络也有较好的支持。

b1c17690-daca-11ed-bfe3-dac502259ad0.png

pulsar2 deploy pipeline

3.1 模型下载

从Swin Transformer的官方仓库获取模型,由于是基于PyTorch训练,导出的是原始的pth模型格式,而对于部署的同学而言,更喜欢使用ONNX模型进行后续的产品落地,为了方便测试,我们提供该模型的ONNX版本导出脚本,降低模型获取门槛,便于之前不熟悉的同学直接掌握其中的关键操作。

import onnx
import torch
import requests
from onnxsim import simplify
from PIL import Image
from transformers import AutoFeatureExtractor, SwinForImageClassification


def download_swin_model(model_name):
  prefix = "microsoft"
  model_id = f"{prefix}/{model_name}" # google/vit-base-patch16-384


  url = 'http://images.cocodataset.org/val2017/000000039769.jpg'
  image = Image.open(requests.get(url, stream=True).raw)
  feature_extractor = AutoFeatureExtractor.from_pretrained(model_id)
  model = SwinForImageClassification.from_pretrained(model_id)
  inputs = feature_extractor(images=image, return_tensors="pt")
  outputs = model(**inputs)
  logits = outputs.logits
  # model predicts one of the 1000 ImageNet classes
  predicted_class_idx = logits.argmax(-1).item()
  print("Predicted class:", model.config.id2label[predicted_class_idx])


  # export
  model_path = f"{model_name}.onnx"
  torch.onnx.export(
    model,
    tuple(inputs.values()),
    f=model_path,
    do_constant_folding=True,
    opset_version=13,
    input_names=["input"],
    output_names=["output"]
  )


  # simplify
  model = onnx.load(model_path)
  model_simp, check = simplify(model)
  assert check, "Simplified ONNX model could not be validated"
  simp_path = f"{model_name}_sim.onnx"
  onnx.save(model_simp, simp_path)


def main():
  download_swin_model(model_name="swin-tiny-patch4-window7-224") # microsoft/swin-tiny-patch4-window7-224


if __name__ == "__main__":
  main()

3.2 模型编译

Pulsar2为了提升用户使用体验,降低Pulsar客户迁移的学习成本,基本上延续了原有风格,包括Docker环境安装、命令行指令、配置文件修改参数仿真功能等。同时针对编译速度慢的痛点,进行了大幅度优化,模型编译的耗时相比第一代工具链平均降低了一个数量级(分钟->秒)。

$ pulsar2 build --input model/swin-t.onnx --output_dir output --config config/swin-t.json --target_hardware=AX650
32 File(s) Loaded.
[10:22:36] AX Quantization Config Refine Pass Running ... Finished.
[10:22:36] AX Quantization Fusion Pass Running ...    Finished.
[10:22:36] AX Quantize Simplify Pass Running ...     Finished.
[10:22:36] AX Parameter Quantization Pass Running ...   Finished.
Calibration Progress(Phase 1): 100%|████████| 32/32 [00:08<00:00,  3.92it/s]
Finished.
[10:22:45] AX Passive Parameter Quantization Running ...  Finished.
[10:22:45] AX Parameter Baking Pass Running ...           Finished.
[10:22:45] AX Refine Int Parameter pass Running ...       Finished.
Network Quantization Finished.
quant.axmodel export success: output/quant/quant_axmodel.onnx
Building native ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% 0:00:00
......
2023-04-13 10:23:07.109 | INFO     | yasched.test_onepass1475 - max_cycle = 6689562
2023-04-13 10:23:25.765 | INFO     | yamain.command.build832 - fuse 1 subgraph(s)

从编译log中我们大致看出,计算图优化、PTQ量化、离线编译总共耗时只需50秒。然后我们来看一下大家比较关心的MHA结构变成了什么样子:

b1e98f68-daca-11ed-bfe3-dac502259ad0.png

MHA ONNX原始结构

b214ffc2-daca-11ed-bfe3-dac502259ad0.png

MHA由工具链进行图优化之后的quant.axmodel结构

3.3 仿真运行

在这一代工具链,我们提供更方便的pulsar2-run-helper的插件,可以模拟NPU计算流程,方便提前获得上板运行结果。(请大家记住仿真运行的结果,后续章节将与上板实际部署的推理结果进行比对)

python3 cli_classification.py --post_processing --axmodel_path models/swin-t.axmodel --intermediate_path sim_outputs/0
[I] The following are the predicted score index pair.
[I] 2.6688, 285
[I] 1.9528, 223
[I] 1.8877, 279
[I] 1.8877, 332
[I] 1.8226, 282

04

上板部署

AX650N Demo板的BSP上已经预装了NPU模型测试需要的工具

/root # sample_npu_classification -m swin-t.axmodel -i cat.jpg -r 100
--------------------------------------
model file : swin-t.axmodel
image file : cat.jpg
img_h, img_w : 224 224
--------------------------------------
Engine creating handle is done.
Engine creating context is done.
Engine get io info is done.
Engine alloc io is done.
Engine push input is done.
--------------------------------------
2.6688, 285
1.9528, 223
1.8877, 332
1.8877, 279
1.8226, 282
--------------------------------------
Repeat 100 times, avg time 8.64 ms, max_time 8.65 ms, min_time 8.64 ms
--------------------------------------

对比上一章节的仿真结果,完全一致。

4.1 算力分配

AX650N的10.8Tops@Int8的算力其实是可分配的,上述内容中,按照默认的编译选项,其实只发挥了一部分算力(3.6Tops@Int8)。我们来看看满算力下的耗时表现如何呢?

/root # ax_run_model -m swin-t-npu3.axmodel -r 100
Run AxModel:
   model: swin-t-npu3.axmodel
    type: NPU3
    vnpu: Disable
  affinity: 0b001
   repeat: 100
   warmup: 1
   batch: 1
  tool ver: 1.0.0
 ------------------------------------------------------
 min =  3.769 ms  max =  3.805 ms  avg =  3.778 ms
 ------------------------------------------------------
/root #
/root # sample_npu_classification -m swin-t-npu3.axmodel -i cat.jpg -r 100
--------------------------------------
model file : swin-t-npu3.axmodel
image file : cat.jpg
img_h, img_w : 224 224
--------------------------------------
Engine creating handle is done.
Engine creating context is done.
Engine get io info is done.
Engine alloc io is done.
Engine push input is done.
--------------------------------------
2.6688, 285
1.9528, 223
1.8877, 332
1.8877, 279
1.8226, 282
--------------------------------------
Repeat 100 times, avg time 3.78 ms, max_time 3.79 ms, min_time 3.77 ms
--------------------------------------

05

性能统计

算力 耗时(ms) 帧率(fps)
3.6Tops@Int8 8.64 115
10.8Tops@Int8 3.77 265

NPU工具链的性能优化是个长期坚持的过程,最新版本的性能数据会更优秀。





审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • gpu
    gpu
    +关注

    关注

    28

    文章

    4673

    浏览量

    128558
  • cnn
    cnn
    +关注

    关注

    3

    文章

    350

    浏览量

    22128
  • 卷积神经网络

    关注

    4

    文章

    359

    浏览量

    11829
  • ChatGPT
    +关注

    关注

    29

    文章

    1546

    浏览量

    7346

原文标题:爱芯分享 | 基于AX650N部署Swin Transformer

文章出处:【微信号:爱芯元智AXERA,微信公众号:爱芯元智AXERA】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    基于AX650N芯片部署MiniCPM-V 2.0高效端侧多模态大模型

    今年4月份,面壁智能&清华大学自然语言处理实验室推出MiniCPM系列的最新多模态版本MiniCPM-V 2.0。该模型基于MiniCPM 2.4B和SigLip-400M构建,共拥有
    的头像 发表于 07-15 09:34 707次阅读
    基于<b class='flag-5'>AX650N</b>芯片<b class='flag-5'>部署</b>MiniCPM-V 2.0高效端侧多模态大<b class='flag-5'>模型</b>

    基于AX650N/AX630C部署端侧大语言模型Qwen2

    本文分享如何最新的端侧大语言模型部署超高性价比SoC,向业界对端侧大
    的头像 发表于 07-06 17:43 3118次阅读
    基于<b class='flag-5'>AX650N</b>/<b class='flag-5'>AX</b>630C<b class='flag-5'>部署</b>端侧大语言<b class='flag-5'>模型</b>Qwen2

    使用PyTorch搭建Transformer模型

    Transformer模型自其问世以来,在自然语言处理(NLP)领域取得了巨大的成功,并成为了许多先进模型(如BERT、GPT等)的基础。本文深入解读如何使用PyTorch框架搭建
    的头像 发表于 07-02 11:41 1394次阅读

    爱芯元智AX620E和AX650系列芯片正式通过PSA Certified安全认证

    万物互联的时代,安全性已成为物联网产品设计及部署的基本要求。近日,爱芯元智AX620E和AX650系列芯片(包含AX630C/AX620Q/
    的头像 发表于 04-23 15:45 726次阅读
    爱芯元智<b class='flag-5'>AX</b>620E和<b class='flag-5'>AX650</b>系列芯片正式通过PSA Certified安全认证

    使用CUBEAI部署tflite模型STM32F0中,模型创建失败怎么解决?

    看到CUBE_AI已经支持STM32F0系列芯片,就想拿来入门嵌入式AI。 生成的模型很小,是可以部署F0的,但是一直无法创建成功。
    发表于 03-15 08:10

    【爱芯派 Pro 开发试用体验】在爱芯派 Pro上部署坐姿检测

    。考虑AX650N强大的能力,直接在编译。 首先,git clone https://github.com/AXERA-TECH/ax
    发表于 01-16 22:41

    【爱芯派 Pro 开发试用体验】+ 图像分割和填充的Demo测试

    的实时分割和进一步可选修复。原始代码由爱芯官方开源于 GITHUB:https://github.com/AXERA-TECH/SAM-ONNX-AX650-CPP。仓库内的文本介绍了如何在AX650N
    发表于 12-26 11:22

    【爱芯派 Pro 开发试用体验】ax650使用ax-pipeline进行推理

    /AXERA-TECH/ax-pipeline.git 下载sdk cd ax-pipeline ./download_ax_bsp.sh ax650 cd
    发表于 12-19 17:36

    【爱芯派 Pro 开发试用体验】部署爱芯派官方YOLOV5模型

    继上文开箱后,本文主要依托爱芯元智官方的实例,进行官方YOLOV5模型部署和测试。 一、环境搭建 由于8核A55的SoC,加上目前Debian OS的工具齐全,所以决定直接在编译
    发表于 12-12 22:58

    【爱芯派 Pro 开发试用体验】模型部署(以mobilenetV2为例)

    要干的是在你的电脑,把onnx模型转换为他能跑的模型,也就是axmodel模型 这里面的docker安装什么的具体可以参照这个网站,他们都讲得很详细,我不赘述了:
    发表于 12-10 16:34

    【爱芯派 Pro 开发试用体验】爱芯元智AX650N部署yolov8s 自定义模型

    爱芯元智AX650N部署yolov8s 自定义模型 本博客向你展示零基础一步步的部署好自己的yolov8s
    发表于 11-24 20:40

    【爱芯派 Pro 开发试用体验】开箱测试

    感谢电子爱好者和爱芯元智公司提供的测试机会。 爱芯派 Pro (AXera-Pi Pro)搭载爱芯元智第三代高算力、高能效比智能视觉芯片 AX650N,内置高算力和超强编解码能力,满足行业对高性能
    发表于 11-20 22:09

    【爱芯派 Pro 开发试用体验】爱芯元智AX650N部署yolov5s 自定义模型

    爱芯元智AX650N部署yolov5s 自定义模型 本博客向你展示零基础一步步的部署好自己的yolov5s
    发表于 11-16 19:34

    【爱芯派 Pro 开发试用体验】篇一:开箱篇

    爱芯派 Pro (AXera-Pi Pro)M4N Dock 是一款集成了高算力、高能效 AI SOC 的开发。它采用了爱芯 AX650N 作为主控芯片。AX650N 集成了 8 核
    发表于 11-15 11:32

    【爱芯派 Pro 开发试用体验】使用yolov5s模型(官方)

    :/home/ax-samples/build/install/ax650# 后续摸索部署自己的yolov5模型m4
    发表于 11-13 11:04