Passer du prototype à la mise en production : obtenir des prédictions avec des modèles entraînés personnalisés

1. Présentation

Dans cet atelier, vous allez utiliser Vertex AI pour obtenir des prédictions en ligne et par lots avec un modèle entraîné personnalisé.

Cet atelier fait partie d'une série de vidéos appelée Passer du prototype à la mise en production. Assurez-vous d'avoir terminé l'atelier précédent avant de commencer celui-ci. Vous pouvez consulter la vidéo associée pour approfondir vos connaissances :

.

Objectifs de l'atelier

Vous allez apprendre à effectuer les opérations suivantes :

  • Importer des modèles dans le registre de modèles Vertex AI
  • Déployer un modèle sur un point de terminaison
  • Obtenir des prédictions en ligne et par lots avec l'interface utilisateur et le SDK

Le coût total d'exécution de cet atelier sur Google Cloud est d'environ 1 $.

2. Présentation de Vertex AI

Cet atelier utilise la toute dernière offre de produits d'IA de Google Cloud. Vertex AI simplifie l'expérience de développement en intégrant toutes les offres de ML de Google Cloud. Auparavant, les modèles entraînés avec AutoML et les modèles personnalisés étaient accessibles via des services distincts. La nouvelle offre regroupe ces deux types de modèles mais aussi d'autres nouveaux produits en une seule API. Vous pouvez également migrer des projets existants vers Vertex AI.

Vertex AI comprend de nombreux produits différents qui permettent de gérer les workflows de ML de bout en bout. Cet atelier se concentre sur les produits mis en évidence ci-dessous : Predictions et Workbench.

Présentation des produits Vertex

3. Configurer votre environnement

Suivez les étapes de l'atelier Entraîner des modèles personnalisés avec Vertex AI pour configurer votre environnement.

4. Importer le modèle dans le registre

Avant de pouvoir utiliser le modèle pour obtenir des prédictions, vous devez l'importer dans le registre de modèles Vertex AI, un dépôt qui vous permet de gérer le cycle de vie de vos modèles de ML.

Vous pouvez importer des modèles lorsque vous configurez un job d'entraînement personnalisé, comme indiqué ci-dessous.

training_prediction

Vous pouvez également importer des modèles une fois le job d'entraînement terminé, à condition de stocker les artefacts de modèle enregistrés dans un bucket Cloud Storage. Il s'agit de l'option utilisée dans cet atelier.

Accédez à la section "Modèles" dans la console.

menu des modèles

Sélectionnez IMPORTER.

import_model

Sélectionnez Importer en tant que nouveau modèle, puis attribuez un nom à votre modèle.

new_model

Dans la section Paramètres du modèle, importez le modèle avec un conteneur prédéfini et utilisez TensorFlow 2.8. Vous pouvez consulter la liste complète des conteneurs de prédiction prédéfinis.

Indiquez ensuite le chemin d'accès au bucket Cloud Storage dans lequel vous avez enregistré les artefacts de modèle du job d'entraînement personnalisé. L'URL ressemble généralement à ceci : gs://{PROJECT_ID}-bucket/model_output

L'explicabilité n'est pas abordée dans cet atelier, mais n'hésitez pas à consulter la documentation sur Vertex Explainable AI pour en savoir plus.

Une fois le modèle importé, il est affiché dans le registre.

flower_model

Remarque : si vous souhaitez passer par le SDK plutôt que par l'interface utilisateur, vous pouvez importer le modèle en exécutant le code suivant dans votre notebook Workbench.

from google.cloud import aiplatform

my_model = aiplatform.Model.upload(display_name='flower-model',
                                  artifact_uri='gs://{PROJECT_ID}-bucket/model_output',
                                  serving_container_image_uri='us-docker.pkg.dev/vertex-ai/prediction/tf2-cpu.2-8:latest')

5. Déployer le modèle sur le point de terminaison

Deux types de jobs de prédiction peuvent être exécutés dans Vertex AI : les jobs en ligne et les jobs par lots.

