练习 - 生成和发布跨平台 DeepStream 容器映像

已完成

DeepStream 6.0 container-builder 包可生成跨平台容器映像。 需要使用此功能在目标 NVIDIA 嵌入式设备上生成与 ARM64 CPU 兼容的容器。

在安装了附带 Docker 的 DeepStream 6.0 Graph Composer 的基于 x86 的主机上完成以下步骤。 假定你已完成前面的设置和配置 NVIDIA DeepStream 开发环境使用 Azure 的 NVIDIA DeepStream Graph Composer 简介模块中介绍的步骤。

  1. 首先,必须安装 qemu-user-staticbinfmt-support 包。 这些包是 Docker 中跨平台支持所需的依赖项。 要执行此步骤,请在主机上的终端中运行以下命令:

    sudo apt install qemu-user-static binfmt-support
    
  2. 安装完成后,在主机上运行以下命令配置 Docker 的跨平台支持:

    sudo docker run --rm --privileged multiarch/qemu-user-static --reset --persistent yes --credential yes 
    
  3. 接下来,将创建一个 container-builder 配置,该配置将生成一个基于 ARM64 的容器以支持 deepstream-test4 图。 首先,转到 /opt/nvidia/deepstream/deepstream/reference_graphs/deepstream-test4 并使用以下命令打开 ds_test4_container_builder_jetson.yaml 文件:

        cd /opt/nvidia/deepstream/deepstream/reference_graphs/deepstream-test4
        sudo vi ds_test4_container_builder_jetson.yaml
    

    未修改的 ds_test4_container_builder_jetson.yaml 文件的内容如下所示:

        %YAML 1.2
        ################################################################################
        # Copyright (c) 2021, NVIDIA CORPORATION. All rights reserved.
        #
        # NVIDIA Corporation and its licensors retain all intellectual property
        # and proprietary rights in and to this software, related documentation
        # and any modifications thereto.  Any use, reproduction, disclosure or
        # distribution of this software and related documentation without an express
        # license agreement from NVIDIA Corporation is strictly prohibited.
        #
        ################################################################################
        ---
        # final stage
        unique_stage: final_image
        base_image: auto
        stage_model: clean_stage
    
        local_copy_files:
        - src: "/opt/nvidia/graph-composer/graph_composer-1.0.0_arm64.deb"
          dst: "/tmp/"
        - src: "parameters.yaml"
          dst: "/workspace/deepstream-test4/" # ends with '/' is folder
    
        custom_runs:
         - "apt install -y /tmp/graph_composer-1.0.0_arm64.deb && rm -rf /tmp/graph-composer-1.0.0_arm64.deb"
    
        work_folder: /workspace/deepstream-test4/
    
        env_list:
          PATH: "/opt/nvidia/graph-composer/:$PATH"
          LD_LIBRARY_PATH: "/opt/nvidia/graph-composer/:$LD_LIBRARY_PATH"
          DISPLAY: ":0"
    
        # Setup entrypoint
        entrypoint:
        - "gxe"
        - "--manifest"
        - "deepstream-test4_manifest.yaml"
        - "--app"
        - "deepstream-test4.yaml,parameters.yaml"
        ---
        # Container Builder Config
        container_builder: main # required
        graph:
          graph_files: [ deepstream-test4.yaml ]
          graph_dst: /workspace/deepstream-test4/
          manifest_dst: /workspace/deepstream-test4/deepstream-test4_manifest.yaml
          ext_install_root: /workspace/deepstream-test4/
        docker_build:
            image_name: <docker-container-registry>:deepstream-test4-jetson
    

    注意

    以下是在编辑 ds_test4_container_builder_jetson.yaml 文件时使用 vi 编辑器的一些提示:

    • 要进入插入模式,请选择“i”。 然后,可以进行更改。
    • 要退出插入模式并返回到正常模式,请选择“Esc”。
    • 要保存文件并退出,请选择“x”,然后选择“Enter”。
    • 要保存文件,请选择“w”,然后选择“Enter”。
    • 要退出 vi,请输入“Quit”,然后选择“Enter”。

    请注意此文件的最后一行,它需要修改:

    image_name: <docker-container-registry>:deepstream-test4-jetson
    

    将此部分更新为如下所示:

    image_name: deepstream-test4-jetson
    

    注意

    如果不修改此部分,则在后续步骤中尝试生成跨平台映像将产生以下错误:ConnectionResetError: [Errno 104] Connection reset by peer

    请注意,此规范使用来自 nvcr.io 的基础映像并复制到 deepstream-test4.yamlparameters.yaml 文件中。 映像入口点启动 deepstream-test4 图并使用 parameters.yaml 中存在的值覆盖它。 出于此原因,还需要在实际生成容器之前更新此文件。

  4. 返回到 deepstream-test4 参考图的目录并编辑 parameters.yaml 文件:

    cd /opt/nvidia/deepstream/deepstream/reference_graphs/deepstream-test4
    sudo vi parameters.yaml
    

    msg-broker-proto-lib 的值更改为 /opt/nvidia/deepstream/deepstream/lib/libnvds_azure_edge_proto.so

    此外,将 msg-conv-payload-type 的值更改为 1。 此参数控制生成的消息输出的格式。 如果不更改此参数,则输出将使用 NVIDIA 示例中提供的硬编码格式。 如果更新 NvDsInferVideo 中使用的模型,该格式可能不表示对象检测类。

    parameters.yaml 的最终内容应类似于以下示例:

    ################################################################################
    # Copyright (c) 2021, NVIDIA CORPORATION. All rights reserved.
    #
    # NVIDIA Corporation and its licensors retain all intellectual property
    # and proprietary rights in and to this software, related documentation
    # and any modifications thereto. Any use, reproduction, disclosure or
    # distribution of this software and related documentation without an express
    # license agreement from NVIDIA Corporation is strictly prohibited.
    #
    ################################################################################
    
    components:
    - name: nv_ds_single_src_input39..3c18
      parameters:
        uri: file:///opt/nvidia/deepstream/deepstream/samples/streams/sample_1080p_h264.mp4
    name: NvDsSingleSrcInput..1b00
    ---
    components:
    - name: nv_ds_stream_mux42..36d8
      parameters:
        batch-size: 1
        height: 1080
        width: 1920
    name: NvDsStreamMux..16d8
    ---
    components:
    - name: nv_ds_msg_conv_broker61..4748
      parameters:
        msg-broker-conn-str: 127.0.0.1;9092;test-topic
        msg-broker-proto-lib: /opt/nvidia/deepstream/deepstream/lib/libnvds_azure_edge_proto.so
        msg-conv-config: /opt/nvidia/deepstream/deepstream/sources/apps/sample_apps/deepstream-test4/dstest4_msgconv_config.txt
        msg-conv-payload-type: 1
        topic: test-topic
        name: NvDsMsgConvBroker..bb00
    
  5. 通过在终端中运行以下命令,在主机上生成跨平台映像:

    cd /opt/nvidia/deepstream/deepstream/reference_graphs/deepstream-test4
    sudo container_builder -c ds_test4_container_builder_jetson.yaml -d /opt/nvidia/graph-composer/config/target_aarch64.yaml
    

    代码成功运行后,将出现包含 Successfully tagged deepstream-test4-jetson:latest 消息的输出。

  6. 现在,你已准备好将此映像发布到在上一个模块中创建的容器注册表。 在主机上的终端中运行以下代码,以使用遵循之前所使用格式的名称来标记映像。 对于<Login Server>,使用容器注册表的 URL。

    sudo docker tag deepstream-test4-jetson <Login Server>/deepstream_test4_jetson:v1
    
  7. 正确标记映像后,在主机上的终端中执行以下命令,将映像推送到 Azure 中的容器注册表。 对于<Login Server>,使用容器注册表的 URL。

    sudo docker push <Login Server>/deepstream_test4_jetson:v1
    

跨平台映像现已发布到 Azure 容器注册表,接下来可为 IoT Edge 运行时预配 NVIDIA 嵌入式硬件,并将此工作负载部署为 IoT Edge 模块。