Premiers pas : Diffuser des prédictions PyTorch avec un conteneur personnalisé

Ce tutoriel explique comment utiliser un conteneur personnalisé pour déployer un modèle de machine learning (ML) PyTorch qui diffuse des prédictions en ligne.

Dans ce tutoriel, vous allez déployer un conteneur exécutant l'outil TorchServe de PyTorch pour diffuser des prédictions à partir d'un modèle de reconnaissance des chiffres fourni par TorchServe, pré-entraîné sur l'ensemble de données MNIST. Vous pouvez ensuite utiliser AI Platform Prediction pour classer les images des chiffres.

Avant de commencer

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the AI Platform Training & Prediction and Artifact Registry API APIs.

    Enable the APIs

  5. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  6. Make sure that billing is enabled for your Google Cloud project.

  7. Enable the AI Platform Training & Prediction and Artifact Registry API APIs.

    Enable the APIs

  8. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

Tout au long de ce tutoriel, nous vous recommandons d'utiliser Cloud Shell pour interagir avec Google Cloud. Si vous souhaitez utiliser une autre interface système Bash au lieu de Cloud Shell, exécutez la configuration supplémentaire suivante :

  1. Install the Google Cloud CLI.
  2. To initialize the gcloud CLI, run the following command:

    gcloud init
  3. Consultez la documentation de Artifact Registry pour installer Docker.

Créer et transférer l'image de conteneur

Pour utiliser un conteneur personnalisé, vous devez spécifier une image de conteneur Docker répondant aux exigences de conteneur personnalisé. Cette section explique comment créer l'image de conteneur et la transférer dans Artifact Registry.

Télécharger des artefacts de modèle

Les artefacts de modèle sont des fichiers créés par l'entraînement de ML que vous pouvez utiliser pour diffuser des prédictions. Ils contiennent, au minimum, la structure et les pondérations de votre modèle de ML entraîné. Le format des artefacts de modèle dépend du framework de ML que vous utilisez pour l'entraînement.

Pour ce tutoriel, au lieu d'entraîner à partir de zéro, téléchargez des exemples d'artefacts de modèle fournis par TorchServe.

Pour cloner le dépôt TorchServe et accéder au répertoire contenant les artefacts de modèle, exécutez les commandes suivantes dans votre interface système :

git clone https://github.com/pytorch/serve.git \
  --branch=v0.3.0 \
  --depth=1

cd serve/examples/image_classifier/mnist

Ce répertoire contient trois fichiers importants à intégrer dans l'image de votre conteneur :

  • mnist.py : définit la structure du réseau de neurones entraîné
  • mnist_cnn.pt: contient un state_dict avec des pondérations de caractéristiques et autres résultats de l'entraînement
  • mnist_handler.py : étend la manière dont TorchServe gère les requêtes de prédiction

Créer un dépôt Artifact Registry

Créez un dépôt Artifact Registry pour stocker l'image de conteneur que vous allez créer dans la section suivante. Exécutez la commande suivante dans votre interface système :

gcloud beta artifacts repositories create getting-started-pytorch \
 --repository-format=docker \
 --location=REGION

Remplacez REGION par la région où vous souhaitez qu'Artifact Registry stocke votre image de conteneur. Vous devez ensuite créer une ressource de modèle AI Platform Prediction sur un point de terminaison régional correspondant à cette région. Par conséquent, choisissez une région dans laquelle AI Platform Prediction possède un point de terminaison régional. Par exemple, us-central1.

Une fois l'opération terminée, cette commande affiche l'entrée suivante :

Created repository [getting-started-pytorch].

Créer l'image de conteneur

