Ubuntu系统中基于Docker的OpenVINO™开发环境搭建指南

概要

OpenVINO™是英特尔推出的一套免费的开发套件,旨在帮助开发者和数据科学家们加速他们在视觉计算以及深度学习的推理和部署方面的工作。OpenVINO™通过异构计算可以充分发挥英特尔硬件平台(包括CPU,GPU,Intel® FPGA以及Intel® Movidius™ VPU)的强大性能,在深度学习推理方面可以带来多大19倍的性能提升。OpenVINO™自带的推理引擎(IE)通过一套统一的API,支持多达100多个开源的以及定制的深度学习模型(涵盖了Caffe,Tensorflow,MxNet,Kaldi,ONNX等主流深度学习框架),除此之外,OpenVINO™还内置了20个预先训练好的模型。另外,OpenVINO™中的OpenVX和OpenCV库也能够让图像/视频处理,计算机视觉追踪,以及特征提取等传统的计算机图形相关的开发工作变得更快速和高效。开发平台方面,Linux版本的OpenVINO™支持64位的Ubuntu 16.04以及CentOS* 7.4,支持的处理器包括6代及以上的Core™,Xeon® v5及以上的服务器处理器。对于目标设备,操作系统上还支持64位的Yocto Project* Poky Jethro v2.0.3,硬件平台则还支持集成了HD Graphic的Pentium® (包括N4200/5, N3350/5, N3450/5)。有关OpenVINO™更多的信息可以在参考文献一OpenVINO™官方网站中获得。
Docker是一个开源的应用容器引擎,他可以让开发者打包自己的应用及其所有的依赖到一个Docker镜像中,这个镜像完全独立于宿主操作系统,因此可以被快速的部署到其他的Linux机器/发行版上,而且Docker运行环境非常高效,可以获得几乎等同于宿主操作系统的性能。Docker容器则是Docker镜像的运行实例。有关Docker更多的信息可以在参考文献二Docker官方网站中获得。
接下来本文将介绍如何在Docker中搭建OpenVINO™开发环境。这里我们假定我们手上已经有一台安装了Ubuntu 16.04的Linux开发机,其配备了6代或以上的Core™处理器,芯片中集成了英特尔的集成显卡,与此同时开发机没有装备任何其他的独立显卡(OpenVINO™只支持英特尔的集成显卡)。

Docker的安装和配置

  • 在Ubuntu的终端中,运行如下命令来安装最新版本的docker-ce:

$ sudo apt-get update $ sudo apt-get install apt-transport-https
ca-certificates curl software-properties-common $ curl -fsSL
https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - $
sudo add-apt-repository “deb [arch=amd64]
https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable”
$ sudo apt-get update $ sudo apt-get install docker-ce

  • 为Docker守护进程设置代理(如有需要):

    1. 在Ubuntu终端中,运行命令创建新文件夹:

    $ sudo mkdir -p /etc/systemd/system/docker.service.d

    1. 创建新文件/etc/systemd/system/docker.service.d/http-proxy.conf并按照如下格式填写文件内容:

    [Service]
    Environment=“HTTP_PROXY=http://proxy.example.com:80/”

    如果你用的是https代理,则创建/etc/systemd/system/docker.service.d/https-proxy.conf并对应的填入如下内容:

    [Service]
    Environment=“HTTPS_PROXY=https://proxy.example.com:443/”

    1. 最后,使我们的更改生效,并重启Docker守护进程;

    $ sudo systemctl daemon-reload
    $ sudo systemctl restart docker

  • 为了避免每次运行docker命令都加上sudo,我们在终端下运行如下命令并重启机器:

$ sudo groupadd docker
$ sudo usermod -aG docker $USER

创建包含Ubuntu 16.04的Docker容器

  • 拉取docker官方的ubuntu 16.04镜像到开发机:

$ docker pull ubuntu:16.04

  • 基于官方的ubuntu:16.04镜像创建用于安装OpenVINO™的Docker容器:

注意:基于OpenVINO™开发的应用可能会用到CPU/GPU/Intel® Movidius™ VPU等各种物理设备,如果应用需要显示输出结果,例如输出视频和图像等,还需要通过宿主操作系统的x-server,因此在创建Docker容器的时候,我们额外指定了一些参数。Docker容器的网络方面我们直接借用宿主操作系统的网络。

$ docker create --name [容器名称] --net=host -it -e DISPLAY=$DISPLAY
–privileged -v /dev:/dev ubuntu:16.04

  • 启动我们创建的容器,然后attach到容器:

