Esercizio - Distribuire immagini DeepStream multipiattaforma in dispositivi incorporati NVIDIA con Azure IoT Edge

Completato

È stato pubblicato un carico di lavoro Graph Composer DeepStream in contenitori nel registro contenitori ed è stato effettuato il provisioning del dispositivo incorporato NVIDIA Jetson con il runtime IoT Edge. Si è ora pronti per creare una specifica di distribuzione nell'hub per eseguire il carico di lavoro come modulo IoT Edge.

  1. Nel portale di Azure passare all'hub IoT creato all'inizio di questo modulo. Nel menu a sinistra selezionare IoT Edge in Gestione dispositivi automatica. Cercare il dispositivo registrato.

    Screenshot che mostra la scheda Dispositivi IoT Edge nel portale di Azure.

  2. Per visualizzare i dettagli sulla configurazione corrente, selezionare il nome del dispositivo:

    Screenshot che mostra una panoramica del dispositivo IoT Edge.

  3. Selezionare la scheda Imposta moduli per aprire l'editor dei moduli:

    Screenshot che mostra il riquadro Moduli.

    È necessario specificare le credenziali appropriate del Registro Container, in modo che il dispositivo incorporato NVIDIA possa eseguire il pull dei carichi di lavoro dei contenitori dal registro contenitori.

  4. In una finestra del browser separata passare al registro contenitori nel portale di Azure:

    Screenshot che mostra una panoramica dell'istanza di Registro Azure Container.

  5. Nel menu a sinistra, in Impostazioni selezionare Chiavi di accesso. In Chiavi di accesso prendere nota dei valori per Server di accesso, Nome utente e Password. Questi valori verranno usati nel passaggio successivo.

    Screenshot che mostra le credenziali per il registro contenitori.

  6. Tornare alla finestra del browser aperta su Imposta moduli. In Credenziali del Registro Container immettere i valori delle chiavi di accesso del registro contenitori. Usando queste credenziali, qualsiasi dispositivo che applica questa specifica del modulo può eseguire il pull sicuro dei carichi di lavoro dei contenitori dal registro contenitori in Azure.

    Screenshot che mostra l'inserimento delle credenziali del registro contenitori nell'hub IoT di Azure.

  7. A questo punto verrà configurato un modulo IoT Edge personalizzato come parte della specifica di distribuzione. Nella sezione Moduli IoT Edge del riquadro Moduli selezionare Aggiungi>Modulo IoT Edge:

    Screenshot che mostra l'aggiunta di un modulo IoT Edge.

  8. In Aggiungi modulo IoT Edge immettere il nome del modulo deepstream_test4_jetson in Nome del modulo IoT Edge. In URI immagine immettere <server di accesso>/deepstream_test4_jetson:v1. Per <server di accesso> usare l'URL del registro contenitori.

    Screenshot che mostra l'immissione del nome e dell'URI dell'immagine per il modulo IoT Edge.

  9. Selezionare quindi la scheda Opzioni di creazione del contenitore per abilitare il supporto per l'accelerazione GPU e anche per fornire l'accesso al socket X11 per consentire il rendering dell'output video dal contenitore aggiungendo quanto segue:

    {
    "NetworkingConfig": {
        "EndpointsConfig": {
            "host": {}
        }
    },
    "HostConfig": {
        "DeviceRequests": [
            {
                "Count": -1,
                "Capabilities": [
                    [
                        "gpu"
                    ]
                ]
            }
        ],
        "NetworkMode": "host",
        "Binds": [
            "/tmp/.X11-unix/:/tmp/.X11-unix/",
            "/tmp/argus_socket:/tmp/argus_socket"
        ]
    }
    }
    

    Al termine, selezionare Aggiorna:

    Screenshot che mostra le opzioni di creazione del contenitore nel riquadro Moduli.

  10. Si tornerà alla pagina Imposta moduli nel dispositivo. Selezionare Rivedi e crea:

    Screenshot che mostra il pulsante Rivedi e crea evidenziato nel riquadro Moduli.

  11. Nella casella di testo Distribuzione viene visualizzata la specifica di distribuzione che si sta per inviare al dispositivo. Verificare che il contenuto sia simile a questo esempio:

    {
    "modulesContent": {
        "$edgeAgent": {
            "properties.desired": {
                "modules": {
                    "deepstream_test4_jetson": {
                        "settings": {
                            "image": "<Login Server>.azurecr.io/deepstream_test4_jetson:v1",
                            "createOptions": "{\"NetworkingConfig\":{\"EndpointsConfig\":{\"host\":{}}},\"HostConfig\":{\"DeviceRequests\":[{\"Count\":-1,\"Capabilities\":[[\"gpu\"]]}],\"NetworkMode\":\"host\",\"Binds\":[\"/tmp/.X11-unix/:/tmp/.X11-unix/\",\"/tmp/argus_socket:/tmp/argus_socket\"]}}"
                        },
                        "type": "docker",
                        "version": "1.0",
                        "env": {
                            "DISPLAY": {
                                "value": ":0"
                            }
                        },
                        "status": "running",
                        "restartPolicy": "always"
                    }
                },
                "runtime": {
                    "settings": {
                        "minDockerVersion": "v1.25",
                        "registryCredentials": {
                            "<Your Registry Name>": {
                                "address": "<Login Server>.azurecr.io",
                                "password": "<Your Password>",
                                "username": "<Your Username>"
                            }
                        }
                    },
                    "type": "docker"
                },
                "schemaVersion": "1.1",
                "systemModules": {
                    "edgeAgent": {
                        "settings": {
                            "image": "mcr.microsoft.com/azureiotedge-agent:1.1",
                            "createOptions": ""
                        },
                        "type": "docker"
                    },
                    "edgeHub": {
                        "settings": {
                            "image": "mcr.microsoft.com/azureiotedge-hub:1.1",
                            "createOptions": "{\"HostConfig\":{\"PortBindings\":{\"5671/tcp\":[{\"HostPort\":\"5671\"}],\"8883/tcp\":[{\"HostPort\":\"8883\"}],\"443/tcp\":[{\"HostPort\":\"443\"}]}}}"
                        },
                        "type": "docker",
                        "status": "running",
                        "restartPolicy": "always"
                    }
                }
            }
        },
        "$edgeHub": {
            "properties.desired": {
                "routes": {
                    "route": "FROM /messages/* INTO $upstream"
                },
                "schemaVersion": "1.1",
                "storeAndForwardConfiguration": {
                    "timeToLiveSecs": 7200
                }
            }
        },
        "deepstream_test4_jetson": {
            "properties.desired": {}
        }
    }
    }
    
  12. Verificare che la configurazione della distribuzione sia corretta e quindi selezionare Crea per avviare il processo di distribuzione:

    Screenshot che mostra la casella di testo Distribuzione e il pulsante Crea.

  13. Per verificare l'esito positivo della distribuzione, eseguire i comandi seguenti in un terminale nel dispositivo incorporato NVIDIA:

    sudo iotedge list
    
  14. Verificare che l'output mostri lo stato running per i moduli edgeAgent, edgeHub e deepstream_test4_jetson.

    Se il dispositivo è connesso a uno schermo, dovrebbe essere visibile l'output visualizzato dell'applicazione Graph Composer DeepStream, come in questo esempio:

    Screenshot che mostra il modulo IoT Edge in esecuzione su hardware Jetson.

  15. Monitorare l'output del modulo deepstream_test4_jetson eseguendo il comando seguente in un terminale nel dispositivo incorporato NVIDIA Jetson:

    sudo docker logs -f deepstream_test4_jetson
    

    Ogni pochi secondi, il dispositivo invia i dati di telemetria all'hub registrato in hub IoT di Azure. Viene visualizzato un messaggio simile all'esempio seguente:

    Message sent : {
      "version" : "4.0",
      "id" : 1440,
      "@timestamp" : "2021-09-21T03:08:51.161Z",
      "sensorId" : "sensor-0",
      "objects" : [
        "-1|570|478.37|609|507.717|Vehicle|#|sedan|Bugatti|M|blue|XX1234|CA|-0.1"
      ]
    }
    
  16. È possibile confermare lo stato dei moduli in esecuzione nel portale di Azure tornando alla panoramica per il dispositivo IoT Edge. Verranno visualizzati i moduli seguenti e gli stati associati per il dispositivo:

    Screenshot che mostra una panoramica del dispositivo IoT Edge con lo stato del runtime.

  17. È anche possibile confermare nel riquadro di panoramica di hub IoT che i messaggi stanno arrivando nell'hub dal dispositivo. Si dovrebbe notare un aumento dei messaggi:

    Screenshot che mostra i grafici che raffigurano i messaggi ricevuti nel riquadro Utilizzo dell'hub IoT.

Complimenti. È stata sviluppata correttamente una distribuzione perimetrale di livello di produzione di un carico di lavoro Graph Composer DeepStream, poi distribuita in un dispositivo reale usando Azure IoT Edge.

Prova

Usando le strategie descritte in questo modulo, come è possibile modificare un grafo di riferimento DeepStream esistente per supportare una soluzione di conservazione della fauna selvatica che conta istanze univoche delle specie in pericolo usando feed di videocamere live? Quali componenti è necessario modificare per supportare questa soluzione? È necessario apportare modifiche alla strategia di distribuzione complessiva?