Esercizio - Creare e pubblicare immagini di contenitore DeepStream multipiattaforma

Completato

Il pacchetto container-builder DeepStream 6.0 può creare immagini di contenitore multipiattaforma. È necessario usare questa capacità per creare un contenitore compatibile con la CPU ARM64 nel dispositivo NVIDIA incorporato di destinazione.

Completare i passaggi seguenti in un computer host basato su x86 con DeepStream 6.0 Graph Composer e Docker installato. Per questi passaggi si presuppone che siano state completate le fasi descritte in Installare e configurare un ambiente di sviluppo NVIDIA DeepStream e Introduzione al Graph Composer NVIDIA DeepStream con Microsoft Azure.

  1. Per iniziare è necessario installare i pacchetti qemu-user-static e binfmt-support. I pacchetti sono dipendenze necessarie per il supporto multipiattaforma in Docker. Per eseguire questo passaggio eseguire i comandi seguenti in un terminale nell'host:

    sudo apt install qemu-user-static binfmt-support
    
  2. Al termine dell'installazione eseguire i comandi seguenti nell'host per configurare il supporto multipiattaforma in Docker:

    sudo docker run --rm --privileged multiarch/qemu-user-static --reset --persistent yes --credential yes 
    
  3. Successivamente si creerà una configurazione container-builder che produrrà un contenitore basato su ARM64 per supportare il grafico deepstream-test4. Per iniziare, passare a /opt/nvidia/deepstream/deepstream/reference_graphs/deepstream-test4 e aprire il file ds_test4_container_builder_jetson.yaml con:

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

    Il contenuto del file ds_test4_container_builder_jetson.yaml non modificato è illustrato di seguito:

        %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
    

    Nota

    Ecco alcuni suggerimenti per l'uso dell'editor vi quando si modifica il file ds_test4_container_builder_jetson.yaml:

    • Per immettere la modalità di inserimento selezionare i. È quindi possibile apportare modifiche.
    • Per uscire dalla modalità di inserimento e tornare alla modalità normale, selezionare Esc.
    • Per salvare il file e uscire selezionare x, quindi selezionare Invio.
    • Per salvare il file selezionare w, quindi selezionare Invio.
    • Per uscire da vi, immettere Esci, quindi selezionare Invio.

    Prendere nota dell'ultima riga di questo file perché richiederà una modifica:

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

    Aggiornare questa sezione in modo che abbia l'aspetto seguente:

    image_name: deepstream-test4-jetson
    

    Nota

    Se questa sezione non viene modificata, i tentativi di compilazione dell'immagine multipiattaforma nei passaggi successivi generano l'errore seguente: ConnectionResetError: [Errno 104] Connection reset by peer

    Annotare che questa specifica usa un'immagine di base da nvcr.io e copie nei file deepstream-test4.yaml e parameters.yaml. Il punto di ingresso dell'immagine avvia il grafico deepstream-test4 e lo sostituisce con i valori presenti in parameters.yaml. Per questo motivo è anche necessario aggiornare questo file prima di compilare effettivamente il contenitore.

  4. Tornare alla directory dei grafici di riferimento deepstream-test4 e modificare il file parameters.yaml:

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

    Modificare il valore di msg-broker-proto-lib in /opt/nvidia/deepstream/deepstream/lib/libnvds_azure_edge_proto.so.

    Inoltre, modificare il valore di msg-conv-payload-type in 1. Questo parametro controlla la modalità di formattazione dell'output del messaggio risultante. Se non si modifica questo parametro l'output usa un formato hardcoded fornito negli esempi NVIDIA. Il formato potrebbe non rappresentare le classi di rilevamento degli oggetti se si aggiorna il modello usato in NvDsInferVideo.

    Il contenuto finale di parameters.yaml dovrebbe essere simile all'esempio seguente:

    ################################################################################
    # 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. Compilare l'immagine multipiattaforma nel computer host eseguendo il comando seguente in un terminale:

    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
    

    Dopo l'esecuzione corretta del codice viene visualizzato l'output contenente il messaggio Successfully tagged deepstream-test4-jetson:latest.

  6. A questo punto è possibile pubblicare questa immagine nel registro contenitori creato nel modulo precedente. Eseguire il codice seguente in un terminale nell'host per contrassegnare l'immagine con un nome che segue il formato usato in precedenza. Per <server di accesso> usare l'URL del registro contenitori.

    sudo docker tag deepstream-test4-jetson <Login Server>/deepstream_test4_jetson:v1
    
  7. Con l'immagine ora contrassegnata correttamente, eseguire il push dell'immagine nel registro contenitori in Azure eseguendo il comando seguente in un terminale nell'host. Per <server di accesso> usare l'URL del registro contenitori.

    sudo docker push <Login Server>/deepstream_test4_jetson:v1
    

Con l'immagine multipiattaforma ora pubblicata nel registro contenitori di Azure è possibile effettuare il provisioning dell'hardware incorporato NVIDIA per il runtime di IoT Edge e distribuire questo carico di lavoro come modulo IoT Edge.