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
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结构的网络也有较好的支持。
pulsar2 deploy pipeline
3.1 模型下载
从swin transformer的官方仓库获取模型,由于是基于pytorch训练,导出的是原始的pth模型格式,而对于部署的同学而言,更喜欢使用onnx模型进行后续的产品落地,为了方便测试,我们提供该模型的onnx版本导出脚本,降低模型获取门槛,便于之前不熟悉的同学直接掌握其中的关键操作。
import onnximport torchimport requestsfrom onnxsim import simplifyfrom pil import imagefrom transformers import autofeatureextractor, swinforimageclassificationdef 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-224if __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=ax65032 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.onnxbuilding native ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% 0:00:00......2023-04-13 10:23:07.109 | info | yasched.test_onepass1475 - max_cycle = 66895622023-04-13 10:23:25.765 | info | yamain.command.build832 - fuse 1 subgraph(s)
从编译log中我们大致看出,计算图优化、ptq量化、离线编译总共耗时只需50秒。然后我们来看一下大家比较关心的mha结构变成了什么样子:
mha onnx原始结构
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.axmodelimage file : cat.jpgimg_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, 2851.9528, 2231.8877, 3321.8877, 2791.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 100run 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.axmodelimage file : cat.jpgimg_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, 2851.9528, 2231.8877, 3321.8877, 2791.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工具链的性能优化是个长期坚持的过程,最新版本的性能数据会更优秀。
宜鼎国际新推符合MO-297的SATA Slim SSD
2023年爆红的Redcap,能否复制Cat.1的神迹?
普通灯改智能家居灯?灯具选择看哪些方面?
两个DIY电动窗帘电路的电路图分析
由SMP04与仪表放大器构成的具有防护驱动的 12V单电源采样仪器放大电路
如何优雅地将Swin Transformer模型部署到AX650N Demo板上?
智慧水产养殖解决方案功能
湿度传感器的发展趋势研究分析
选择合适CPU会对整个SoC系统的性能产生什么影响?
企业如何采用新的存储技术替代原有的数据库
工业级连接器如何做到高抗冲击性?选款一定要了解这几点
APS排程软件帮机械加工企业解决交期承诺问题
东芝可折分Win8平板神秘现身
怎么判断电动车充电器是否正常充电?
e络盟为新一代产品工程师引入Raspberry Pi革命性电脑平台
易华录加入昇腾万里伙伴计划,打造部署了交路口秩序管理一体机
如何挑选更适合的工业以太网交换机?
中国电信将坚持SA目标组网方向加快推进5G创新发展
广西某部会议室数字手拉手会议系统及音响设备
华为云为你开启更快速的CDN加速服务