$ docker start [容器名称]
$ docker attach [容器名称]

  • 运行上面attach命令之后,再按一下回车键,我们就进入了Docker容器的终端,此时我们的身份是root,如果有需要,我们可以新建其他用户(组),并切换成其他的用户。
  • 如果我们想要退出Docker容器,只需要在Docker容器的终端下运行exit命令。后续重新进入Docker容器则需要重新运行start和attach命令并多按一次回车键。
# exit # 退出容器,将会切换到开发机的终端
$
  • 如果你的网络访问需要通过代理来进行,那么需要在Docker容器的终端运行export命令来设置,也可以将命令加入~/.bashrc文件的最后一行,这样下次进入容器的时候就会自动设置(否则退出容器之后设置就会失效)。需要注意的是这里我们需要同时设置http/https代理,因为后续某些命令会走https流量:
# export http_proxy=”http://proxy.example.com:80/”
# export https_proxy=" https://proxy.example.com:443/"

在Docker容器中安装OpenVINO™

至此我们就可以在我们的Docker容器中按照官方网站介绍的步骤来安装OpenVINO™开发工具包了。详细的安装步骤也可以参阅参考文献三中的官方网站链接。

  • 下载OpenVINO™安装包:

在开发机的浏览器中打开这里的链接(https://software.intel.com/en-us/openvino-toolkit/choose-download/free-download-linux
),并按照网页上的说明注册并下载最新的离线版本(目前是2018 R3版)安装包(l_openvino_toolkit_p_2018.3.343.tgz),然后把安装包拷贝到开发机的/dev/目录下,随后我们在Docker容器的终端中就可以在/dev/目录看到安装包了(因为我们在前文中创建Docker容器的时候用-v命令把开发机的/dev/目录映射到了Docker容器的对应目录,虽然我们的初衷是借用开发机的x-server,以及访问GPU以及Movidius™ VPU设备)。

  • 安装OpenVINO™核心组件(必须以root身份来安装,否则不会安装mediasdk组件):
# mv /dev/*.tgz ~/ 
# cd ~/
# tar -zxf l_openvino_toolkit_p_2018.3.343.tgz
# cd l_openvino_toolkit_p_
# apt update
# apt install sudo pciutils usbutils cpio lsb-release
# ./install_cv_sdk_dependencies.sh
# ./install.sh #此处按照屏幕显示的流程来完成安装过程
  • 运行脚本设置OpenVINO™环境变量 (建议将这个命令也加到~/.bashrc文件结尾,否则退出容器之后设置就会失效):

# source /opt/intel/computer_vision_sdk/bin/setupvars.sh

  • 配置OpenVINO™中的Model
    Optimizer(这里我们选择为所有支持的机器学习框架都做配置,包括TensorFlow,Caffe,MxNet,Kaldi,ONNX),也可以选择只配置某些框架,更详细的信息可以参考参考文献三中的相关步骤:
# cd /opt/intel/computer_vision_sdk/deployment_tools/model_optimizer/install_prerequisites
# ./install_prerequisites.sh
  • 增加对GPU运算的支持(可选步骤,如果不做这个步骤,那么OpenVINO™将无法调用GPU作为运算资源,执行机器学习的推理,图像视频的处理等任务):
# cd /opt/intel/computer_vision_sdk/install_dependencies/
# ./install_NEO_OCL_driver.sh
  • 运行内置的示例代码验证安装:

    1. 在开发机的终端运行如下命令,来允许Docker容器通过开发机的x-server显示内容到开发机的显示器上(如果开发机重启,此命令需要重新运行):
      $ xhost +local:docker
    2. 在Docker容器中编译示例代码
    # source /opt/intel/computer_vision_sdk/bin/setupvars.sh
    # cd /opt/intel/computer_vision_sdk/deployment_tools/inference_engine/samples/
    # mkdir build && cd build
    # cmake -DCMAKE_BUILD_TYPE=Release ..
    # make
    
    1. 在编译完成之后,我们就可以运行示例代码(security_barrier_camera_sample)来验证我们刚才安装好的开发环境了:
    # cd /opt/intel/computer_vision_sdk/deployment_tools/
    # ./inference_engine/samples/build/intel64/Release/security_barrier_camera_sample
    

    -d MYRIAD -d_va CPU -d_lpr GPU -i ./demo/car.png -m ./intel_models/vehicle-license-plate-detection-barrier-0106/FP16/vehicle-license-plate-detection-barrier-0106.xml
    -m_va ./intel_models/vehicle-attributes-recognition-barrier-0039/FP32/vehicle-attributes-recognition-barrier-0039.xml
    -m_lpr ./intel_models/license-plate-recognition-barrier-0001/FP16/license-plate-recognition-barrier-0001.xml

