MagicMind 是面向寒武纪 MLU 推理加速引擎。MagicMind 能将 AI 框架(Tensorflow, PyTorch, Caffe, ONNX 等) 训练好的算法模型转换成 MagicMind 统一计算图表示,并提供端到端的模型优化、代码生成以及推理业务部署能力。
本 sample 探讨如何使用将 yolov3 网络的 Caffe 模型转换为 MagicMind 模型,进而部署在寒武纪CE3226板卡上。
本例使用的yolov3实现来自github开源项目https://github.com/pjreddie/darknet。下面将展示如何将该项目中Caffe实现的yolov3模型转换为MagicMind的模型。
请移至主页面 README.md的2.前提条件
.
|-- README.MD
|-- data
|-- benchmark
|-- env.sh
|-- gen_model
|-- infer_cpp
`-- run.sh
目录结构说明:
- data: 用于暂存测试结果,保存模型等;
- benchmark: 提供mm_run测试脚本,用于测试该模型在不同输入规模、不同数据精度、不同硬件设备下的性能;同时提供精度验证功能;
- gen_model: 主要涉及模型量化和转为mm engine过程,要求内部能够一键执行完成该模块完整功能;
- env.sh: 环境变量,需要在模型运行之前source env.sh;
- infer_cpp: 主要涉及该模型推理的端到端(包含前后处理)的c++源代码、头文件、编译脚本和运行脚本等,要求内部能够一键编译和执行完成该模块完整功能;
- run.sh: 顶层一键执行脚本,串联各个部分作为整个sample的一键运行脚本;
请移至主页面 README.md的3.环境准备
# 下载仓库
git clone http://gitlab.software.cambricon.com/neuware/software/ae/ecosystem/modelzoo/magicmind_edge.git
cd magicmind_edge/buildin/cv/detection/yolov3_caffe/
运行前,请检查以下路径,或执行source env.sh
:
export PROJ_ROOT_PATH="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
export MAGICMIND_EDGE="$( cd $PWD/../../../../ && cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
export COCO_DATASETS_PATH=$MAGICMIND_EDGE/datasets/coco
export UTILS_PATH=$MAGICMIND_EDGE/buildin/cv/utils
export THIRD_PARTY=$MAGICMIND_EDGE/buildin/cv/3rdparty
export MM_RUN_PATH=/mps/bin/
注意:数据集默认保存在 $MAGICMIND_EDGE/datasets/ 路径下,请用户自行创建或挂载。
设置REMOTE_IP与REMOTE_DIR
export REMOTE_IP=* #edge端ip地址
export REMOTE_DIR=* #magicdmind 挂载在edge端的路径
以下4.5~4.9的步骤,均可以通过:
bash run.sh
实现一键运行,该脚本包含数据集、模型的自动下载,模型转换与生成,推理代码编译与运行,性能精度测试流程。
注:
一键运行脚本中包含模型与数据集的自动下载,部分数据集与模型由于网络、链接等原因无法自动下载时,需要用户根据README.MD中链接地址手动下载到指定位置。
下面对一键运行脚本中各个步骤进行逐步解析。
- 下载数据集
cd $COCO_DATASETS_PATH
wget -c http://images.cocodataset.org/zips/val2017.zip
unzip -o val2017.zip
wget -c http://images.cocodataset.org/annotations/annotations_trainval2017.zip
unzip -o annotations_trainval2017.zip
- 下载模型
cd $PROJ_ROOT_PATH/data/models/
wget https://raw.githubusercontent.com/pjreddie/darknet/master/cfg/yolov3.cfg --no-check-certificate
wget https://pjreddie.com/media/files/yolov3.weights --no-check-certificate
- darknet2caffe
将darknet原生的yolov3.cfg和yolv3.weight转换为本仓库所需要的yolov3.caffemodel和yolov3.prototxt,请参考这里。
cd $PROJ_ROOT_PATH/gen_model
#param: quant_mode batch_size
bash run.sh qint8_mixed_float16 1
上述 run.sh 脚本中默认使用远程3226卡板进行模型生成,即设置了REMOTE_IP环境变量。
当本地为 MLU370 环境时,可直接执行以下命令进行模型生成:
python gen_model.py \
--caffe_prototxt $PROJ_ROOT_PATH/data/models/yolov3_416.prototxt \
--caffe_model $PROJ_ROOT_PATH/data/models/yolov3_416.caffemodel \
--datasets_dir $COCO_DATASETS_PATH/val2017 \
--mm_model $PROJ_ROOT_PATH/data/models/yolov3_${QUANT_MODE}_${BATCH_SIZE}.mm \
--quant_mode ${QUANT_MODE} \
--batch_size ${BATCH_SIZE}
生成的Magicmind模型默认保存在在$PROJ_ROOT_PATH/data/models文件夹中。
有关更多生成MagicMind模型参数相关设置,请参考寒武纪Magicmind用户手册。
进入infer_cpp目录,在当前目录编译生成可执行文件edge_infer
:
cd $PROJ_ROOT_PATH/infer_cpp
bash build.sh
推理:
#parameter: quantmodel batchsize
bash run.sh qint8_mixed_float16 1
cd $PROJ_ROOT_PATH/benchmark
bash eval.sh
结果:
Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.375
Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.678
Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.383
Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.206
Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.428
Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.526
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.301
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.456
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.486
Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.313
Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.539
Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.624
本仓库通过寒武纪提供的MagicMind性能测试工具mm_run展示性能数据
#查看参数说明
mm_run -h
mm_run --magicmind_model $PROJ_ROOT_PATH/data/models/yolov3_qint8_mixed_float16_1.mm --threads 1 --iterations 1000
或者通过一键运行benchmark里的脚本:
cd $PROJ_ROOT_PATH/benchmark
bash perf.sh qint8_mixed_float16 1
Caffe yolov3模型转换为MagicMind yolov3模型分成以下几步:
- 使用MagicMind Parser模块将caffe文件解析为MagicMind网络结构。
- 模型量化。
- 使用MagicMind Builder模块生成MagicMind模型实例并保存为离线模型文件。
参数说明:
caffe_model
: yolov3 caffe的权重路径。prototxt
: yolov3 caffe的网络结构路径。output_model_path
: 保存MagicMind模型路径。image_dir
: 校准数据文件路径。quant_model
: 量化模式,如force_float32,force_float16,qint8_mixed_float16。batch_size
: batch大小,默认为1remote_addres
: (可选)远端IP地址,是否采用远端量化方式。
概述: 本例使用MagicMind C++ API编写了名为infer_cpp的视频检测程序。infer_cpp将展示如何使用MagicMind C++ API构建高效的yolov3目标检测(图像预处理=>推理=>图像后处理)。相关代码存放在infer_cpp目录下可供参考。其中程序主要由以下内容构成:
- infer.hpp, infer.cpp: 高效率的将MagicMind模型运行在MLU板卡上。
- pre_process.hpp, pre_process.cpp: 前处理。
- post_precess.hpp, post_precess.cpp: 后处理。
您明确了解并同意,以下链接中的软件、数据或者模型由第三方提供并负责维护。在以下链接中出现的任何第三方的名称、商标、标识、产品或服务并不构成明示或暗示与该第三方或其软件、数据或模型的相关背书、担保或推荐行为。您进一步了解并同意,使用任何第三方软件、数据或者模型,包括您提供的任何信息或个人数据(不论是有意或无意地),应受相关使用条款、许可协议、隐私政策或其他此类协议的约束。因此,使用链接中的软件、数据或者模型可能导致的所有风险将由您自行承担。
- COCO VAL2017 数据集下载链接:http://images.cocodataset.org/zips/val2017.zip
- COCO VAL2017 标签下载链接:http://images.cocodataset.org/annotations/annotations_trainval2017.zip
- YOLOV3 caffemodel file下载链接:https://www.dropbox.com/s/bf5z2jw1pg07c9n/yolov3_resnet18_ucf101_r2_ft_iter_20000.caffemodel?dl=0
- YOLOV3 prototxt file下载链接:https://raw.githubusercontent.com/xiaoqi25478/network_resources/main/yolov3.prototxtdl=0