练习 - 使用 Azure IoT Edge 将跨平台 DeepStream 映像部署到 NVIDIA 嵌入式设备

已完成

已将容器化 DeepStream Graph Composer 工作负载发布到容器注册表,并为 NVIDIA Jetson 嵌入式设备配置了 IoT Edge 运行时。 现在,你已准备好在中心创建部署规范,以将工作负载作为 IoT Edge 模块运行。

  1. 在 Azure 门户中,转到在本模块开头创建的 IoT 中心。 在左侧菜单的“自动设备管理”下,选择“IoT Edge”。 查找已注册设备。

    显示 Azure 门户中的 IoT Edge 设备选项卡的屏幕截图。

  2. 要查看有关当前配置的详细信息,请选择设备名称:

    显示 IoT Edge 设备概述的屏幕截图。

  3. 选择“设置模块”选项卡以打开模块编辑器

    显示“模块”窗格的屏幕截图。

    必须提供适当的容器注册表凭证,以便 NVIDIA 嵌入式设备可以从容器注册表中提取容器工作负载。

  4. 在单独的浏览器窗口中,转到 Azure 门户中的容器注册表:

    显示 Azure 容器注册表实例概述的屏幕截图。

  5. 在左侧菜单的“设置”下,选择“访问密钥”。 在“访问密钥”中,记下“登录服务器”、“用户名”和“密码”的值。 在下一步将使用这些值。

    显示容器注册表凭据的屏幕截图。

  6. 返回打开到“设置模块”的浏览器窗口。 在“容器注册表凭据”中,输入容器注册表“访问密钥”中的值。 使用这些凭据,任何应用此模块规范的设备都可以从 Azure 中的容器注册表安全地提取容器工作负载。

    显示在 Azure IoT 中心内输入容器注册表凭据的截图。

  7. 接下来,配置自定义 IoT Edge 模块作为部署规范的一部分。 在“模块”窗格的“IoT Edge 模块”部分,选择“添加”>“IoT Edge 模块”

    展示如何添加 IoT Edge 模块的屏幕截图。

  8. 在“添加 IoT Edge 模块”的“IoT Edge 模块名称”中,输入模块名称“deepstream_test4_jetson”。 在“映像 URI”中,输入“<Login Server>/deepstream_test4_jetson:v1”。 对于<Login Server>,使用容器注册表的 URL。

    屏幕截图:为 IoT Edge 模块输入名称和映像 URI。

  9. 接下来,选择“容器创建选项”选项卡以启用对 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"
        ]
    }
    }
    

    完成后,选择“更新”

    显示“模块”窗格中的容器创建选项的屏幕截图。

  10. 选择“查看 + 创建”后,将返回到“在设备上设置模块”页

    在“模块”窗格中突出显示“查看 + 创建”按钮的屏幕截图。

  11. 部署文本框显示将要提交到设备的部署规范。 验证内容是否类似于此示例:

    {
    "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": {}
        }
    }
    }
    
  12. 验证部署配置是否正确,然后选择“创建”以开始部署过程

    显示“部署”文本框以及“创建”按钮的屏幕截图。

  13. 要验证部署是否成功,请在 NVIDIA 嵌入式设备的终端中运行以下命令:

    sudo iotedge list
    
  14. 验证输出显示 edgeAgentedgeHubdeepstream_test4_jetson 模块的状态是否为 running

    如果设备连接到显示器,应该能够看到 DeepStream Graph Composer 应用程序的可视化输出,如下例所示:

    显示在 Jetson 硬件上运行的 IoT Edge 模块的屏幕截图。

  15. 通过在 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"
      ]
    }
    
  16. 可以通过返回到 IoT Edge 设备的设备概述来确认 Azure 门户中正在运行的模块的状态。 应该会看到为设备列出的以下模块和关联状态:

    显示 IoT Edge 设备概述并带有运行时状态的屏幕截图。

  17. 还可以在 IoT 中心概述窗格中确认消息从设备到达中心。 应注意到消息的增加:

    屏幕截图:描述在 IoT 中心使用情况窗格中接收的消息的图表。

祝贺你! 已成功开发 DeepStream Graph Composer 工作负载的生产级边缘部署,并使用 Azure IoT Edge 将其部署到实际设备!

尝试此服务

使用本模块中描述的策略,如何修改现有的 DeepStream 参考图以支持野生动物保护解决方案(通过使用实时摄像头来计算濒危物种)的独特实例? 需要修改哪些组件来支持此解决方案? 是否需要对整体部署策略进行任何修改?