一、内容和目标
1. 实验内容
-
本实验主要介绍基于寒武纪 MLU370 MagicMind 平台的YOLOv5m (PyTorch, Python, INT8)目标检测推理应用的开发方法,其中性能优化操作包括:INT8量化、集成后处理自定义算子。
-
基于 YOLOv5m 检测网络和寒武纪 MLU370 MagicMind 平台,您可以读取本地图像数据作为输入,对图像数据中的目标物体进行时识别,得到物体的在图像中的坐标、置信度以及类别。
2. 实验目标
-
掌握使用寒武纪推理引擎 MagicMind 进行模型量化推理及融合算子的基本方法。
-
理解 YOLOv5m 模型的整体网络结构及其开发调试细节。
二、前置知识
1. 寒武纪软硬件平台介绍
-
硬件:寒武纪 MLU370 AI 加速卡
-
框架:PyTorch 1.6、MagicMind 0.14.0
2. MagicMind 介绍
MagicMind 是⾯向寒武纪 MLU370 (寒武纪处理器,简称MLU) 的推理加速引擎。 MagicMind 能将人工智能框架(TensorFlow,PyTorch 等)训练好的算法模型转换成 MagicMind 统⼀计算图表⽰,并提供端到端的模型优化、代码⽣成以及推理业务部署能⼒。用户无需过多关注底层硬件细节,只需专注于推理业务开发。
获取更多有关 MagicMind 资料,请参考 寒武纪官网文档中的相关内容。
三、网络结构
针对不同大小(n,s,m,l,x)的网络,YOLOv5的整体架构不变,但会根据yaml文件中定义的depth_mutiple
和width_mutiple
参数,对每个子模块进行不同深度和宽度的缩放。
以 YOLOv5m 为例,其网络结构主要由以下几部分组成:
-
Backbone: Conv(CBS), C3, SPPF
-
Head: Conv(CBS), C3, Upsample, Concat
-
Detect: Decode, nms, topk(CPU端运行,不参与训练)
网络结构如下图所示:
其中:
-
CBS: 由 Conv + BN2d + SiLU 三者组成
-
C3: CSP Bottleneck with 3 convolutions,结构图上图所示
-
SPPF: Spatial Pyramid Pooling (Fast),空间金字塔池化结构,功能不变前提下提升运行速度
注意后处理部分也使用 MLU 进行计算得出。
四、模型推理
模型推理整体流程如下图所示,主要包含模型工程准备,模型转换和模型推理三部分。
STEP 1. 工程准备
-
原生工程下载:下载原始 YOLOv5 工程,本实验已经提供工程环境,yolov5源代码在
src/models/
目录下。 -
预训练模型下载:下载 yolov5m 预训练模型,并将其放置于
yolov5_model
目录下,本实验的sh已自动操作。 -
搭建环境:安装本实验所需的额外环境,本实验的sh 已自动操作。
STEP 2. 模型转换
-
删除yolov5m模型的原始后处理算子:需要修改
models/yolo.py Detect
类代码,然后重新生成不带后处理的 YOLOv5m pt 模型。 -
重新生成pt 的模型
-
配置量化数据校准器:MagicMind 提供了量化校准器(Calibrator),它⽀持 post-training 量化功能,能够基于浮点模型和样本数据计算并设置数据的分布范围,并且可以根据权重数据的分布特点,选择不同的量化粒度。
-
添加MagicMind 高性能 yolov5后处理算子:MagicMind 框架算子库中已集成高性能 yolov5 后处理算子。基于寒武纪硬件平台,该算子使用寒武纪 BANG C 语言编写,相对原始 YOLOv5 后处理算子做了线性代数加速操作,使得性能大幅提升。
-
执行量化并保存MagicMind 模型:使用 MagicMind 模型生成接口可以生成MagicMind 二进制模型,用于下一步的 MagicMind 推理。
STEP 3. 模型推理
-
前处理:通过缩放比例,padding处理返回处理后的图像数据。
-
利用 MagicMind 进行推理:
3. 后处理:MagicMind 统一处理 NMS 等后处理操作。
五、相关链接
实验代码仓库:https://gitee.com/cambricon/practices
Modelzoo仓库:https://gitee.com/cambricon/modelzoo