La prédiction par lots est une requête asynchrone. Elle est idéale lorsque vous n'avez pas besoin d'une réponse immédiate et que vous voulez traiter des données accumulées avec une seule requête.

En revanche, si vous souhaitez obtenir des prédictions à faible latence avec les données transmises à votre modèle à la volée, il est préférable d'utiliser la prédiction en ligne.

Maintenant que le modèle est dans le registre, nous pouvons l'utiliser pour effectuer des prédictions par lots.

Toutefois, pour obtenir des prédictions en ligne, il est nécessaire de déployer le modèle sur un point de terminaison. Cette opération permet d'associer les artefacts de modèle enregistrés aux ressources physiques pour effectuer des prédictions à une faible latence.

Pour déployer sur un point de terminaison, sélectionnez les trois points situés tout à droite du modèle, puis sélectionnez Déployer sur un point de terminaison.

deploy_model

Attribuez un nom à votre point de terminaison, laissez le reste des paramètres tels quels et cliquez sur CONTINUER.

endpoint_name

Les points de terminaison sont compatibles avec l'autoscaling. Vous pouvez donc définir une valeur minimale et maximale et faire évoluer les nœuds de calcul en fonction de la demande de trafic (dans le cadre de ces limites).

Cet atelier n'est effectué qu'à titre de démonstration, et ce point de terminaison ne sera pas utilisé pour gérer un trafic important. Vous pouvez définir le nombre maximal de nœuds de calcul sur 1 et sélectionner le type de machine n1-standard-4.

endpoint_compute

La surveillance du modèle n'est pas abordée dans cet atelier, mais n'hésitez pas à consulter la documentation pour en savoir plus sur cette fonctionnalité.

Ensuite, cliquez sur DÉPLOYER.

Après quelques minutes, le déploiement se termine. Vous remarquerez que l'état du déploiement de votre modèle est désormais Déployé sur Vertex AI.

Si vous souhaitez déployer un modèle via le SDK, exécutez la commande ci-dessous.

my_model = aiplatform.Model("projects/{PROJECT_NUMBER}/locations/us-central1/models/{MODEL_ID}")

endpoint = my_model.deploy(
     deployed_model_display_name='my-endpoint',
     traffic_split={"0": 100},
     machine_type="n1-standard-4",
     accelerator_count=0,
     min_replica_count=1,
     max_replica_count=1,
   )

6. Obtenir des prédictions

Prédictions en ligne

Une fois votre modèle déployé sur un point de terminaison, vous pouvez y accéder comme sur n'importe quel autre point de terminaison REST. En d'autres termes, vous pouvez l'appeler à partir d'une fonction cloud, d'un chatbot, d'une application Web, etc.

À titre de démonstration, nous allons appeler ce point de terminaison depuis Workbench.

Revenez au notebook que vous avez créé dans l'atelier précédent. Créez un notebook TensorFlow 2 via le lanceur.

tf_kernel

Importez Numpy, PIL et le SDK Vertex AI pour Python.

from google.cloud import aiplatform

import numpy as np
from PIL import Image

Téléchargez l'image ci-dessous et importez-la sur votre instance Workbench. Nous allons tester le modèle sur cette image de pissenlit.

test_image

Tout d'abord, définissez le point de terminaison. Vous devez remplacer {PROJECT_NUMBER} et {ENDPOINT_ID} dans le code ci-dessous.

endpoint = aiplatform.Endpoint(
    endpoint_name="projects/{PROJECT_NUMBER}/locations/us-central1/endpoints/{ENDPOINT_ID}")

Vous trouverez votre endpoint_id (ID du point de terminaison) dans la section "Points de terminaison" de la console Cloud.

endpoint_id

Vous trouverez également le numéro de votre projet sur la page d'accueil de la console. Notez que ce numéro diffère de l'ID du projet.

project_number

Le code ci-dessous permet d'ouvrir et de redimensionner l'image avec PIL.

IMAGE_PATH = "test-image.jpg"
im = Image.open(IMAGE_PATH)

