Partager via


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 :

  1. À 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 par package.get_container_registry().

    docker login <address> -u <username> -p <password>
    
  2. Pour créer l’image, utilisez la commande suivante. Remplacez <imagefiles> par le chemin du répertoire dans lequel la commande package.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