Exercice - Créer et publier des images conteneur DeepStream multiplateformes

Effectué

Le package DeepStream 6.0 container-builder peut générer des images de conteneur multiplateforme. Vous devez utiliser cette fonctionnalité pour créer un conteneur compatible avec l’UC ARM64 sur votre appareil incorporé NVIDIA cible.

Effectuez les étapes suivantes sur un ordinateur hôte x86 sur lequel DeepStream 6.0 Graph Composer avec Docker est installé. Les étapes partent du principe que vous avez effectué les étapes décrites dans Installer et configurer un environnement de développement NVIDIA DeepStream et Présentation de NVIDIA DeepStream Graph Composer avec Azure.

  1. Pour commencer, vous devez installer les packages qemu-user-static et binfmt-support. Les packages sont des dépendances nécessaires pour la prise en charge multiplateforme dans Docker. Pour cette étape, exécutez les commandes suivantes dans un terminal sur l’ordinateur hôte :

    sudo apt install qemu-user-static binfmt-support
    
  2. Une fois l’installation terminée, exécutez les commandes suivantes sur l’ordinateur hôte afin de configurer la prise en charge multiplateforme dans Docker :

    sudo docker run --rm --privileged multiarch/qemu-user-static --reset --persistent yes --credential yes 
    
  3. Vous allez ensuite créer une configuration container-builder qui produira un conteneur ARM64 pour prendre en charge le graphique deepstream-test4. Pour commencer, accédez à /opt/nvidia/deepstream/deepstream/reference_graphs/deepstream-test4 et ouvrez le fichier ds_test4_container_builder_jetson.yaml avec :

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

    Le contenu du fichier non modifié ds_test4_container_builder_jetson.yaml est indiqué ci-dessous :

        %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
    

    Notes

    Voici quelques conseils pour l’utilisation de l’éditeur vi lorsque vous modifiez le fichier ds_test4_container_builder_jetson. YAML :

    • Pour passer en mode Insertion, sélectionnez i. Vous pouvez ensuite apporter des modifications.
    • Pour quitter le mode Insertion et revenir au mode normal, sélectionnez Échap.
    • Pour enregistrer le fichier et quitter, sélectionnez x, puis Entrée.
    • Pour enregistrer le fichier, sélectionnezw, puis Entrée.
    • Pour quitter vi, entrez Quitter, puis sélectionnez Entrée.

    Notez la dernière ligne de ce fichier car il vous faudra la modifier :

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

    Mettez à jour cette section pour qu’elle se présente comme suit :

    image_name: deepstream-test4-jetson
    

    Notes

    À défaut de modifier cette section, les tentatives de génération de l’image multiplateforme lors des étapes ultérieures produiront l’erreur suivante : ConnectionResetError: [Errno 104] Connection reset by peer

    Notez que cette spécification utilise une image de base de nvcr.io et copie les fichiers deepstream-test4.yaml et parameters.yaml. Le point d’entrée de l’image démarre le graphique deepstream-test4 et le remplace par les valeurs présentes dans parameters.yaml. Dès lors, il nous faut mettre à jour ce fichier avant de générer le conteneur.

  4. Revenez au répertoire des graphiques de référence deepstream-test4, puis modifiez le fichier parameters.yaml :

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

    Remplacez la valeur de msg-broker-proto-lib par /opt/nvidia/deepstream/deepstream/lib/libnvds_azure_edge_proto.so.

    Remplacez également la valeur de msg-conv-payload-type par 1. Ce paramètre contrôle la manière dont la sortie de message qui en résulte est mise en forme. À défaut de modifier ce paramètre, la sortie utilise un format codé en dur fourni dans les exemples NVIDIA. Le format peut ne pas représenter vos classes de détection d’objets si vous mettez à jour le modèle utilisé dans NvDsInferVideo.

    Le contenu final de parameters.yaml doit ressembler à l’exemple suivant :

    ################################################################################
    # 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. Générez l’image multiplateforme sur l’ordinateur hôte en exécutant la commande suivante dans un 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
    

    Une fois le code exécuté avec succès, la sortie contenant le message Successfully tagged deepstream-test4-jetson:latest s’affiche.

  6. Vous êtes maintenant prêt à publier cette image dans le registre de conteneurs que vous avez créé dans le module précédent. Exécutez le code suivant dans un terminal sur l’hôte pour identifier l’image avec un nom suivant le format que vous avez utilisé précédemment. Pour <Serveur de connexion>, utilisez l’URL de votre registre de conteneurs.

    sudo docker tag deepstream-test4-jetson <Login Server>/deepstream_test4_jetson:v1
    
  7. Une fois votre image correctement identifiée, envoyez-la (push) vers votre registre de conteneurs dans Azure en exécutant la commande suivante dans un terminal sur l’hôte. Pour <Serveur de connexion>, utilisez l’URL de votre registre de conteneurs.

    sudo docker push <Login Server>/deepstream_test4_jetson:v1
    

Maintenant que votre image multiplateforme est publiée dans Azure Container Registry, vous êtes prêt à approvisionner votre matériel incorporé NVIDIA pour le runtime IoT Edge et à déployer cette charge de travail en tant que module IoT Edge.