TorchServe fournit un fichier Dockerfile pour créer une image de conteneur exécutant TorchServe. Toutefois, au lieu d'utiliser ce fichier Dockerfile pour installer toutes les dépendances de TorchServe, vous pouvez accélérer le processus de compilation en générant votre image de conteneur à partir d'une des images TorchServe transmises par l'équipe TorchServe à Docker Hub.

  1. Dans le répertoire contenant les artefacts de modèle, créez un fichier Dockerfile en exécutant la commande suivante dans votre interface système :

    cat > Dockerfile <<END
    FROM pytorch/torchserve:0.3.0-cpu
    
    COPY mnist.py mnist_cnn.pt mnist_handler.py /home/model-server/
    
    USER root
    RUN printf "\nservice_envelope=json" >> /home/model-server/config.properties
    USER model-server
    
    RUN torch-model-archiver \
      --model-name=mnist \
      --version=1.0 \
      --model-file=/home/model-server/mnist.py \
      --serialized-file=/home/model-server/mnist_cnn.pt \
      --handler=/home/model-server/mnist_handler.py \
      --export-path=/home/model-server/model-store
    
    CMD ["torchserve", \
         "--start", \
         "--ts-config=/home/model-server/config.properties", \
         "--models", \
         "mnist=mnist.mar"]
    END
    

    Ces instructions Docker effectuent les opérations suivantes :

    • L'instruction FROM extrait l'image de conteneur actuelle à partir d'une image TorchServe existante.

    • L'instruction COPY copie les artefacts de modèle et le gestionnaire de prédiction de votre répertoire local dans le répertoire /home/model-server/ de l'image de conteneur.

    • La première instruction RUN modifie le fichier de configuration de l'image parent afin de prendre en charge le format d'entrée préconisé par AI Platform Prediction pour les prédictions.

      Plus précisément, cette instruction configure TorchServe afin qu'il attende une enveloppe de services JSON pour les requêtes de prédiction.

      La modification de ce fichier de configuration nécessite une autorisation dont l'utilisateur model-server (qui a été créé dans l'image parent) ne dispose pas. Les instructions indiquent à Docker de s'exécuter en tant qu'utilisateur root pour modifier le fichier de configuration, puis de suivre les instructions en tant qu'utilisateur model-server.

    • La deuxième instruction RUN utilise l'archiveur du modèle Torch, déjà installé sur l'image du conteneur, pour créer une archive de modèle à partir des fichiers que vous avez copiés dans l'image. L'archive de modèle est enregistré dans le répertoire /home/model-server/model-store/ avec le nom de fichier mnist.mar.

      (Si vous souhaitez modifier l'image de conteneur, par exemple pour effectuer un prétraitement ou un post-traitement personnalisé dans le gestionnaire de requêtes, vous pouvez utiliser des instructions RUN supplémentaires pour installer des dépendances.)

    • L'instruction CMD démarre le serveur HTTP TorchServe. Il référence le fichier de configuration à partir de l'image parent et active la diffusion pour un modèle nommé mnist. Ce modèle charge le fichier mnist.mar créé par l'instruction RUN.

      Cette instruction remplace l'instruction CMD de l'image parent. Il est important de remplacer l'instruction CMD et non l'instruction ENTRYPOINT, car le script ENTRYPOINT de l'image parent exécute la commande transmise dans CMD et ajoute une logique supplémentaire pour empêcher Docker de se fermer.

  2. Pour créer l'image de conteneur basée sur votre nouveau fichier Dockerfile et lui ajouter un tag avec un nom compatible avec votre dépôt Artifact Registry, exécutez la commande suivante dans votre interface système :

    docker build \
      --tag=REGION-docker.pkg.dev/PROJECT_ID/getting-started-pytorch/serve-mnist \
      .
    

    Remplacez l'élément suivant :

    • REGION : région de votre dépôt Artifact Registry, comme indiqué dans une section précédente
    • PROJECT_ID : ID de votre projet Google Cloud

    La commande peut s'exécuter pendant plusieurs minutes.

Exécuter le conteneur localement (facultatif)

Avant de transférer votre image de conteneur vers Artifact Registry afin de l'utiliser avec AI Platform Prediction, vous pouvez l'exécuter en tant que conteneur dans votre environnement local pour vérifier que le serveur fonctionne comme prévu :

  1. Pour exécuter l'image de conteneur en tant que conteneur localement, exécutez la commande suivante dans votre interface système :

    docker run -d -p 8080:8080 --name=local_mnist \
      REGION-docker.pkg.dev/PROJECT_ID/getting-started-pytorch/serve-mnist
    

    Remplacez les éléments suivants, comme vous l'avez fait dans la section précédente :

    • REGION : région de votre dépôt Artifact Registry, comme indiqué dans une section précédente
    • PROJECT_ID : ID de votre projet Google Cloud

    Cette commande exécute un conteneur en mode dissocié, en mappant le port 8080 du conteneur avec le port 8080 de l'environnement local. (L'image parent à partir de laquelle vous avez dérivé votre image de conteneur configure TorchServe pour utiliser le port 8080.)

  2. Pour envoyer une vérification d'état au serveur du conteneur, exécutez la commande suivante dans votre interface système :

    curl localhost:8080/ping
    

    Si l'opération réussit, le serveur affiche la réponse suivante :

    {
      "status": "Healthy"
    }
    
  3. Pour envoyer une requête de prédiction au serveur du conteneur, exécutez les commandes suivantes dans votre interface système :

    cat > instances.json <<END
    {
      "instances": [
        {
          "data": {
            "b64": "$(base64 --wrap=0 test_data/3.png)"
          }
        }
      ]
    }
    END
    
    curl -X POST \
      -H "Content-Type: application/json; charset=utf-8" \
      -d @instances.json \
      localhost:8080/predictions/mnist
    

    Cette requête utilise l'une des images de test incluses dans l'exemple de TorchServe.

    Si l'opération réussit, le serveur affiche la prédiction suivante :

    {"predictions": [3]}
    
  4. Pour arrêter le conteneur, exécutez la commande suivante dans votre interface système :

    docker stop local_mnist
    

Transférer l'image de conteneur vers Artifact Registry

