一、CE3226 之 算法模型的移植(Classifier) 简介
MagicMind 是面向寒武纪MLU(Machine Learning Unit,机器学习单元)的推理加速引擎。MagicMind 能将深度学习框架(Tensorflow,Pytorch 等)训练好的算法模型转换成MagicMind 统一计算图表示,并提供端到端的模型优化、代码生成以及推理业务部署能力。MagicMind 致力于为用户提供高性能、灵活、易用的编程接口以及配套工具,让用户能够专注于推理业务开发和部署本身,而无需过多关注底层硬件细节。
MM 的部署流程:
以上是我们的工程运行环境,下面来看具体的步骤,所使用的环境为 Ubuntu16.04 + docker ,开发板为 ce3226,内核为0.8 。
1.1、mlu 驱动安装
量化的过程在ce3226中,需要先将mlu 驱动安装,进入ce3226 终端,运行脚本如下:
/mps/ko 进入,运行 drv.sh 脚本
1.2、 数据集准备
运行本示例前,用户需自行配置对应的深度学习框架模型和数据集,寒武纪提供了部分可用于benchmark的网络模型/数据集列表,见《寒武纪MagicMind Benchmark指南》`模型和数据集`章节。
以ResNet50举例:
- 使用的数据集为:ILSVRC2012_img_val.tar,可在imagenet官网下载或者联系寒武纪技术支持人员获取。
图片列表如下:
ILSVRC2012_val_00000001.JPEG
ILSVRC2012_val_00000002.JPEG
...
ILSVRC2012_val_00001000.JPEG
- 从官网下载ResNet50网络权重和模型。
- 自行或使用sample中提供的Python脚本将数据集中的图片做预处理。用户如果在寒武纪提供的docker中,没有Python环境,请先运行如下指令:
apt-get update
apt-get install vim
apt-get install python3-pip
apt install libgl1-mesa-glx
pip3 install --upgrade pip
pip3 install numpy
pip3 install opencv-python
也可以在其他环境上生成预处理文件夹。该Python环境仅用来实现预处理,不影响其他程序运行。
mkdir output
python3 preprocess.py --labels ./path/to/labels.txt --image_path ./path/to/imagenet_val/ --save_path ./path/to/output/
sample文件夹内预先提供了1000张图片的labels.txt,请用户自行根据实际运行数据集调整。
1.3、 模型量化并转换
sample_calibration 是基于Caffe模型,向用户展示如何使用MagicMind的API进行模型解析、量化校准、编译、部署并运行的例子。位置如下:
samples\magicmind\basic_samples\sample_calibration
工作原理介绍:
本示例基于MagicMind C++ API,展示模型解析到运行的整体流程,包括:
- 基于Caffe模型解析并生成INetwork。
- 基于校准数据集进行量化校准。
- 用户选择量化类型,包括对称量化和非对此量化,默认为对称量化
- 配置并构建网络。
- 序列化模型,生成`model`。
- 反序列化模型并实例化IModel。
- 从IModel初始化并配置IEngine。
- 从IEngine实例化运行时IContext用于运行网络。
- 计算图片集并输出精度(Top1/Top5)。
运行 sample_server ,使用rpc 服务
[root@cambricon /userdata]# cd bin/
[root@cambricon /userdata/bin]# ls
sample_server
[root@cambricon /userdata/bin]# ./sample_server
1970-01-01 01:42:34.728803: INFO: magicmind/runtime/remote/rpc_server.cc:282] Server listening on 0.0.0.0:9009
以下为编译过程:
cd /usr/local/neuware/samples/magicmind/basic_samples/sample_remote
mkdir build
cd build
cmake -DABI=1 ..
make
得到量化模型的工具sample_calic, 然后使用工具来量化转换模型
./sample_calib /inference/models/resnet50/ResNet-50-deploy.prototxt /inference/models/resnet50/
,→ResNet-50-model.caffemodel ../../sample_calibration/labels.txt ../../sample_calibration/
,→output_224/
最终得到量化后的模型remote_model
1.4、 编译并在板子中执行代码
工程位置如下:
cd /usr/local/neuware/samples/magicmind/basic_samples/sample_calibration/edge
在之前先配置在板子中的环境:
export ABI_MODE=1
export NEUWARE_HOME=/usr/local/neuware/edge/
export TOOLCHAIN_DIR=/tmp/gcc-linaro-6.2.1-2016.11-x86_64_aarch64-linux-gnu/
./build_for_edge.sh
编译出来 infer_model 可执行文件
把build 里面的infer_model 拷贝到EVB 板子上,同时也把处理好的数据集和模型拷贝到板子上,然后
运行
./infer_model ./output_224_nhwc/ labels.txt remote_model
结果如下所示:
[root@cambricon /userdata/karl]# ./infer_model ./output_224_nhwc/ labels.txt rem
ote_model
1970-01-01 00:36:03.347286: INFO: magicmind/runtime/core/model.cc:158] Create Engine Finish!
[MMINFO] top1:0.000000 top5:0.000000
注:该部分结果有点问题,但是已经解决,需要后续修改。
二、总结
这部分博文主要介绍了,如何将模型量化后移植到CE3226的开发板中并执行,需要有数据还有运行驱动,开启rpc 服务。
三、参考资料
【1】《Lesson8 CE3226 算法模型的移植(Classifier).pdf》
【2】《Cambricon-MagicMind-Best-Practices-Guide-CN-v0.7.0.pdf》
评论