参数说明:

  • -d:对vehicle-license-plate-detection-barrier-0106模型做推理要用的计算设备,这里指定的是MYRIAD(
    Intel® Movidius™ VPU),如果你的开发机并没有配备这个设备,请替换成GPU

  • -d_va:对vehicle-attributes-recognition-barrier-0039模型做推理要用的计算设备,这里我们用CPU

  • -d_lpr:对license-plate-recognition-barrier-0001模型做推理要用的计算设备,这里我们用GPU

  • -i:推理工作的输入,这里我们用OpenVINO™自带的图片

补充说明:

  • 在这个示例代码中我们故意将不同的模型交给不同的计算设备进行推理,目的在于验证我们的开发环境是否完备(各个计算设备是否正常工作),并非出于计算效率的考虑。
  • vehicle-license-plate-detection-barrier-0106,vehicle-attributes-recognition-barrier-0039,license-plate-recognition-barrier-0001
    是OpenVINO™内置的神经网络模型,关于这些模型的更详细的信息见参考文献四。

以下是示例代码的输出结果:
Ubuntu系统中基于Docker的OpenVINO™开发环境搭建指南_第1张图片

Mediasdk的支持与设置

我们的Docker容器是基于Docker官方的Ubuntu 6.04版本创建,它为了保持比较精简的尺寸,其中裁减了一些模块,导致mediasdk相关的环境变量设置无法自动设置完成。因此我们需要做一下手动配置(建议将此命令行添加到~/.bashrc最后一行,否则每次进入Docker容器终端都必须再次运行此命令行),这样mediasdk就可以正常使用了:

# source /etc/profile.d/intel-mediasdk.sh

错误排查

  • 如果运行docker命令时遇到权限问题(“permission denied”),请确保当前用户已经加入docker用户组:

$ sudo groupadd docker
$ sudo usermod -aG docker $USER

  • 如果运行示例代码遇到“cannot open display”的问题,可以排查以下情况:

    1. 创建Docker容器的命令是否是通过远程会话执行的(例如通过ssh远程连接),如果是,请直接在开发机的终端里运行。
    2. 开发机的x-server是否已经允许Docker容器访问(通过如下命令),需要额外注意的是这个设置在关机之后会失效,重新开机之后需要再次运行:

    $ xhost +local:docker

  • Docker容器网络问题(运行某些命令超时,例如install_xxx.sh,或者出现连接错误):
    如果你的开发机是通过代理访问网络的,请确保Docker容器中已经正确设置了代理,可以通过“env | grep
    proxy”命令来查看当前的代理设置

  • 运行示例代码时出现“Cannot find plugin”的错误 -
    请确保Docker容器中已经正确设置了OpenVINO™环境变量(建议将命令添加到~/.bashrc最后一行,这样每次进入Docker容器,环境变量就会自动设置):

# source /opt/intel/computer_vision_sdk/bin/setupvars.sh

结语

至此我们完成了在Ubuntu系统中基于Docker的OpenVINO™开发环境搭建,这篇文章中所创建的Docker容器具有非常强的可移植性,经过我们验证,在打包成Docker镜像(Docker Image)之后,可以通过Docker在当前主流的Linux发行版上(包括Ubuntu 18.04/CentOS 7.5/Fedora 28)直接加载并复制出新的可用的OpenVINO™开发环境(即Docker容器)。而这些移植过来的Docker容器,也具有几乎等同于开发机原生操作系统的性能,因此具有极佳的实用价值。

参考文献

OpenVINO™官方网站:https://software.intel.com/en-us/openvino-toolkit
Docker官方网站:https://www.docker.com/
OpenVINO™ Linux版官方安装指南:https://software.intel.com/en-us/articles/OpenVINO-Install-Linux
OpenVINO™ 内置模型介绍:https://software.intel.com/en-us/openvino-toolkit/documentation/pretrained-models
Intel® Movidius™ VPU:https://software.intel.com/en-us/neural-compute-stick
Intel® 视觉计算论坛:https://software.intel.com/en-us/forums/computer-vision
Docker代理设置:https://docs.docker.com/network/proxy/

关于作者

英特尔(亚太)技术研发公司 资深软件应用工程师 裴凡江

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

你可能感兴趣的:(Ubuntu,Docker)