Exercício – Criar e publicar imagens de contêiner multiplataforma do DeepStream

Concluído

O pacote do DeepStream 6.0 container-builder pode criar imagens de contêiner multiplataforma. Você precisará usar essa capacidade para criar um contêiner compatível com a CPU ARM64 no seu dispositivo NVIDIA inserido de destino.

Conclua as etapas a seguir em um computador host baseado em x86 que tenha o DeepStream 6.0 Graph Composer com o Docker instalado. As etapas consideram que você concluiu as etapas descritas em Instalar e configurar um ambiente de desenvolvimento NVIDIA DeepStream e Introdução ao NVIDIA DeepStream Graph Composer com o Azure.

  1. Para começar, você deve instalar os pacotes qemu-user-static e binfmt-support. Eles são dependências necessárias para o suporte multiplataforma no Docker. Para concluir esta etapa, execute os seguintes comandos em um terminal no host:

    sudo apt install qemu-user-static binfmt-support
    
  2. Quando a instalação for concluída, execute os seguintes comandos no host para configurar o suporte multiplataforma no Docker:

    sudo docker run --rm --privileged multiarch/qemu-user-static --reset --persistent yes --credential yes 
    
  3. Depois, você criará uma configuração container-builder que produzirá um contêiner baseado em ARM64 para dar suporte ao grafo deepstream-test4. Para começar, acesse /opt/nvidia/deepstream/deepstream/reference_graphs/deepstream-test4 e abra o arquivo ds_test4_container_builder_jetson.yaml com:

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

    O conteúdo do arquivo não modificado ds_test4_container_builder_jetson.yaml é mostrado abaixo:

        %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
    

    Observação

    Confira algumas dicas para usar o editor vi ao editar o arquivo ds_test4_container_builder_jetson.yaml:

    • Para entrar no modo de inserção, selecione i. Depois, você pode fazer alterações.
    • Para sair do modo de inserção e retornar ao modo normal, pressione ESC.
    • Para salvar o arquivo e sair, pressione x e Enter.
    • Para salvar o arquivo, pressione w e Enter.
    • Para sair do vi, digite Quit e pressione Enter.

    Anote a última linha desse arquivo, pois ele exigirá uma modificação:

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

    Atualize essa seção para que se pareça com o seguinte:

    image_name: deepstream-test4-jetson
    

    Observação

    Se você não modificar essa seção, as tentativas de criar a imagem multiplataforma nas próximas etapas produzirão o seguinte erro: ConnectionResetError: [Errno 104] Connection reset by peer

    Observe que essa especificação usa uma imagem base de nvcr.io e das cópias nos arquivos deepstream-test4.yaml e parameters.yaml. O ponto de entrada da imagem inicia o grafo deepstream-test4 e o substitui pelos valores presentes em parameters.yaml. Por esse motivo, também precisamos atualizar esse arquivo antes de realmente criarmos o contêiner.

  4. Retorne ao diretório dos grafos de referência deepstream-test4 e edite o arquivo parameters.yaml:

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

    Altere o valor de msg-broker-proto-lib para /opt/nvidia/deepstream/deepstream/lib/libnvds_azure_edge_proto.so.

    Além disso, altere o valor de msg-conv-payload-type para 1. Esse parâmetro controla como a saída da mensagem resultante é formatada. Se você não alterar esse parâmetro, a saída usará um formato embutido em código fornecido nos exemplos da NVIDIA. O formato pode não representar suas classes de detecção de objetos se você atualizar o modelo usado no NvDsInferVideo.

    O conteúdo final de parameters.yaml deve ser semelhante ao seguinte exemplo:

    ################################################################################
    # 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. Crie a imagem multiplataforma no computador host executando o seguinte comando em um terminal:

    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
    

    Depois que o código for executado com êxito, a saída que contém a mensagem Successfully tagged deepstream-test4-jetson:latest será exibida.

  6. Agora, você está pronto para publicar essa imagem no registro de contêiner criado no módulo anterior. Execute o código a seguir em um terminal no host para marcar a imagem com um nome que segue o formato usado anteriormente. Para <Servidor de Logon>, use a URL do seu registro de contêiner.

    sudo docker tag deepstream-test4-jetson <Login Server>/deepstream_test4_jetson:v1
    
  7. Com sua imagem agora marcada corretamente, envie-a para o seu registro de contêiner no Azure executando o comando a seguir em um terminal no host. Para <Servidor de Logon>, use a URL do seu registro de contêiner.

    sudo docker push <Login Server>/deepstream_test4_jetson:v1
    

Com a imagem multiplataforma agora publicada no registro de contêiner do Azure, você está pronto para provisionar o hardware NVIDIA inserido para o runtime do IoT Edge e implantar essa carga de trabalho como um módulo do IoT Edge.