开始使用 Intel® OpenVINO™ 工具包和 Microsoft Azure IoT Edge
本教程将介绍如何在 Azure IoT Edge 上部署容器化的 Intel® Distribution of OpenVINO™ 工具包应用程序。
引言
本教程将介绍如何将容器化的 Intel® Distribution of OpenVINO™ 工具包应用程序部署到 Azure* IoT Edge。
先决条件
请首先遵循 Azure IoT Edge 入门指南来设置您的目标设备并熟悉 Azure IoT Edge 服务: https://software.intel.com/en-us/articles/set-up-microsoft-azure-iot-edge-on-an-up-squared-board
目标设备上预装 Intel® Distribution of OpenVINO™ 工具包
如果您知道要部署到的设备已安装 Intel® Distribution of OpenVINO™ 工具包(例如 Intel® IoT Developer Kit),则可以使用绑定挂载将 Intel® Distribution of OpenVINO™ 工具包库加载到容器中。这样可以大大减小容器占用的空间,并显著加快构建速度。只要要部署到的设备安装了 Intel® Distribution of OpenVINO™ 工具包,这种方法在部署到云平台时效果会更理想。有关如何安装 Intel® Distribution of OpenVINO™ 工具包的更多说明,请访问 https://software.intel.com/en-us/articles/OpenVINO-Install-Linux
在容器中安装 Intel® Distribution of OpenVINO™ 工具包
如果您需要容器更加独立,或者要部署到的设备未安装该工具包,则需要在容器本身中安装 Intel® Distribution of OpenVINO™ 工具包。此方法已在先前创建 Intel® Distribution of OpenVINO™ 工具包容器映像的教程中涵盖,不过我们将在本文中说明其中的区别。
构建容器
预装
要创建预装 Intel® Distribution of OpenVINO™ 工具包的容器,请参阅有关执行此操作的教程。在此容器中,我们将不使用 USER root,因为我认为这与 Azure IoT Edge 不兼容。我们也不会在此容器中安装 Jupyter* notebook,因为它是不必要的。X11 转发的绑定挂载和环境变量将在命令行中(即 Azure 门户)定义。
Dockerfile 应如下所示
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 -y
RUN pip3 install opencv-python
COPY . /
COPY run_demo.sh run_demo.sh
RUN chmod 743 run_demo.sh
CMD ./run_demo.sh
run_demo.sh 只是加载变量,然后运行示例
#!/bin/bash source /opt/intel/computer_vision_sdk/bin/setupvars.sh cd /opt/intel/computer_vision_sdk/deployment_tools/demo/ ./demo_squeezenet_download_convert_run.sh
使用绑定挂载
在使用绑定挂载构建容器时,您需要将绑定挂载和容器的入口点都指定为命令行参数。目前没有好的方法在 Dockerfile 中定义绑定挂载,如果挂载是在命令行中定义的,那么入口点命令也必须在那里定义,否则在执行时将无法使用绑定挂载。因此,在此容器中,您基本上只需要包含 Ubuntu* 基础映像,安装所有依赖项,复制必要文件,并准备好执行演示脚本。
Dockerfile 如下所示
此 Dockerfile 如下所示
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 -y
COPY . /
RUN chmod 743 run_demo.sh
此容器也将使用上面显示的 run_demo.sh。
将容器推送到 Microsoft Azure* Container Registry (ACR)
您需要将自定义容器推送到私有的 Azure Container Registry 进行部署,或者它也可以在 Dockerhub 上运行。
有关将自定义模块推送到 Azure Container Registry 的文档,请参阅在线文档。 https://docs.microsoft.com/en-us/azure/container-registry/container-registry-get-started-docker-cli
创建注册表后,在拥有自定义映像的设备上登录该注册表。
az acr login --name {registry name}
登录时,最好在 ACR 的“访问密钥”下启用管理员用户,并使用在那里生成的用户名和密码登录 ACR。
使用这些凭据登录 Docker*
docker login {login server name} -u {Generated username} -p {Generated password}
现在您应该能够从 ACR 推送和拉取容器了。
推送前标记您的自定义映像
docker tag {image name} {login server name}/samples/{image name}:{version #}
重要提示: 如果由于某种原因您已将容器推送到注册表,但对其进行了修改,则需要使用不同的名称再次推送。如果使用相同的名称再次推送,ACR 会认为未进行更改,而不会推送任何内容。
为避免这种情况,请确保在标记容器时,在末尾添加版本号,并在编辑时不断更新该数字。
docker tag {image name} {login server name}/samples/{image name}:{version #}
ACR 在不重复数据方面做得很好。我在 ACR 中有 3 个 2GB Intel® Distribution of OpenVINO™ 工具包映像版本,每个版本运行不同的演示,总占用空间仅为 2GB。
创建部署模块
现在是激动人心的部分,实际部署您创建的模块!
有关设置 IoT Edge Hub 和 IoT Edge Device,请参阅 本教程。
创建 Edge Hub 并使用连接字符串连接设备后,您就可以创建自定义模块了。
转到 IoT Edge 设备,然后单击之前创建的 Edge Device。
在该门户中,单击“设置模块”。
在那里,您必须向模块提供 ACR 的所有凭据,否则它将无法访问 ACR 并返回错误。
这可以在导航到 Azure Container Registry 门户,在“访问密钥”下找到。
在“访问密钥”下,确保启用了管理员用户,其余字段应易于查看(参见上方“将容器推送到 ACR”下的图片)。
完成此操作后,滚动到页面底部,在“部署模块”下单击“添加 +”,然后单击“添加 IoT Edge 模块”。
为模块命名并链接映像 URI(与推送映像之前标记的名称相同)。
容器创建选项
为模块命名并链接映像 URI 后,您将在“容器创建选项”部分定义命令行参数。定义这些选项的文档实际上在 docs.docker.com 上,而不是 Microsoft 的文档。
此链接提供了如何定义容器创建选项的示例。对于任一容器,我们需要为 X11 转发定义绑定挂载,并将 `Privileged` 设置为 true。在 `HostConfig` 下,您可以定义绑定挂载甚至端口等内容。在此之外,您可以定义特权模式或 `Entrypoint` 命令等内容。
它将如下所示
{ "HostConfig": { "Binds": [ "/tmp/.X11-unix:/tmp/.X11-unix" ], "Privileged": true } }
对于使用绑定挂载的容器,我们需要为 Intel® Distribution of OpenVINO™ 工具包库定义额外的挂载,并定义 `Entrypoint` 命令。它看起来会像这样:
{ "HostConfig": { "Binds": [ "/tmp/.X11-unix:/tmp/.X11-unix", "/opt/intel/computer_vision_sdk_2018.3.343/:/opt/intel/computer_vision_sdk_2018.3.343/" ], "Privileged": true }, "Entrypoint": [ "./opt/intel/computer_vision_sdk_2018.3.343/deployment_tools/demo/demo_security_barrier_camera.sh" ] }
在创建选项之后,您可以定义重启策略。对于此演示,我选择了“失败时重启”,因为否则每次重启(默认为“始终”运行)时它都会继续运行演示。最好在您想再次运行时手动重启演示。
期望的运行状态可能应该是“运行”,除非您希望它已部署但出于某种原因未运行。
最后,您需要定义一个环境变量以使 X11 转发正常工作。
DISPLAY = :0
注意: X11 转发在每台计算机上可能不同。您需要确保您的设备上启用了 X11 转发,并且需要运行 `xhost +`,或者管理容器如何连接到您的计算机。DISPLAY 的值也可能不同。
部署部署模块
完成设置后,单击“保存”。您可以在一次部署中添加任意数量的 IoT Edge 模块。
然后,单击“下一步”,再单击“下一步”(我们暂时不编辑路由)。然后单击“提交”。模块应已部署,并且演示将在目标设备上开始运行。
对于预装 Intel® Distribution of OpenVINO™ 工具包的容器,它应该会更快启动。对于使用绑定挂载的容器,可能需要更长时间(4-5 分钟),因为它实际上会下载更多运行演示所需的内容(我们应该能解决这个问题)。
运行 `iotedge logs <<container name>> -f` 以查看容器的日志。您可以在一次部署中拥有多个容器,因此您需要分别查看每个容器的日志。
Azure IoT Edge + Container Registry
本教程将引导您完成从头到尾通过 Azure IoT Edge 部署 Intel® Distribution of OpenVINO™ 工具包模块。其中有许多步骤基本上已在 Microsoft 的教程中进行了记录,因此提供了这些链接以供额外参考。
设置 Microsoft Azure* IoT Hub 和 IoT Edge
本教程大量引用: https://docs.microsoft.com/en-us/azure/iot-edge/quickstart-linux
>>使用此链接获取安装 EdgeAgent 和安全守护程序的命令。
要部署任何模块,您需要创建一个 Azure IoT Hub,该中心会跟踪您可以部署到的所有边缘设备。
首先创建一个资源组来容纳所有资源。
az group create --name IoTEdgeResources --location westus
然后,在该资源组中创建 Hub。
az iot hub create --resource-group IoTEdgeResources --name {hub_name} --sku F1
在 `--sku` 之后,如果您还没有 Hub,请保留 F1 标志,否则将其切换为 S1(将相应收费)。
创建 IoT Hub 后,您需要向 Hub 添加一个 Edge Device。
az iot hub device-identity create --hub-name {hub_name} --device-id {device name} --edge-enabled
Edge Device 有一个连接字符串,稍后用作连接到 Azure 的密钥。复制此字符串并保存以备将来使用。
az iot hub device-identity show-connection-string --device-id {device name} --hub-name {hub_name}
接下来,在您计划部署模块的设备上安装 IoT EdgeHub 和 EdgeAgent。这是 Azure 用于管理容器和部署的工具。
- 有关安装此工具以及安全守护程序的命令,请参阅上述 URL 中列出的命令。
- 您还需要一个容器运行时,Docker 应该可以正常工作。(Moby 是 Docker 的某种扩展,不知何故在我的 IEI Tank* 上无法正常工作)
安装完这些工具后,转到 IoT Edge 配置文件。
sudo nano /etc/iotedge/config.yaml
在此文件中,找到 `device_connection_string` 变量,并将其替换为上面生成的连接字符串。
这将把您的设备与 Azure 连接起来!