Ensuite, convertissez les données Numpy aux formats float32 et liste. La conversion au format liste est nécessaire, car les données Numpy ne sont pas sérialisables en JSON. Il n'est donc pas possible de les envoyer dans le corps de la requête.

x_test = np.asarray(im).astype(np.float32).tolist()

Enfin, appelez endpoint.predict.

endpoint.predict(instances=x_test).predictions

Le résultat que vous obtenez correspond à la sortie du modèle, qui est une couche softmax avec cinq unités. Si vous souhaitez écrire une logique personnalisée pour renvoyer le libellé de type chaîne au lieu de l'index, vous pouvez utiliser des routines de prédiction personnalisées.

Prédictions par lots

Il existe différentes manières de formater vos données pour effectuer des prédictions par lots. Par souci de simplicité, les données Numpy sont vidées dans un fichier JSON et le fichier est enregistré dans Cloud Storage.

with open('test-data.json', 'w') as fp:
    json.dump(x_test, fp)

!gsutil cp test-data.json gs://{YOUR_BUCKET}

Ensuite, définissez le modèle. Cette méthode est semblable à la définition d'un point de terminaison, à la différence que vous devez fournir le MODEL_ID au lieu d'un ENDPOINT_ID.

my_model=aiplatform.Model("projects/{PROJECT_NUMBER}/locations/us-central1/models/{MODEL_ID}")

Pour trouver l'ID du modèle, sélectionnez le nom et la version du modèle dans la section "Modèles" de la console, puis accédez à DÉTAILS DE LA VERSION.

model_id

Enfin, appelez un job de prédiction par lots à l'aide du SDK, en veillant à transmettre le chemin Cloud Storage où vous avez stocké le fichier JSON ainsi qu'un emplacement Cloud Storage de stockage des résultats de prédiction.

batch_prediction_job = my_model.batch_predict(
    job_display_name='flower_batch_predict',
    gcs_source='gs://{YOUR_BUCKET}/test-data.json',
    gcs_destination_prefix='gs://{YOUR_BUCKET}/prediction-results',
    machine_type='n1-standard-4',)

Vous pouvez suivre la progression du job dans la section "Prédictions par lots" de la console. Notez que l'exécution d'un job de prédiction par lots pour une seule image n'est pas efficace.

batch_pred

Étapes suivantes

Dans cet exemple, nous avons d'abord converti l'image de test au format Numpy avant d'effectuer l'appel de prédiction. Dans des cas d'utilisation plus réalistes, vous devrez probablement envoyer l'image directement, sans l'importer dans Numpy au préalable. Pour ce faire, il vous faudra modifier votre fonction TensorFlow Serving afin de décoder les octets de l'image. Cette méthode nécessite un peu plus d'efforts, mais s'avère beaucoup plus efficace pour les images de plus grande taille et pour la création d'applications. Vous trouverez un exemple de ce type dans ce notebook.

🎉 Félicitations ! 🎉

Vous savez désormais utiliser Vertex AI pour :

  • importer des modèles dans le registre de modèles Vertex AI ;
  • effectuer des prédictions par lots et en ligne.

Pour en savoir plus sur les différents composants de Vertex, consultez la documentation.

7. Nettoyage

Nous vous recommandons d'annuler le déploiement des modèles sur le point de terminaison si vous ne prévoyez pas de les utiliser. Vous pouvez également supprimer l'intégralité du point de terminaison. Vous pouvez toujours redéployer un modèle sur un point de terminaison si nécessaire.

undeploy_model

Les notebooks gérés par Workbench expirent automatiquement après 180 minutes d'inactivité. Vous n'avez donc pas à vous soucier de l'arrêt de l'instance. Si vous souhaitez arrêter l'instance manuellement, cliquez sur le bouton "Arrêter" dans la section "Vertex AI Workbench" de la console. Si vous souhaitez supprimer le notebook définitivement, cliquez sur le bouton "Supprimer".

Arrêter l'instance

Pour supprimer le bucket de stockage, utilisez le menu de navigation de la console Cloud pour accéder à Stockage, sélectionnez votre bucket puis cliquez sur "Supprimer" :

Supprimer l'espace de stockage