Déployer un modèle sur Azure IoT Edge
Dans le billet précédent de cette série billets sur les nouveaux services d'Azure Machine Learning (Azure ML), nous avons illustré la façon de déployer un modèle empaqueté dans un conteneur Docker sous forme de service web dans Azure.
Avec la nouvelle version de ce mois de décembre 2017 du service de gestion des modèles d'Azure ML, vous pouvez dorénavant déployer ce conteneur sur un appareil au plus près de la source des données typiquement pour les scénarios liés à l'Internet des objets (IoT). Au-delà d'un cloud « intelligent », cette approche permet de porter l'« intelligence en bordure ». C'est en particulier l'un des scénarios que permet d'aborder Azure IoT Edge, actuellement disponible en version préliminaire publique
Je vous propose d'aborder tout cela dans ce billet et j'en profite pour remercier Paul Jenny actuellement en stage de fin d'étude au sein de Microsoft France pour cette contribution.
Une rapide présentation d'Azure IoT Edge
Les appareils connectés qui composent ce qu'il convient d'appeler l'IoT sont typiquement situés en bordure du cloud. Ils n'ont généralement qu'une faible puissance de calcul ainsi des capacités de connexion réseau vers l'externe limitées (protocole(s) pris en charge, consommation induite, etc.).
Ainsi, les rendre « intelligents » avec l'Intelligence Artificielle (IA) devient vite compliquée à mettre en place dû à ces deux contraintes (calcul, réseau).
Afin de s'affranchir de ces contraintes, Azure IoT Edge permet d'apporter l'intelligence jusqu'en bordure du cloud afin d'offrir un ensemble de services cloud intelligent. Vous pourrez ainsi déployer vos propres applications ou des modèles (dans ou) au plus près de vos objets connectés en bordure et traiter en local les différentes données provenant de sources locales à l'objet considéré (capteurs de température, de pression, détecteur de présence, etc.. Un cas d'exemple serait l'utilisation d'Azure IoT Edge sur un moteur d'avion pour effectuer de la maintenance prédictive en cas de détection d'un risque élevé de panne proche.
La mise en place d'Azure IoT Edge
Pour pouvoir déployer sur Azure IoT Edge, il faut au préalable avoir configuré un hub Azure IoT ainsi qu'avoir configuré un module.
Remarque : Vous avez besoin d'un abonnement Azure pour pouvoir effectuer la suite de ce tutoriel. Si vous n'avez encore de compte Azure, vous pouvez créer un compte gratuit ici. Nous supposons que vous disposez à ce stade d'un tel compte.
La première étape est de configurer votre ordinateur ou votre machine virtuelle pour simuler un appareil IoT. Pour cela, vous devez installer Docker pour Windows et Python 2.7 . Ensuite, via une invite de commandes, vous devez installer le paquet de contrôle d'Azure IoT avec pip:
pip install -U azure-iot-edge-runtime-ctl
Vous devez ensuite créer un hub Azure IoT sur le portail Azure afin de pouvoir inscrire un appareil dans ce hub. Pour cela, vous pouvez passer par Azure Cloud Shell, le Shell intégré au portail d'Azure ou plutôt effectuer les mêmes opérations graphiquement.
La création de hub avec Azure Cloud Shell
Une fois connecté au Portail Azure, vous pouvez sélectionner dans la barre de tâches en haut du portail le Shell Azure en PowerShell ou Bash :
Il est recommandé de créer un groupe de ressources pour chaque projet afin de gérer au mieux vos ressources sur Azure. Dans le Shell situé ci-dessous, vous devez saisir la commande suivante :
az group create --name iotedge --location westeurope
Cette commande permet de créer un groupe de ressources nommé « iotedge » situé par exemple ici dans la région Azure en Europe de l'Ouest.
Remarque : Le nom d'un groupe de ressources doit être unique à travers Azure. Il se peut ainsi que ce nom puisse déjà être utilisé par quelqu'un d'autre.
La seconde étape est de créer l'hub Azure IoT dans ce groupe de ressources :
az iot hub create --resource-group iotedge --name moniothub --sku F1
Cette commande permet de créer un hub IoT dans le groupe de ressources iotedge avec pour nom moniothub et le plan de tarification F1 pour les besoins de ce tutoriel (gratuit, limité à un par abonnement Azure).
Créer le hub depuis le portail Azure
Une fois connecté au portail Azure, vous pouvez sélectionner sur la droite Créer une ressource :
Recherchez ensuite IoT Hub :
Puis sélectionnez la ressource IoT Hub et enfin Créer.
Dans le formulaire, vous devez indiquer le nom de votre hub IoT (il doit être unique). Choisissez ensuite le niveau de tarification F1, correspondant au niveau gratuit, suffisant pour effectuer nos tests (limité à un par abonnement Azure).
Concernant le groupe de ressources, il est recommandé de créer un groupe de ressources pour chaque projet sur Azure afin de pouvoir organiser les ressources au mieux. Vous pouvez néanmoins en utiliser un existant si vous le souhaitez. Une fois tout ceci fait, il suffit de cliquer sur Créer.
Il faut maintenant attendre le déploiement de cette nouvelle ressource dans Azure.
L'inscription d'un appareil IoT Edge
Une fois votre hub IoT déployé, vous pouvez maintenant ajouter un appareil IoT Edge dans celui-ci. Sur le portail Azure, sélectionnez votre hub sur le tableau de bord sinon recherchez-le via le menu Toutes les ressources à gauche :
Une fois le panneau du hub ouvert, sélectionnez IoT Edge (preview) dans le menu à gauche :
Il faut maintenant ajouter un appareil IoT à votre hub avec le bouton Add IoT Edge Device :
Dans l'approche suggérée ici pour les besoins de notre illustration, cet appareil est votre ordinateur ou votre machine virtuelle. Dans le formulaire qui vient de s'ouvrir sur la droite, vous devrez insérer l'ID de l'appareil. Celui-ci doit être unique et doit être composé de caractères alphanumériques. Ensuite, il est préférable de laisser Azure générer automatiquement les clés SSH associées à votre appareil pour la connexion.
Une fois l'appareil ajouté, il faut le configurer pour accéder à votre hub IoT. Pour cela, il convient au préalable récupérer les clés de connexion. Pour ce faire, sélectionnez-le dans la liste des appareils de votre hub IoT :
Dans la nouvelle fenêtre, copiez la Chaîne de connexion - clé primaire et conservez-la dans votre presse-papiers.
Vous pouvez maintenant passer à la configuration de votre appareil IoT. Ouvrez maintenant un terminal de commandes sur votre ordinateur ou machine virtuelle puis saisissez la commande suivante :
iotedgectl setup --connection-string [VOTRE_CHAINE_CONNEXION] --auto-cert-gen-force-no-passwords
Cette commande permet de configure votre appareil IoT avec votre hub IoT Azure. Deux modules (sous forme de conteneur Docker) sont ainsi déployés, à savoir :
- L'agent IoT Edge qui gère le déploiement et la surveillance des modules de votre appareil IoT
- L'agent hub IoT qui gère la communication entre vos modules et votre hub IoT.
La dernière étape consiste enfin à lancer vos modules IoT avec la commande suivante :
iotedgectl start
Vous pouvez vérifier que tout fonctionne bien avec la commande Docker qui permet de lister les conteneurs actifs :
docker ps
Vous devez avoir le conteneur basé sur l'image « microsoft/azureiotedge-agent:1.0-preview » qui fonctionne.
La création de votre image Docker
Pour pouvoir déployer votre modèle sur votre module IoT, la première étape est de créer l'image Docker associée à celui-ci.
Si vous n'avez pas lu l'article sur le déploiement d'un modèle sous forme de service web ici, nous vous invitons à le consulter au préalable. Les différentes étapes et explications sont décrites dans ce billet.
Pour les besoins de ce billet, vous pouvez utiliser l'exemple fourni par le tutoriel officiel en téléchargeant le fichier score ici et le modèle ici. Ensuite, il vous suffit avec une invite de commandes de saisir la commande ci-dessous dans le dossier contenant les deux fichiers précédents :
az ml service create realtime –model-file model.pkl -f iot_score.py -n machinelearningmodule -r python
Cette commande permet de créer le manifeste, de générer l'image Docker associée et enfin de publier le service web. Celui-ci est appelé machinelearningmodule tout comme l'image Docker.
Le déploiement de votre modèle en module IoT
Pour pouvoir récupérer l'image Docker de votre modèle, il faut ajouter la connexion au répertoire Docker à votre appareil IoT. Pour cela, il faut au préalable récupérer les identifiants de connexion de votre Azure Container Registry qui a été créé lors de la création de votre environnement de déploiement :
Pour ce faire, rendez-vous sur le portail Azure et accédez au menu Toutes les ressources situé à droite :
Si vous possédez plusieurs environnements de déploiements, vous pouvez utiliser la commande suivante depuis un invite de commandes pour rechercher rapidement le groupe de ressources associé à votre registre de conteneurs où l'image Docker a été déployé, :
az ml env show -n [VOTRE_ENVIRONNEMENT] -v
Recherchez dans le résultat de la commande la propriété containerRegistry, puis resourceId. L'URL est sous la forme :
[VOTRE_ID_ABONNEMENT] / resourcegroups / [VOTRE_ID_GROUPE_RESSOURCES] / providers / ….
La partie importante ici est [VOTRE_ID_GROUPE_RESSOURCES]. Par exemple, ci-dessous, le groupe de ressources serait PaulML-azureml-7f27d :
Une fois que vous disposez du groupe de ressources dans lequel se trouve votre registre de conteneurs, il vous suffit de le sélectionner sur le portail Azure :
Dans la nouvelle fenêtre, accédez au menu Clés d'accès :
Vous aurez ainsi besoin du serveur de connexion et du nom d'utilisateur et mot de passe associés :
Vous allez enfin pouvoir ajouter la connexion à ce répertoire Docker à votre appareil IoT. Pour cela, dans une invite de commandes, saisissez la commande suivante en remplaçant les valeurs avec les données que vous avez récupérées ci-dessus :
iotedgectl login –address [SERVEUR_CONNEXION] –username [NOM_UTILISATEUR] –password [MOT_DE_PASSE]
Une fois ceci fait, vous pouvez passer au déploiement en tant que tel du module contenant votre image Docker sur votre appareil IoT. Pour cela, toujours sur le portail Azure, allez sur votre hub IoT puis dans le menu IoT Edge (preview) puis sélectionnez votre appareil IoT. Cliquez ensuite sur Set Modules située en haut du menu :
Nous allons à présent ajouter le module à cet appareil IoT en cliquant sur Add IoT Edge Module :
Dans le menu déroulant à droite, vous devez donner un nom à ce module IoT puis indiquer l'image Docker sur lequel le conteneur sera basé. L'URI vers l'image est sous la forme :
[SERVEUR_CONNEXION_DOCKER] / [NOM_IMAGE] :1
Par exemple, ici, avec le nom d'image que nous avons utilisé auparavant, ce serait :
mlcrparc4ff11505f691.azurecr.io/machinelearningmodule :1
Une fois le formulaire rempli, cliquez sur Next.
La seconde étape permet de créer des routes personnalisées inter-modules ou avec l'hub IoT. Ici, le service web devrait fonctionner de lui-même sans personnalisation supplémentaire.
Puis cliquez sur Next et enfin Submit. Une demande de déploiement sur votre appareil IoT est ainsi créé. Une fois celui-ci achevé, vous aurez une notification dans le portail Azure :
Ensuite, pour pouvoir envoyer des messages à votre module IoT afin de prédire des données, deux options s'offrent à vous : i ) utiliser le portail Azure ou ii) développer votre propre solution.
L'envoi des messages vers votre module IoT
Via un code personnalisé
La documentation officielle recense différents exemples pour pouvoir contacter votre module IoT dans plusieurs langages.
Via le portail Azure
Vous pouvez envoyer des messages depuis le portail Azure avec votre hub IoT. Pour cela, retournez dans la configuration de votre hub IoT. Sélectionnez ensuite le module vers lequel vous souhaitez envoyer un message puis cliquez sur Message à l'appareil :
Entrez dans le Corps du message les données que vous souhaitez prédire selon le format attendu par votre service web :
En guise de conclusion
Nous espérons que ce billet vous aura permis de découvrir comment déployer un modèle d'Azure ML vers un module IoT empaqueté dans un conteneur Docker sous forme de service web. Ceci clôt notre billet.
Enfin, si besoin, vous pouvez retrouver la documentation officielle d'Azure IoT Edge ici ainsi que le tutoriel de démarrage ici associé.