作者:裴凡江
概要
Movidius神经计算棒(NCS – Neural Computing Stick)是Movidius推出的基于Myriad 2视觉处理单元(VPU – Visual Processing Unit)的神经计算棒,其最大的特性是可以在1瓦的功率下提供超过每秒1000亿次浮点运算的性能。这一特性使它可以被集成到低功耗的便携设备上,让这些低功耗设备也具有直接运行实时深度神经网络(DNN – Deep Neural Network)的能力,从而使得各种人工智能应用都能够离线部署。
通常来说,开发使用NCS的应用主要分为三个步骤:
- NN模型的训练:这一阶段的工作主要是训练出DNN模型,需要在运算能力强大的工作站或者服务器上进行。目前NCS支持Caffe和Tensorflow框架训练出来的模型。
- DNN模型的编译和调优:NCS的VPU是无法直接运行第一步骤中训练好的Caffe/TensorFlow模型的(比如Caffe框架训练出的caffemodel文件)。NCS SDK提供了专门的工具用于编译和优化Caffe/TensorFlow模型,最终将模型编译成NCS可以运行的专用模型文件(graph)。这一阶段的工作通常在运行Ubuntu的台式机或者笔记本上完成。
- 最后一步我们将在目标设备(集成NCS硬件的设备)上调用 NCS SDK API运行DNN模型。NCS SDK API提供了Python和C语言的支持。下文我们运行Caffe图片分类模型时将给出基于Python的实现。
使用NCS运行Caffe图片分类模型
准备工作
- 装备Ubuntu 16.04操作系统的Intel x86_64开发机;
- 将NCS通过USB 3.0接口连接开发机;
- 安装Movidius NCS SDK和Caffe到开发机,详细安装手册可以参考以下链接:https://software.intel.com/zh-cn/articles/how-to-deploy-tensorflow-and-caffe-for-intel-hardware-platform-into-movidius-ncs-sdk
训练Caffe图片分类的DNN模型
DNN网络的训练并不是此文的目的,这里我们直接借用以下文档中所训练出的Caffe模型和测试数据集。读者可以自行按照文档的步骤训练出完全一致的Caffe模型(文档提供基于Windows系统的操作指南,其在Ubuntu系统下同样适应)https://software.intel.com/zh-cn/articles/the-caffe-practice-on-windows-the-war-between-cat-and-dog
DNN模型的编译
如前文所述,Caffe训练出来的DNN模型是无法直接运行到NCS上的,我们需要使用NCS SDK所提供的编译工具mvNCCompile将Caffe模型编译成专用的graph文件:
mvNCCompile ./dogsvscats.prototxt -w stored_model_iter_10000.caffemodel -s 12 -o ./dogvscat_test.graph
相关参数说明:
-w:需要编译的Caffe模型
-s:最多使用多少个SHAVEs(最大值为12)
-o:编译输出结果(graph文件名)
NCS上运行编译好的DNN模型
完成了DNN模型的编译工作之后,我们就可以调用NCS SDK提供的API,来运行我们的图片分类模型了。为此,我们新建一个python源文件(这里我们命名为image-classifier.py),然后开始我们的Python代码编写工作(注: 以下代码实现参考了Movidius官方提供的示例代码:https://github.com/movidius/ncappzoo/blob/master/apps/image-classifier/image-classifier.py)
首先我们需要引用相关的python模块(这里的mvnc.mvncapi就是NCS SDK提供的Python API封装):
然后我们配置运行图片分类模型所需的参数,包括模型相关的参数,以及图片相关的参数:
参数的补充说明如下:
GRAPH_PATH:通过NCS SDK中的mvNCCompile工具编译好的graph文件
IMAGE_PATH:需要做推理的图片
LABELS_FILE_PATH:label文件
IMAGE_MEAN:图像均值(由训练DNN模型过程中计算得到)
IMAGE_STDDEV:图片缩放值
IMAGE_DIM:图片的维度(由训练DNN模型之前设置)
接下来我们就可以分五个步骤来调用NCS进行推理工作了
运行结果
将以上步骤中涉及到的代码(包括模块引用以及参数设置)保存到image-classifier.py文件并在终端中运行,将会看到类似这样的输出结果:
结语
文中介绍了如何利用单个NCS运行Caffe DNN模型,事实上如果我们将多个NCS同时集成到设备上,那么就可以获得近乎线性的性能提升。比如文章所介绍的图片分类模型,我们可以让不同的NCS实例同时对不同的图片做预测,以获得成倍的性能提升。这在真实应用场景下同样适应,例如我们对摄像头实时捕捉到的图像做物体识别时,同样可以将视频的不同帧按照时序分别交给不同的NCS实例进行识别,以获得加倍的FPS(每秒处理帧数)。
参考文献
NCS SDK快速上手:https://developer.movidius.com/start
NCS SDK与Caffe的集成:https://software.intel.com/zh-cn/articles/how-to-deploy-tensorflow-and-caffe-for-intel-hardware-platform-into-movidius-ncs-sdk
在Windows上的Caffe实战 – 猫狗大战:https://software.intel.com/zh-cn/articles/the-caffe-practice-on-windows-the-war-between-cat-and-dog
NCS SDK参考手册:https://movidius.github.io/ncsdk/
Intel Caffe:https://software.intel.com/zh-cn/ai-academy/frameworks/caffe
NCS 购买:https://developer.movidius.com/buy
关于作者
裴凡江是英特尔酷睿与视觉计算事业部的一名应用软件工程师,专注于在英特尔平台上与开发者的合作和业务拓展。力求将英特尔卓越的软硬件平台与开发者的软硬件产品完美结合,提供最优客户体验。