在 IEI Tank AIoT 开发套件上使用 Microsoft Azure 部署多个 Intel® Distribution of OpenVINO™ Toolkit 工作负载
本文将介绍在 Azure 中设置 Intel Distribution of OpenVINO 工具包模块,并探讨在 IEI Tank AIoT 开发套件上同时运行 CPU 和 GPU 上的多个模块的注意事项。
引言
将容器化的 Intel® Distribution of OpenVINO™ 工具包解决方案部署为 Microsoft Azure* 模块有助于管理您的应用程序,Azure 甚至可以部署多个模块到同一设备。本文将介绍在 Azure 中设置 Intel Distribution of OpenVINO 工具包模块,并探讨在 IEI Tank* AIoT 开发套件上同时运行 CPU 和 GPU 上的多个模块的注意事项。
该模块将在 GitHub* 上运行对象检测示例,该示例使用 MobileNet-SSD Caffe 模型对视频进行推理以检测视频中的汽车。GitHub* 存储库包含了转换模型、构建示例以及链接下载示例视频的所有代码和说明。
由于多个模块将被部署到同一台机器上,Intel Distribution of OpenVINO 工具包 R4 将安装在 IEI Tank 本身,容器可以通过绑定挂载访问它。这样,每个容器无需在内部安装 Intel Distribution of OpenVINO 工具包,从而加快构建时间并节省空间。
硬件
IEI Tank* IoT 开发套件,配备 Ubuntu* 16.04 作为边缘设备
设置 IEI Tank* AIoT 开发套件
按照 这些说明 在 IEI Tank 上安装 Intel Distribution of OpenVINO 工具包 R4。
构建示例并**将以下文件移动到** "/opt/intel/computer_vision_sdk/deployment_tools/inference_engine/samples/build/intel64/Release/lib/"。否则,需要更新 GitHub makefile 和 main.cpp 中的位置以指向新位置。
设置 Microsoft Azure*
如果尚未在 Microsoft Azure* 中设置部署模块,请按照 快速入门指南 设置标准层 IoT Hub,然后将 IEI Tank 注册并连接为 IoT Edge 设备。此外,还要创建一个 注册表 来存储容器映像。
Docker*
Intel Distribution of OpenVINO 工具包容器将在 IEI Tank 上使用 Linux* OS (也可以使用其他 Linux 机器) 通过 Docker* 构建,然后推送到 Microsoft Azure 注册表,再部署回 IEI Tank。
在 **IEI Tank 上安装 Docker**。
sudo apt-get install docker.io
下面的 Dockerfile 用于构建容器。它将安装 Intel Distribution of OpenVINO 工具包的依赖项,包括与 GPU 接口的依赖项。
FROM ubuntu:16.04 RUN apt-get update -y RUN apt-get install pciutils wget sudo kmod curl lsb-release cpio udev python3-pip libcanberra-gtk3-module libgtk2.0-0 libpng12-dev libcairo2-dev libpango1.0-dev libglib2.0-dev libgtk2.0-dev libswscale-dev libavcodec-dev libavformat-dev libgstreamer1.0-0 gstreamer1.0-plugins-base libgflags-dev build-essential cmake libusb-1.0-0-dev -y # Install OpenCL driver and runtime for GPU RUN apt -y install libnuma1 ocl-icd-libopencl1 wget RUN wget https://github.com/intel/compute-runtime/releases/download/18.28.11080/intel-opencl_18.28.11080_amd64.deb RUN dpkg -i intel-opencl_18.28.11080_amd64.deb RUN rm intel-opencl_18.28.11080_amd64.deb COPY . / COPY run_traffic_demo.sh run_traffic_demo.sh RUN chmod 743 run_traffic_demo.sh CMD ./run_traffic_demo.sh
代码块 1. 构建容器的 Dockerfile
**COPY . /** 将复制 Dockerfile 同一目录下的所有内容到 Docker 容器中,在这种情况下,我们希望有一个名为 'traffic_demo_files' 的文件夹。其中应该包含编译好的对象检测示例应用程序、mp4 格式的汽车行驶视频,以及从 GitHub 转换的 Mobilenet-Ssd 文件。
在同一位置还有一个脚本 run_traffic_demo.sh,它将使用优化的模型文件以连续循环的方式运行对象检测程序。要在 GPU 上运行,只需将 CPU 改为 GPU。
#!/bin/bash source /opt/intel/computer_vision_sdk/bin/setupvars.sh cd /traffic_demo_files while true do ./tutorial1 -i cars.mp4 -m mobilenet-ssd.xml –d CPU done
代码块 2. run_traffic_demo.sh
因此,Dockerfile、'traffic_demo_files' 文件夹和 runtraffic_demo.sh 都应该位于同一位置。现在容器已准备好构建。
将 **Docker 容器构建并推送到 Microsoft Azure**
sudo docker build <path to Dockerfile> sudo docker login <registryname>.azurecr.io -u <username> -p <password> sudo docker tag <container> <registryname>.azurecr.io/openvino/traffic_monitor sudo docker push <registryname>.azurecr.io/openvino/traffic_monitor
现在 **traffic_monitor** 模块应该已经在 Microsoft Azure 的注册表中。
部署
要将模块部署到 IEI Tank,请在 Microsoft Azure 中转到 **IoT Hub**。向下滚动到 **Automatic Device Management**,然后点击 **IoT Edge**。在右侧打开的窗格中,点击 IEI Tank 的 **Device ID**。
在顶部,点击 **Set modules**
首先,将**容器注册表**链接到设备,以便它可以访问。添加**名称、地址、用户名和密码**。
现在,您可以通过点击 **+Add** 并选择 **IoT Edge Module** 来添加一个**Deployment Module**。
现在是时候使用名称和映像 URI 配置模块了,它就是您最初通过 Docker 推送的位置。关于配置的外观,请参考图 8 和 9。
由于容器没有安装 Intel Distribution of OpenVINO 工具包,它需要绑定挂载才能访问安装在 IEI Tank 本身的工具包。Privileged 选项允许容器访问 GPU。在“Container Create Options”字段中添加**以下内容**。
{ "HostConfig": { "Binds": [ "/tmp/.X11-unix:/tmp/.X11-unix", "/opt/intel/computer_vision_sdk/:/opt/intel/computer_vision_sdk/", "/opt/intel/computer_vision_sdk_2018.4.420/:/opt/intel/computer_vision_sdk_2018.4.420/" ], "Privileged": true } }
代码块 3. Container Create Options
选择一个**重启策略**。
注意:在测试期间选择“On-Failed”时,Microsoft Azure 可能会声明配置无效。建议选择其他选项。
最后,您需要定义一个环境变量以使 X11 转发生效:**DISPLAY = :0**
注意:X11 转发可能因机器而异。您需要确保您的设备已启用 X11 转发,并且您需要在命令提示符中运行命令 **xhost +**,或管理容器如何连接到您的机器。DISPLAY 的值也可能不同。
点击 **Save**,然后点击 **Next and Submit** 直到模块部署到设备。
根据需要添加更多模块。请记住,使用 **-d GPU** 选项更新 run_traffic_demo.sh,并将其以新名称(如 **<registryname>.azurecr.io/openvino/traffic_monitor_gpu**)推送到 Microsoft Azure。
有用的命令
列出已安装的模块
iotedge list
删除容器
sudo docker rm -f trafficMonitor
查看容器的日志
sudo iotedge logs trafficMonitor –f
结论
现在多个 Microsoft Azure 模块已在 IEI Tank 上运行,需要考虑一些事项。首先,容器化解决方案可能会导致运行速度变慢。对于普通的 Intel Distribution of OpenVINO 工具包应用程序来说,影响应该微乎其微,但在毫秒级至关重要的应用中,这种成本可能会被认为非常高。此外,在 GPU 上运行推理的模块仍在利用 CPU 进行其他计算,并且会对 CPU 模块造成相当大的影响。本文使用的 GitHub 存储库中的示例应用程序会在日志中打印预处理(ms)、推理(ms/frame)和后处理(ms)的时间,可以使用这些作为参考来查看随着每个模块的增加,处理时间是如何增加的,这可能很有帮助。
作者简介
Whitney Foster 是 Intel 核心和视觉计算部门的软件工程师,致力于物联网和计算机视觉的可扩展性项目。
参考文献
开始使用 Intel® Distribution of OpenVINO™ 工具包和 Microsoft Azure* IoT Edge