Ajuster un modèle de classification d'images à l'aide de données personnalisées sur Vertex AI Pipelines

Ce tutoriel explique comment utiliser Vertex AI Pipelines pour exécuter un workflow de ML de bout en bout, y compris les tâches suivantes :

  • Importer et transformer des données.
  • Ajuster un modèle de classification d'images de TFHub à l'aide des données transformées.
  • Importer le modèle entraîné dans Vertex AI Model Registry
  • Facultatif : déployer le modèle pour la livraison en ligne avec Vertex AI Prediction.

Avant de commencer

  1. Assurez-vous d'avoir terminé les étapes 1 à 3 de la section Configurer un projet Google Cloud et un environnement de développement.

  2. Créez un environnement Python isolé et installez le SDK Vertex AI pour Python.

  3. Installez le SDK Kubeflow Pipelines :

    python3 -m pip install "kfp<2.0.0" "google-cloud-aiplatform>=1.16.0" --upgrade --quiet
    

Exécuter le pipeline d'entraînement de modèle de ML

Cet exemple de code effectue les opérations suivantes :

  • Charge les composants à partir d'un dépôt de composants pour les utiliser comme composants fondamentaux du pipeline.
  • Compose un pipeline en créant des tâches de composants et en transmettant des données entre eux à l'aide d'arguments
  • Envoie le pipeline pour exécution sur Vertex AI Pipelines. Voir Tarifs de Vertex AI Pipelines.

Copiez l'exemple de code suivant dans votre environnement de développement et exécutez-le.

Classification d'images

# python3 -m pip install "kfp<2.0.0" "google-cloud-aiplatform>=1.16.0" --upgrade --quiet
from kfp import components
from kfp.v2 import dsl

# %% Loading components
upload_Tensorflow_model_to_Google_Cloud_Vertex_AI_op = components.load_component_from_url('https://raw.githubusercontent.com/GoogleCloudPlatform/vertex-ai-samples/399405402d95f4a011e2d2e967c96f8508ba5688/community-content/pipeline_components/google-cloud/Vertex_AI/Models/Upload_Tensorflow_model/component.yaml')
deploy_model_to_endpoint_op = components.load_component_from_url('https://raw.githubusercontent.com/GoogleCloudPlatform/vertex-ai-samples/399405402d95f4a011e2d2e967c96f8508ba5688/community-content/pipeline_components/google-cloud/Vertex_AI/Models/Deploy_to_endpoint/component.yaml')
transcode_imagedataset_tfrecord_from_csv_op = components.load_component_from_url('https://raw.githubusercontent.com/GoogleCloudPlatform/vertex-ai-samples/main/community-content/pipeline_components/image_ml_model_training/transcode_tfrecord_image_dataset_from_csv/component.yaml')
load_image_classification_model_from_tfhub_op = components.load_component_from_url('https://raw.githubusercontent.com/GoogleCloudPlatform/vertex-ai-samples/b5b65198a6c2ffe8c0fa2aa70127e3325752df68/community-content/pipeline_components/image_ml_model_training/load_image_classification_model/component.yaml')
preprocess_image_data_op = components.load_component_from_url('https://raw.githubusercontent.com/GoogleCloudPlatform/vertex-ai-samples/main/community-content/pipeline_components/image_ml_model_training/preprocess_image_data/component.yaml')
train_tensorflow_image_classification_model_op = components.load_component_from_url('https://raw.githubusercontent.com/GoogleCloudPlatform/vertex-ai-samples/main/community-content/pipeline_components/image_ml_model_training/train_image_classification_model/component.yaml')


# %% Pipeline definition
def image_classification_pipeline():
    class_names = ['daisy', 'dandelion', 'roses', 'sunflowers', 'tulips']
    csv_image_data_path = 'gs://cloud-samples-data/ai-platform/flowers/flowers.csv'
    deploy_model = False

    image_data = dsl.importer(
        artifact_uri=csv_image_data_path, artifact_class=dsl.Dataset).output

    image_tfrecord_data = transcode_imagedataset_tfrecord_from_csv_op(
        csv_image_data_path=image_data,
        class_names=class_names
    ).outputs['tfrecord_image_data_path']

    loaded_model_outputs = load_image_classification_model_from_tfhub_op(
        class_names=class_names,
    ).outputs

    preprocessed_data = preprocess_image_data_op(
        image_tfrecord_data,
        height_width_path=loaded_model_outputs['image_size_path'],
    ).outputs

    trained_model = (train_tensorflow_image_classification_model_op(
        preprocessed_training_data_path = preprocessed_data['preprocessed_training_data_path'],
        preprocessed_validation_data_path = preprocessed_data['preprocessed_validation_data_path'],
        model_path=loaded_model_outputs['loaded_model_path']).
                   set_cpu_limit('96').
                   set_memory_limit('128G').
                   add_node_selector_constraint('cloud.google.com/gke-accelerator', 'NVIDIA_TESLA_A100').
                   set_gpu_limit('8').
                   outputs['trained_model_path'])

    vertex_model_name = upload_Tensorflow_model_to_Google_Cloud_Vertex_AI_op(
        model=trained_model,
    ).outputs['model_name']

    # Deploying the model might incur additional costs over time
    if deploy_model:
        vertex_endpoint_name = deploy_model_to_endpoint_op(
            model_name=vertex_model_name,
        ).outputs['endpoint_name']

pipeline_func = image_classification_pipeline

# %% Pipeline submission
if __name__ == '__main__':
    from google.cloud import aiplatform
    aiplatform.PipelineJob.from_pipeline_func(pipeline_func=pipeline_func).submit()

Notez les points suivants à propos de l'exemple de code fourni :

  • Un pipeline Kubeflow est défini comme une fonction Python.
  • Les étapes du workflow du pipeline sont créées à l'aide des composants du pipeline Kubeflow. En utilisant les sorties d'un composant comme entrée d'un autre composant, vous définissez le workflow du pipeline sous forme de graphe. Par exemple, la tâche du composant preprocess_image_data_op dépend de la sortie tfrecord_image_data_path de la tâche du composant transcode_imagedataset_tfrecord_from_csv_op.
  • Vous créez une exécution de pipeline sur Vertex AI Pipelines à l'aide du SDK Vertex AI pour Python.

Surveiller le pipeline

Dans la section Vertex AI de la console Google Cloud, accédez à la page Pipelines et ouvrez l'onglet Exécutions.

Accéder à la page Exécutions de pipeline

Étapes suivantes