练习 - 使用 Azure IoT Edge 将跨平台 DeepStream 映像部署到 NVIDIA 嵌入式设备
已将容器化 DeepStream Graph Composer 工作负载发布到容器注册表,并为 NVIDIA Jetson 嵌入式设备配置了 IoT Edge 运行时。 现在,你已准备好在中心创建部署规范,以将工作负载作为 IoT Edge 模块运行。
在 Azure 门户中,转到在本模块开头创建的 IoT 中心。 在左侧菜单的“自动设备管理”下,选择“IoT Edge”。 查找已注册设备。
要查看有关当前配置的详细信息,请选择设备名称:
选择“设置模块”选项卡以打开模块编辑器:
必须提供适当的容器注册表凭证,以便 NVIDIA 嵌入式设备可以从容器注册表中提取容器工作负载。
在单独的浏览器窗口中,转到 Azure 门户中的容器注册表:
在左侧菜单的“设置”下,选择“访问密钥”。 在“访问密钥”中,记下“登录服务器”、“用户名”和“密码”的值。 在下一步将使用这些值。
返回打开到“设置模块”的浏览器窗口。 在“容器注册表凭据”中,输入容器注册表“访问密钥”中的值。 使用这些凭据,任何应用此模块规范的设备都可以从 Azure 中的容器注册表安全地提取容器工作负载。
接下来,配置自定义 IoT Edge 模块作为部署规范的一部分。 在“模块”窗格的“IoT Edge 模块”部分,选择“添加”>“IoT Edge 模块”:
在“添加 IoT Edge 模块”的“IoT Edge 模块名称”中,输入模块名称“deepstream_test4_jetson”。 在“映像 URI”中,输入“<Login Server>/deepstream_test4_jetson:v1”。 对于<Login Server>,使用容器注册表的 URL。
接下来,选择“容器创建选项”选项卡以启用对 GPU 加速的支持,并通过添加以下内容提供对 X11 套接字的访问,以允许从容器呈现视频输出:
{ "NetworkingConfig": { "EndpointsConfig": { "host": {} } }, "HostConfig": { "DeviceRequests": [ { "Count": -1, "Capabilities": [ [ "gpu" ] ] } ], "NetworkMode": "host", "Binds": [ "/tmp/.X11-unix/:/tmp/.X11-unix/", "/tmp/argus_socket:/tmp/argus_socket" ] } }
完成后,选择“更新”:
选择“查看 + 创建”后,将返回到“在设备上设置模块”页:
部署文本框显示将要提交到设备的部署规范。 验证内容是否类似于此示例:
{ "modulesContent": { "$edgeAgent": { "properties.desired": { "modules": { "deepstream_test4_jetson": { "settings": { "image": "<Login Server>.azurecr.io/deepstream_test4_jetson:v1", "createOptions": "{\"NetworkingConfig\":{\"EndpointsConfig\":{\"host\":{}}},\"HostConfig\":{\"DeviceRequests\":[{\"Count\":-1,\"Capabilities\":[[\"gpu\"]]}],\"NetworkMode\":\"host\",\"Binds\":[\"/tmp/.X11-unix/:/tmp/.X11-unix/\",\"/tmp/argus_socket:/tmp/argus_socket\"]}}" }, "type": "docker", "version": "1.0", "env": { "DISPLAY": { "value": ":0" } }, "status": "running", "restartPolicy": "always" } }, "runtime": { "settings": { "minDockerVersion": "v1.25", "registryCredentials": { "<Your Registry Name>": { "address": "<Login Server>.azurecr.io", "password": "<Your Password>", "username": "<Your Username>" } } }, "type": "docker" }, "schemaVersion": "1.1", "systemModules": { "edgeAgent": { "settings": { "image": "mcr.microsoft.com/azureiotedge-agent:1.1", "createOptions": "" }, "type": "docker" }, "edgeHub": { "settings": { "image": "mcr.microsoft.com/azureiotedge-hub:1.1", "createOptions": "{\"HostConfig\":{\"PortBindings\":{\"5671/tcp\":[{\"HostPort\":\"5671\"}],\"8883/tcp\":[{\"HostPort\":\"8883\"}],\"443/tcp\":[{\"HostPort\":\"443\"}]}}}" }, "type": "docker", "status": "running", "restartPolicy": "always" } } } }, "$edgeHub": { "properties.desired": { "routes": { "route": "FROM /messages/* INTO $upstream" }, "schemaVersion": "1.1", "storeAndForwardConfiguration": { "timeToLiveSecs": 7200 } } }, "deepstream_test4_jetson": { "properties.desired": {} } } }
验证部署配置是否正确,然后选择“创建”以开始部署过程:
要验证部署是否成功,请在 NVIDIA 嵌入式设备的终端中运行以下命令:
sudo iotedge list
验证输出显示
edgeAgent
、edgeHub
和deepstream_test4_jetson
模块的状态是否为running
。如果设备连接到显示器,应该能够看到 DeepStream Graph Composer 应用程序的可视化输出,如下例所示:
通过在 NVIDIA Jetson 嵌入式设备上的终端中运行以下命令来监视
deepstream_test4_jetson
模块的输出:sudo docker logs -f deepstream_test4_jetson
每隔几秒钟,设备就会向其在 Azure IoT 中心注册的中心发送遥测数据。 出现类似于以下示例的消息:
Message sent : { "version" : "4.0", "id" : 1440, "@timestamp" : "2021-09-21T03:08:51.161Z", "sensorId" : "sensor-0", "objects" : [ "-1|570|478.37|609|507.717|Vehicle|#|sedan|Bugatti|M|blue|XX1234|CA|-0.1" ] }
可以通过返回到 IoT Edge 设备的设备概述来确认 Azure 门户中正在运行的模块的状态。 应该会看到为设备列出的以下模块和关联状态:
还可以在 IoT 中心概述窗格中确认消息从设备到达中心。 应注意到消息的增加:
祝贺你! 已成功开发 DeepStream Graph Composer 工作负载的生产级边缘部署,并使用 Azure IoT Edge 将其部署到实际设备!
尝试此服务
使用本模块中描述的策略,如何修改现有的 DeepStream 参考图以支持野生动物保护解决方案(通过使用实时摄像头来计算濒危物种)的独特实例? 需要修改哪些组件来支持此解决方案? 是否需要对整体部署策略进行任何修改?