如何将针对英特尔硬件平台优化编译的TensorFlow和Caffe部署到Movidius NCS SDK中

作者:裴凡江

概要

目前Movidius NCS SDK (版本号1.10.01)同时支持Caffe和TensorFlow两种机器学习框架。在Ubuntu 16.04版本的SDK安装过程中,SDK安装程序默认会下载官方的Caffe和TensorFlow,这样确保SDK安装完成之后,示例代码一定够顺利跑起来,对新手开发者非常友好。然而对于有经验的开发者,他们的机器中往往已经存在针对本机优化编译过的TensorFlow/Caffe,比如加入了AVX/MKL/OpenCL等优化的TensorFlow,这比Google开源的CPU编译版本性能有巨大的提升。比如针对Intel多核CPU专门优化的Intel Caffe,或者是针对Intel GEN GPU优化过的clCaffe,在对应的硬件平台上也会比官方默认的Caffe版本有巨大的性能提升。本文将给出一些方法,指导读者如何将针对Intel硬件平台优化编译的TensorFlow和Caffe部署到Movidius NCS SDK中。

Movidius NCS SDK的安装过程解析

为了方便新手快速上手,NCS SDK安装过程设计的非常简明,整个安装过程严格来说只有两个实质性的命令:

1. git clone https://github.com/movidius/ncsdk.git // 复制SDK安装工具到本地,需要注意是这个命令克隆到本地的只是SDK的安装工具,并不是SDK本身,真正的SDK将在执行第2个命令的时候被下载并安装;

2. make install // 执行SDK安装工具,将SDK下载并安装到本地,这个过程包括了一些配置的工作,SDK二进制/库文件的下载,以及Caffe/TensorFlow深度学习框架的部署等;

在Caffe/Tensorflow深度学习框架部署这方面,SDK安装工具配备了一个专门的配置文件(文件名为ncsdk.conf,文件位于安装工具源码的根目录),以下是文件的内容:

从配置文件内容中我们可以看出,NCS SDK默认会下载并安装官方的Caffe(INTEL_CAFFE=no),并且默认会下载并安装TensorFlow(INSTALL_TENSORFLOW=yes)。换言之,NCS SDK并不会优先集成本地已经存在的Caffe/TensorFlow。

为了深入了解NCS SDK部署Caffe/TensorFlow的细节,我们分析了SDK安装工具的源码(git仓库根目录的install.sh),从最开头的一段代码中,我们可以看到真正的SDK的下载链接藏在AWS中(http://ncs-forum-uploads.s3.amazonaws.com/ncsdk/ncsdk_01_10_01/ncsdk_redirector.txt),

点击图片看大图

基于这个信息,我们下载并解压了真正的SDK,然后得到了其中的内容:

最后我们结合了SDK安装工具的install.sh 以及 SDK中的install-ncssdk.sh,总结出了SDK安装的大致过程如下:

a) 下载真正的SDK并解压;

b) 将用户的配置文件(就是前文提到的SDK安装工具中的ncsdk.conf)替换掉SDK中的配置文件;

c) 运行SDK根目录的install-ncssdk.sh – 这个脚本做了大部分最重要的工作,包括下载安装Linux依赖库,下载安装python以及诸多python依赖库,下载并安装/编译深度学习的两个框架(Caffe/TensorFlow),安装Movidius私有的库/二进制等;

d) 清理安装过程的临时文件;

对于我们最关心的Caffe/TensorFlow的部署,我们发现具体的逻辑是这样的(详细的代码请参考SDK安装工具的install.sh 以及 SDK中的install-ncssdk.sh):

1. 对于TensorFlow,SDK安装时首先检查ncsdk.conf中相关配置,如果配置下载TensorFlow(默认),则下载并安装Google官方的TensorFlow 1.3 CPU 编译版本;

2. 对于Caffe,安装程序首先会检查当前是否已经有可以被NCS SDK使用的Caffe,判断的主要项目是:

a. 是否在python中可以import Caffe模块(是否可以成功运行如下python代码):

python3 -c "import caffe" 2> /dev/null

b. 在SDK安装目录(默认是/opt/movidius)必须存在名为“caffe”的超链接,并且指向同目录的文件夹bvlc-caffe(这就是SDK认为“合法”的Caffe);

如果当前没有可以被NCS SDK使用的Caffe(结合分析,如果本机已经存在针对Intel平台优化的Caffe版本,是不可能被NCS SDK认为“可用”的),则视ncsdk.conf中的配置项(INTEL_CAFFE)下载并编译对应的Caffe发行版;

怎样让NCS SDK优先集成本地的Caffe/TensorFlow

基于上面的分析,我们不难发现,要想部署针对Intel平台优化编译的TensorFlow到NCS SDK,在安装SDK之前,我们需要事先安装优化编译的TensorFlow 1.3版本到本机。这里需要强调一点,NCS SDK目前尚不支持最新的TensorFlow 1.4,因此我们必须安装1.3版本(可以通过pip list package命令来查看当前安装的TensorFlow版本)。然后我们将ncsdk.conf配置文件中的“INSTALL_TENSORFLOW”值改成“no”。这样我们在安装NCS SDK的时候就不会下载并覆盖掉我们安装的TensorFlow版本了。

而对于Caffe,为了实现我们的目的,并且不改动SDK的安装脚本,我们可以在安装NCS SDK之前做这些工作:

1. 手动创建安装目录(默认是/opt/movidius);

2. 将我们优化编译的Caffe版本拷贝到/opt/movidius/下并改名成“bvlc-caffe”(谨慎使用mv命令,因为卸载SDK的时候会清空/opt/movidius目录)

3. 在/opt/movidius目录创建名为“caffe”的链接指向“bvlc-caffe” ln -sf bvlc-caffe caffe

4. 确保PYTHONPATH环境变量包含我们的Caffe(可以在bash.rc中做如下配置)

export PYTHONPATH=$PYTHONPATH:/[其他父目录]/caffe/python

参考文献

NCS SDK快速上手:https://developer.movidius.com/start

clCaffe:https://github.com/01org/caffe/wiki/clCaffe

Intel Caffe:https://software.intel.com/en-us/ai-academy/frameworks/caffe

TensorFlow:https://www.tensorflow.org/install/

英特尔平台优化编译TensorFlow:https://software.intel.com/zh-cn/articles/performance-optimization-for-tensorflow-1-dot-4-linux-version-based-on-intel-core-platform

关于作者

裴凡江是英特尔软件与服务事业部的一名应用软件工程师,专注于在英特尔平台上与开发者的合作和业务拓展。力求将英特尔卓越的软硬件平台与开发者的软硬件产品完美结合,提供最优客户体验。

有关编译器优化的更完整信息,请参阅优化通知