PS: 这是我2019年2月在公司时测试Intel公司的神经网络加速器openvino的大致流程,之前发在CSDN上,现在发在知乎。明天将更新NVIDIA公司的GPU神经网络加速器 Tensor RT的安装和使用。现在主流的两大加速器,一个是openvino针对CPU,另一个时Tensor RT针对GPU。
#################################################################
openvino是intel公司开发的一款将多种深度学习模型部署于cpu,gpu,fpga等多种平台的软件。它支持tensorflow caffe mxnet等模型的转换,将这些模型的权重与网络结构转换成 .xml 与 .bin文件,它好比计算机语言编译器可以将多种语言编译成二进制代码。避免了开发人员为了同一个业务需求,在不同平台多次开发,多次部署,使用openvino,只需一次开发,就可以将模型部署在多个平台。openvino支持多种基础网络,多种目标检测算法,多种图像分割算法,支持rcnn,支持权重量化操作。
openvino有2个大模块,第一个model optimizer,另一个是inference engine,该模块完全由c++实现。
本人在一家电商公司的图像算法组做实习,到公司第二天丢给我个任务。根据公司业务要求,公司闲置cpu较多,之前上线的tensorflow模型部署于cpu设备上,模型运算速度有慢,于是让我调研使用openvino将tensorflow模型部署在cpu设备,是否能优化模型的计算速度。于是,丢给我上百页openvino的英文文档,真是前无古人,网上有关openvino的资料太少,悲伤的我开始了苦逼的工作,这种活不应该是运维或开发干吗,为啥要丢给一个图像算法组的实习生。
首先,我不太建议按照官方手册去安装,因为需要的依赖太多,安装较难,本人当时就是折腾了好几天没成功,比较慌,但是不怕,已经有人将openvino image上传,那就使用docker安装。
1.sudo docker search openvino
2.sudo docker run -it cortexica/openvino /bin/bash
3.等待。。。安装好了
4.cd/opt/intel/computer_vision_sdk/deployment_tools/model_optimizer/install_prerequisites/
5. ./install_prerequisites_tf.sh(因为我要测试tf,所以安装tf的依赖,在执行这一步之前要确保pip3安装,否则执行失败)
6.中间过程省略,按照官网步骤就可以,重点是介绍使用时的坑软件自带的样例是caffe模型,所以想要测试caffe模型,直cd/opt/intel/computer_vision_sdk/deployment_tools/demo
7.在执行model optimizer时非常重要,这一步做不好,后面使用inference engine会出现2种情况,第一种 inference无法运行,第二种inference可以运行,但是得出的结果不正确
8.官网提供的mo_tf.py负责转换tf模型,mo.py负责转换多种模型。其中,在执行mo_tf.py文件时,我用的.ckpt文件和.pb文件,文档有提供.ckpt文件的下载链接,.pb文件需要从.ckpt文件得到,openvino也提供了将.ckpt转.pb的文件,在我的电脑上是/home/tf_models/reserach/slim/。如果不用它提供的ckpt文件转,会出错。
9.总的来说应该使用该命令:python3 mo_tf.py --input_model xxx.pb --input_checkpoint xxx.ckpt --input_sahpe [1,299,299,3] --reverse_input_channels --mean_values[127.5,127.5,127.5] --scale_values [127.5]
解释下这个命令,文档并没有给出这个命令,这是我摸索出来的。我使用的是inception v3模型,所以图像输入大小是[299,299],如果不指定–input_shape 大小,就会报错。文档或者程序报错提示[-1,299,299,3],这种输入对于inference engine是为未义的,inference engine不支持未定义输入,如果不指定input_shape那就一定要指定batch大小,使用参数 -b。
inference engine读入的通道是BGR,我猜可能是使用opencv,但是我们的模型被训练时可能使用的RGB通道,如果不使用–reverse_input_channels,那么inference的结果就会不正确,但是使用了–reverse_input_channels, 就还得使用–mean_values 和scale_values, 这2个参数值要在openvino文档查阅,根据模型不同,数值不同。
至此,大坑介绍完毕,我在这上折腾了好几天。如果想单线程测试openvino,openvino的多线程的实现使用的是openMP,expor OMP_NUM_THREADS=1。如果想单核测试openvino,我用的方法是,在创建容器时:docker run -it --cpus=1
10.说一下,本人亲测openvino的速度和准确率。我大概使用了80张图片,一共10个类别。大多数类别的识别top-1准确度100%。
我使用的cpu Xen® E5-26xx v4
batch=9:单线程测试,平均推断时间1468ms
单核测试,1641ms
16线程测试,348ms