Procédure d’empaquetage d’un modèle inscrit avec Docker
Cet article explique la procédure d’empaquetage d’un modèle Azure Machine Learning inscrit avec Docker.
Prérequis
Cet article suppose que vous avez déjà formé et inscrit un modèle dans votre espace de travail Machine Learning. Pour apprendre à former et inscrire un modèlescikit-learn, suivez ce didacticiel.
Modèles de package
Dans certains cas, vous pouvez créer une image Docker sans déployer le modèle. Vous pouvez également télécharger l’image et l’exécuter sur une installation locale de Docker. Vous pouvez même télécharger les fichiers utilisés pour générer l’image, les inspecter, les modifier, puis générer l’image manuellement.
L’empaquetage de modèle vous permet d’effectuer ces deux opérations. Il empaquette toutes les ressources nécessaires pour héberger un modèle en tant que service web, et vous permet de télécharger une image Docker entièrement générée ou les fichiers nécessaires pour en générer une. Vous pouvez utiliser l’empaquetage de modèle de deux façons :
Télécharger un modèle empaqueté : téléchargez une image Docker contenant le modèle et les autres fichiers nécessaires pour l’héberger en tant que service web.
Générer un fichier Docker : téléchargez le fichier Docker, le modèle, le script d’entrée et les autres ressources nécessaires pour générer une image Docker. Vous pouvez ensuite inspecter les fichiers ou apporter des modifications avant de générer l’image localement.
Les deux packages permettent d’obtenir une image Docker locale.
Conseil
La création d’un package est similaire au déploiement d’un modèle. Vous utilisez un modèle inscrit et une configuration d’inférence.
Important
Pour télécharger une image entièrement générée ou générer une image localement, Docker doit être installé dans votre environnement de développement.
Télécharger un modèle empaqueté
L’exemple suivant génère une image qui est inscrite dans le registre de conteneurs Azure pour votre espace de travail :
package = Model.package(ws, [model], inference_config)
package.wait_for_creation(show_output=True)
Après avoir créé un package, vous pouvez utiliser package.pull()
pour extraire l’image dans votre environnement Docker local. La sortie de cette commande affiche le nom de l’image. Par exemple :
Status: Downloaded newer image for myworkspacef78fd10.azurecr.io/package:20190822181338
.
Une fois le modèle téléchargé, utilisez la commande docker images
pour lister les images locales :
REPOSITORY TAG IMAGE ID CREATED SIZE
myworkspacef78fd10.azurecr.io/package 20190822181338 7ff48015d5bd 4 minutes ago 1.43 GB
Pour démarrer un conteneur local basé sur cette image, utilisez la commande suivante afin de démarrer un conteneur nommé à partir de l’interpréteur de commandes ou de la ligne de commande. Remplacez la valeur <imageid>
par l’ID d’image retourné par la commande docker images
.
docker run -p 6789:5001 --name mycontainer <imageid>
Cette commande démarre la version la plus récente de l’image nommée myimage
. Elle mappe le port local 6789 au port du conteneur sur lequel le service web écoute (5001). Elle affecte également le nom mycontainer
au conteneur, ce qui en facilite l’arrêt. Une fois le conteneur démarré, vous pouvez envoyer des demandes à http://localhost:6789/score
.
Générer un fichier Docker et des dépendances
L’exemple suivant montre comment télécharger le fichier Docker, le modèle et les autres ressources nécessaires pour générer une image localement. Le paramètre generate_dockerfile=True
indique que vous souhaitez les fichiers, et non une image entièrement générée.
package = Model.package(ws, [model], inference_config, generate_dockerfile=True)
package.wait_for_creation(show_output=True)
# Download the package.
package.save("./imagefiles")
# Get the Azure container registry that the model/Dockerfile uses.
acr=package.get_container_registry()
print("Address:", acr.address)
print("Username:", acr.username)
print("Password:", acr.password)
Ce code télécharge les fichiers nécessaires à la création de l’image dans le répertoire imagefiles
. Le fichier Docker inclus dans les fichiers enregistrés référence une image de base stockée dans un registre de conteneurs Azure. Quand vous générez l’image sur votre installation Docker locale, vous devez utiliser l’adresse, le nom d’utilisateur et le mot de passe pour vous authentifier auprès du registre. Pour générer l’image à l’aide d’une installation Docker locale, effectuez les étapes suivantes :
À partir d’un interpréteur de commandes ou d’une session de ligne de commande, utilisez la commande suivante pour authentifier Docker auprès du registre de conteneurs Azure. Remplacez
<address>
,<username>
et<password>
par les valeurs récupérées parpackage.get_container_registry()
.docker login <address> -u <username> -p <password>
Pour créer l’image, utilisez la commande suivante. Remplacez
<imagefiles>
par le chemin du répertoire dans lequel la commandepackage.save()
a enregistré les fichiers.docker build --tag myimage <imagefiles>
Cette commande définit le nom de l’ image sur
myimage
.
Pour vérifier que l’image est générée, utilisez la commande docker images
. L’image myimage
doit figurer dans la liste :
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> 2d5ee0bf3b3b 49 seconds ago 1.43 GB
myimage latest 739f22498d64 3 minutes ago 1.43 GB
Pour démarrer un conteneur basé sur cette image, utilisez la commande suivante :
docker run -p 6789:5001 --name mycontainer myimage:latest
Cette commande démarre la version la plus récente de l’image nommée myimage
. Elle mappe le port local 6789 au port du conteneur sur lequel le service web écoute (5001). Elle affecte également le nom mycontainer
au conteneur, ce qui en facilite l’arrêt. Une fois le conteneur démarré, vous pouvez envoyer des demandes à http://localhost:6789/score
.
Exemple de client pour tester le conteneur local
Le code suivant est un exemple de client Python utilisable avec le conteneur :
import requests
import json
# URL for the web service.
scoring_uri = 'http://localhost:6789/score'
# Two sets of data to score, so we get two results back.
data = {"data":
[
[ 1,2,3,4,5,6,7,8,9,10 ],
[ 10,9,8,7,6,5,4,3,2,1 ]
]
}
# Convert to JSON string.
input_data = json.dumps(data)
# Set the content type.
headers = {'Content-Type': 'application/json'}
# Make the request and display the response.
resp = requests.post(scoring_uri, input_data, headers=headers)
print(resp.text)
Pour obtenir des exemples de clients dans d’autres langages de programmation, consultez Utiliser des modèles déployés en tant que services web.
Arrêter le conteneur Docker
Pour arrêter le conteneur, utilisez la commande suivante à partir d’un autre interpréteur de commandes ou d’une autre ligne de commande :
docker kill mycontainer
Étapes suivantes
- Résoudre des problèmes d’échec de déploiement
- Déployer dans Azure Kubernetes Service
- Créer des applications clientes pour utiliser des services web
- Mettre à jour un service web
- Guide pratique pour déployer un modèle à l’aide d’une image Docker personnalisée
- Utiliser TLS pour sécuriser un service web par le biais d’Azure Machine Learning
- Superviser vos modèles Azure Machine Learning avec Application Insights
- Collecter des données pour des modèles en production
- Créer des alertes d’événement et des déclencheurs pour les déploiements de modèle