练习 - 生成和发布跨平台 DeepStream 容器映像
DeepStream 6.0 container-builder
包可生成跨平台容器映像。 需要使用此功能在目标 NVIDIA 嵌入式设备上生成与 ARM64 CPU 兼容的容器。
在安装了附带 Docker 的 DeepStream 6.0 Graph Composer 的基于 x86 的主机上完成以下步骤。 假定你已完成前面的设置和配置 NVIDIA DeepStream 开发环境和使用 Azure 的 NVIDIA DeepStream Graph Composer 简介模块中介绍的步骤。
首先,必须安装
qemu-user-static
和binfmt-support
包。 这些包是 Docker 中跨平台支持所需的依赖项。 要执行此步骤,请在主机上的终端中运行以下命令:sudo apt install qemu-user-static binfmt-support
安装完成后,在主机上运行以下命令配置 Docker 的跨平台支持:
sudo docker run --rm --privileged multiarch/qemu-user-static --reset --persistent yes --credential yes
接下来,将创建一个
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.yaml
和parameters.yaml
文件中。 映像入口点启动 deepstream-test4 图并使用parameters.yaml
中存在的值覆盖它。 出于此原因,还需要在实际生成容器之前更新此文件。返回到 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
通过在终端中运行以下命令,在主机上生成跨平台映像:
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
消息的输出。现在,你已准备好将此映像发布到在上一个模块中创建的容器注册表。 在主机上的终端中运行以下代码,以使用遵循之前所使用格式的名称来标记映像。 对于<Login Server>,使用容器注册表的 URL。
sudo docker tag deepstream-test4-jetson <Login Server>/deepstream_test4_jetson:v1
正确标记映像后,在主机上的终端中执行以下命令,将映像推送到 Azure 中的容器注册表。 对于<Login Server>,使用容器注册表的 URL。
sudo docker push <Login Server>/deepstream_test4_jetson:v1
跨平台映像现已发布到 Azure 容器注册表,接下来可为 IoT Edge 运行时预配 NVIDIA 嵌入式硬件,并将此工作负载部署为 IoT Edge 模块。