Configurer Docker pour accéder à Artifact Registry Transférez ensuite votre image de conteneur vers votre dépôt Artifact Registry.

  1. Pour autoriser votre installation Docker locale à transférer vers Artifact Registry dans la région choisie, exécutez la commande suivante dans votre interface système :

    gcloud auth configure-docker REGION-docker.pkg.dev
    

    Remplacez REGION par la région dans laquelle vous avez créé votre dépôt dans une section précédente.

  2. Pour transférer l'image de conteneur que vous venez de créer vers Artifact Registry, exécutez la commande suivante dans votre interface système :

    docker push REGION-docker.pkg.dev/PROJECT_ID/getting-started-pytorch/serve-mnist
    

    Remplacez les éléments suivants, comme vous l'avez fait dans la section précédente :

    • REGION : région de votre dépôt Artifact Registry, comme indiqué dans une section précédente
    • PROJECT_ID : ID de votre projet Google Cloud

Déployer le conteneur

Cette section explique comment créer un modèle et une version de modèle sur AI Platform Prediction afin de diffuser des prédictions. La version de modèle exécute votre image de conteneur en tant que conteneur afin de diffuser des prédictions.

Ce tutoriel fournit des options de configuration spécifiques à utiliser lorsque vous créez le modèle et la version de modèle. Si vous souhaitez en savoir plus sur les différentes options de configuration, consultez la section Déployer des modèles.

Créer un modèle

Pour créer une ressource de modèle, exécutez la commande suivante dans votre interface système :

gcloud beta ai-platform models create getting_started_pytorch \
  --region=REGION \
  --enable-logging \
  --enable-console-logging

Remplacez REGION par la région dans laquelle vous avez créé votre dépôt Artifact Registry dans une section précédente.

Créer une version de modèle

Pour créer une ressource de version de modèle, exécutez la commande suivante dans votre interface système :

gcloud beta ai-platform versions create v1 \
  --region=REGION \
  --model=getting_started_pytorch \
  --machine-type=n1-standard-4 \
  --image=REGION-docker.pkg.dev/PROJECT_ID/getting-started-pytorch/serve-mnist \
  --ports=8080 \
  --health-route=/ping \
  --predict-route=/predictions/mnist

Remplacez l'élément suivant :

  • REGION : région dans laquelle vous avez créé votre dépôt Artifact Registry et votre modèle AI Platform Prediction dans les sections précédentes
  • PROJECT_ID : ID de votre projet Google Cloud

Les options liées au conteneur de cette commande effectuent les opérations suivantes :

Obtenir une prédiction

Les exemples de fichiers TorchServe que vous avez téléchargés dans une section précédente incluent des images de test. La configuration TorchServe du conteneur s'attend à recevoir des requêtes de prédiction au format JSON, avec l'image sous forme de chaîne encodée en base64 dans le champ data.b64 de chaque instance.

Par exemple, pour classer test_data/3.png, exécutez les commandes suivantes dans votre interface système :

cat > instances.json <<END
{
 "instances": [
   {
     "data": {
       "b64": "$(base64 --wrap=0 test_data/3.png)"
     }
   }
 ]
}
END

curl -X POST \
  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  -H "Content-Type: application/json; charset=utf-8" \
  -d @instances.json \
  https://REGION-ml.googleapis.com/v1/projects/PROJECT_ID/models/getting_started_pytorch/versions/v1:predict

Remplacez l'élément suivant :

  • REGION : région dans laquelle vous avez créé votre modèle AI Platform Prediction dans une section précédente
  • PROJECT_ID : ID de votre projet Google Cloud

Si l'opération réussit, la version du modèle renvoie la prédiction suivante :

{"predictions": [3]}

Nettoyer

Pour éviter que des frais d'AI Platform Prediction et des frais d'Artifact Registry supplémentaires vous soient facturés, supprimez les ressources Google Cloud que vous avez créées au cours de ce tutoriel :

  1. Pour supprimer votre version de modèle, exécutez la commande suivante dans votre interface système :

    gcloud ai-platform versions delete v1 \
      --region=REGION \
      --model=getting_started_pytorch \
      --quiet
    

    Remplacez REGION par la région dans laquelle vous avez créé votre modèle dans une section précédente.

  2. Pour supprimer votre modèle, exécutez la commande suivante dans votre interface système :

    gcloud ai-platform models delete getting_started_pytorch \
      --region=REGION \
      --quiet
    

    Remplacez REGION par la région dans laquelle vous avez créé votre modèle dans une section précédente.

  3. Pour supprimer le dépôt Artifact Registry et l'image de conteneur, exécutez la commande suivante dans votre interface système :

    gcloud beta artifacts repositories delete getting-started-pytorch \
      --location=REGION \
      --quiet
    

    Remplacez REGION par la région dans laquelle vous avez créé votre dépôt Artifact Registry dans une section précédente.

Étape suivante