65.9K
CodeProject 正在变化。 阅读更多。
Home

开始使用 Intel® OpenVINO™ 工具包和 Microsoft Azure IoT Edge

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2018 年 12 月 1 日

CPOL
viewsIcon

5477

本教程将介绍如何在 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 连接起来!

© . All rights reserved.