Construire un pipeline

Vertex AI Pipelines vous permet d'orchestrer vos workflows de machine learning (ML) sans serveur. Avant que Vertex AI Pipelines ne puisse orchestrer votre workflow de ML, vous devez décrire votre workflow en tant que pipeline. Les pipelines de ML sont des workflows de ML portables et évolutifs basés sur des conteneurs et des services Google Cloud.

Ce guide explique comment commencer à créer des pipelines de ML.

Quel SDK de pipeline dois-je utiliser ?

Vertex AI Pipelines peut exécuter des pipelines créés à l'aide de l'un des SDK suivants :

  • SDK Kubeflow Pipelines version 1.8 ou ultérieure (v2 recommandée)

  • TensorFlow Extended version 0.30.0 ou ultérieure

Si vous utilisez TensorFlow dans un workflow de ML qui traite des téraoctets de données structurées ou de données textuelles, nous vous recommandons de créer votre pipeline à l'aide de TFX.

Pour les autres cas d'utilisation, nous vous recommandons de créer votre pipeline à l'aide du SDK Kubeflow Pipelines. La création d'un pipeline avec le SDK Kubeflow Pipelines vous permet de mettre en œuvre votre workflow en créant des composants personnalisés ou en réutilisant des composants prédéfinis, tels que les composants de pipeline Google Cloud. Les composants de pipeline Google Cloud facilitent l'utilisation de services Vertex AI tels que AutoML dans votre pipeline.

Ce guide explique comment créer des pipelines à l'aide du SDK Kubeflow Pipelines.

Avant de commencer

Avant de créer et d'exécuter des pipelines, utilisez les instructions suivantes pour configurer votre projet et votre environnement de développement Google Cloud.

  1. Pour préparer votre projet Google Cloud à exécuter des pipelines de ML, suivez les instructions du guide de configuration de votre projet Google Cloud.

  2. Pour créer votre pipeline à l'aide du SDK Kubeflow Pipelines, installez le SDK Kubeflow Pipelines v1.8 ou version ultérieure.

  3. Pour utiliser le client Python Vertex AI dans vos pipelines, installez les bibliothèques clientes Vertex AI version 1.7 ou ultérieure.

  4. Pour utiliser les services Vertex AI dans vos pipelines, installez le SDK des composants du pipeline Google Cloud.

Premiers pas pour créer un pipeline

Pour orchestrer votre workflow de ML sur Vertex AI Pipelines, vous devez d'abord décrire votre workflow en tant que pipeline. L'exemple suivant montre comment utiliser les Composants du pipeline Google Cloud avec Vertex AI pour créer un ensemble de données, entraîner un modèle à l'aide d'AutoML et déployer le modèle entraîné pour les prédictions.

Avant d'exécuter l'exemple de code suivant, vous devez configurer l'authentification.

Comment configurer l'authentification

Pour configurer l'authentification, vous devez créer une clé de compte de service et définir une variable d'environnement pour le chemin d'accès à la clé de compte de service.

  1. Créez un compte de service :

    1. Dans la console Google Cloud, accédez à la page Créer un compte de service.

      Accéder à la page "Créer un compte de service"

    2. Dans le champ Nom du compte de service, saisissez un nom.
    3. Facultatif : Dans le champ Description du compte de service, saisissez une description.
    4. Cliquez sur Créer.
    5. Cliquez sur le champ Sélectionner un rôle. Sous Tous les rôles, sélectionnez Vertex AI > Utilisateur de Vertex AI.
    6. Cliquez sur Terminé pour créer le compte de service.

      Ne fermez pas la fenêtre de votre navigateur. Vous en aurez besoin lors de la tâche suivante.

  2. Créez une clé de compte de service pour l'authentification :

    1. Dans la console Google Cloud, cliquez sur l'adresse e-mail du compte de service que vous avez créé.
    2. Cliquez sur Keys (Clés).
    3. Cliquez sur AJOUTER UNE CLÉ -> Créer une clé.
    4. Cliquez sur Créer. Un fichier de clé JSON est téléchargé sur votre ordinateur.
    5. Cliquez sur Fermer.
  3. Accordez à votre nouveau compte de service l'accès au compte de service que vous utilisez pour exécuter des pipelines.
    1. Cliquez sur pour revenir à la liste des comptes de service.
    2. Cliquez sur le nom du compte de service que vous utilisez pour exécuter des pipelines. La page Détails du compte de service s'affiche.

      Si vous avez suivi les instructions du guide de configuration de votre projet pour Vertex AI Pipelines, il s'agit du compte de service que vous avez créé à l'étape Configurer un compte de service avec des autorisations précises. Sinon, Vertex AI utilise le compte de service Compute Engine par défaut pour exécuter des pipelines. Le compte de service Compute Engine par défaut est nommé comme suit : PROJECT_NUMBER-compute@developer.gserviceaccount.com

    3. Cliquez sur l'onglet Autorisations.
    4. Cliquez sur Accorder l'accès. Le panneau Ajouter des comptes principaux s'affiche.
    5. Dans la zone Nouveaux comptes principaux, saisissez l'adresse e-mail du compte de service que vous avez créé à une étape précédente.
    6. Dans la liste déroulante Rôle, sélectionnez Comptes de service > Utilisateur du compte de service.
    7. Cliquez sur Enregistrer.
  4. Définissez la variable d'environnement GOOGLE_APPLICATION_CREDENTIALS pour qu'elle pointe vers le chemin d'accès au fichier JSON contenant la clé de votre compte de service. Cette variable ne s'applique qu'à la session d'interface système actuelle. Par conséquent, si vous ouvrez une nouvelle session, vous devez la définir à nouveau.

    Exemple : Linux ou macOS

    Remplacez [PATH] par le chemin du fichier JSON contenant la clé de votre compte de service.

    export GOOGLE_APPLICATION_CREDENTIALS="[PATH]"

    Exemple :

    export GOOGLE_APPLICATION_CREDENTIALS="/home/user/Downloads/service-account-file.json"

    Exemple : Windows

    Remplacez [PATH] par le chemin du fichier JSON contenant la clé de votre compte de service et [FILE_NAME] par le nom du fichier.

    Avec PowerShell :

    $env:GOOGLE_APPLICATION_CREDENTIALS="[PATH]"

    Exemple :

    $env:GOOGLE_APPLICATION_CREDENTIALS="C:\Users\username\Downloads\[FILE_NAME].json"

    Avec l'invite de commande :

    set GOOGLE_APPLICATION_CREDENTIALS=[PATH]

Définir votre workflow à l'aide du package DSL des pipelines Kubeflow

Le package kfp.dsl contient le langage spécifique au domaine (DSL pour "Domain-Specific Language") que vous pouvez utiliser pour définir et interagir avec les pipelines et les composants.

Les composants du pipeline Kubeflow sont des fonctions de fabrique qui créent des étapes de pipeline. Chaque composant décrit les entrées, les sorties et la mise en œuvre du composant. Par exemple, dans l'exemple de code ci-dessous, ds_op est un composant.

Les composants sont utilisés pour créer des étapes du pipeline. Lorsqu'un pipeline s'exécute, les étapes sont exécutées à mesure que les données dont elles dépendent deviennent disponibles. Par exemple, un composant d'entraînement peut utiliser un fichier CSV en entrée et l'utiliser pour entraîner un modèle.

import kfp
from google.cloud import aiplatform
from google_cloud_pipeline_components.v1.dataset import ImageDatasetCreateOp
from google_cloud_pipeline_components.v1.automl.training_job import AutoMLImageTrainingJobRunOp
from google_cloud_pipeline_components.v1.endpoint import EndpointCreateOp, ModelDeployOp

project_id = PROJECT_ID
pipeline_root_path = PIPELINE_ROOT

# Define the workflow of the pipeline.
@kfp.dsl.pipeline(
    name="automl-image-training-v2",
    pipeline_root=pipeline_root_path)
def pipeline(project_id: str):
    # The first step of your workflow is a dataset generator.
    # This step takes a Google Cloud Pipeline Component, providing the necessary
    # input arguments, and uses the Python variable `ds_op` to define its
    # output. Note that here the `ds_op` only stores the definition of the
    # output but not the actual returned object from the execution. The value
    # of the object is not accessible at the dsl.pipeline level, and can only be
    # retrieved by providing it as the input to a downstream component.
    ds_op = ImageDatasetCreateOp(
        project=project_id,
        display_name="flowers",
        gcs_source="gs://cloud-samples-data/vision/automl_classification/flowers/all_data_v2.csv",
        import_schema_uri=aiplatform.schema.dataset.ioformat.image.single_label_classification,
    )

    # The second step is a model training component. It takes the dataset
    # outputted from the first step, supplies it as an input argument to the
    # component (see `dataset=ds_op.outputs["dataset"]`), and will put its
    # outputs into `training_job_run_op`.
    training_job_run_op = AutoMLImageTrainingJobRunOp(
        project=project_id,
        display_name="train-iris-automl-mbsdk-1",
        prediction_type="classification",
        model_type="CLOUD",
        dataset=ds_op.outputs["dataset"],
        model_display_name="iris-classification-model-mbsdk",
        training_fraction_split=0.6,
        validation_fraction_split=0.2,
        test_fraction_split=0.2,
        budget_milli_node_hours=8000,
    )

    # The third and fourth step are for deploying the model.
    create_endpoint_op = EndpointCreateOp(
        project=project_id,
        display_name = "create-endpoint",
    )

    model_deploy_op = ModelDeployOp(
        model=training_job_run_op.outputs["model"],
        endpoint=create_endpoint_op.outputs['endpoint'],
        automatic_resources_min_replica_count=1,
        automatic_resources_max_replica_count=1,
    )

Remplacez les éléments suivants :

  • PROJECT_ID : projet Google Cloud dans lequel ce pipeline s'exécute.
  • PIPELINE_ROOT_PATH : spécifiez un URI Cloud Storage auquel votre compte de service de pipelines peut accéder. Les artefacts des exécutions de votre pipeline sont stockés dans la racine du pipeline.

    La racine du pipeline peut être définie en tant qu'argument de l'annotation @kfp.dsl.pipeline sur la fonction du pipeline, ou elle peut être définie lorsque vous appelez create_run_from_job_spec pour créer une exécution de pipeline.

Compiler votre pipeline dans un fichier YAML

Une fois le workflow de votre pipeline défini, vous pouvez le compiler au format YAML. Le fichier YAML inclut toutes les informations concernant l'exécution de votre pipeline sur Vertex AI Pipelines.

from kfp import compiler

compiler.Compiler().compile(
    pipeline_func=pipeline,
    package_path='image_classif_pipeline.yaml'
)

Envoyer votre pipeline pour exécution

Une fois le workflow de votre pipeline compilé au format YAML, vous pouvez utiliser le client Python Vertex AI pour envoyer et exécuter votre pipeline.

import google.cloud.aiplatform as aip

# Before initializing, make sure to set the GOOGLE_APPLICATION_CREDENTIALS
# environment variable to the path of your service account.
aip.init(
    project=project_id,
    location=PROJECT_REGION,
)

# Prepare the pipeline job
job = aip.PipelineJob(
    display_name="automl-image-training-v2",
    template_path="image_classif_pipeline.yaml",
    pipeline_root=pipeline_root_path,
    parameter_values={
        'project_id': project_id
    }
)

job.submit()

Remplacez les éléments suivants :

  • PROJECT_REGION : région dans laquelle ce pipeline s'exécute.

Dans l'exemple précédent :

  1. Un pipeline Kubeflow est défini comme une fonction Python. La fonction est annotée avec le décorateur @kfp.dsl.pipeline, qui spécifie le nom et le chemin d'accès racine du pipeline. Le chemin d'accès racine du pipeline est l'emplacement où sont stockés les artefacts du pipeline.
  2. Les étapes du workflow du pipeline sont créées à l'aide des composants de pipeline Google Cloud. 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 : training_job_run_op dépend de la sortie dataset de ds_op.
  3. Vous allez compiler le pipeline à l'aide de kfp.compiler.Compiler.
  4. Vous créez une exécution de pipeline sur Vertex AI Pipelines à l'aide du client Python Vertex AI. Lorsque vous exécutez un pipeline, vous pouvez remplacer son nom et son chemin d'accès racine. Les exécutions de pipeline peuvent être regroupées à l'aide du nom du pipeline. Remplacer le nom du pipeline peut vous aider à distinguer les exécutions de pipeline de production et de test.

Pour en savoir plus sur la création de pipelines, consultez la section Créer des pipelines Kubeflow, puis suivez les exemples et les tutoriels.

Tester un pipeline en local (facultatif)

Une fois que vous avez défini vos pipelines et vos composants, vous pouvez tester le code du composant en l'exécutant dans votre environnement de création local. En exécutant votre pipeline ou un composant localement, vous pouvez identifier et déboguer les problèmes potentiels avant de créer une exécution de pipeline dans un environnement distant, tel que Vertex AI Pipelines. Pour en savoir plus sur l'exécution des pipelines et des composants localement, consultez la section Exécution locale dans la documentation KFP.

Cette page vous explique comment définir et exécuter un pipeline en deux tâches.

Configurer votre environnement local

  1. Installez la dernière version mineure du SDK Kubeflow Pipelines (KFP) v2 :

    pip install --upgrade kfp>=2,<3
    
  2. Facultatif : Installez Docker.

  3. Utilisez l'exemple de code suivant pour définir un pipeline simple :

    from kfp import dsl
    
    # Define a component to add two numbers.
    @dsl.component
    def add(a: int, b: int) -> int:
        return a + b
    
    # Define a simple pipeline using the component.
    @dsl.pipeline
    def addition_pipeline(x: int, y: int, z: int) -> int:
        task1 = add(a=x, b=y)
        task2 = add(a=task1.output, b=z)
        return task2.output
    

Appeler une exécution locale

Initialisez une session locale à l'aide de la fonction local.init(). Lorsque vous utilisez local.init(), le SDK KFP exécute localement vos pipelines et composants lorsque vous les appelez.

Lorsque vous utilisez local.init(), vous devez spécifier un type d'exécuteur. Le type d'exécuteur indique comment KFP doit exécuter chaque tâche.

Utilisez l'exemple suivant pour spécifier le type d'exécuteur DockerRunner pour exécuter chaque tâche dans un conteneur. Pour plus d'informations sur les exécuteurs locaux compatibles avec KFP, consultez la page Exécuteurs locaux dans la documentation KFP.

from kfp import local

local.init(runner=local.DockerRunner())

pipeline_task = addition_pipeline(x=1, y=2, z=3)

Utilisez le code suivant pour afficher le résultat de la tâche de pipeline lors de l'exécution locale :

print(f'Result: {pipeline_task.output}')

Créer des pipelines Kubeflow

Procédez comme suit pour créer un pipeline.

  1. Concevez votre pipeline sous la forme d'une série de composants. Pour favoriser la réutilisation, chaque composant doit avoir une seule responsabilité. Dans la mesure du possible, concevez votre pipeline de manière à réutiliser des composants éprouvés, tels que les composants de pipeline Google Cloud.

    Apprenez-en plus sur la conception de pipelines.

  2. Créez tous les composants personnalisés nécessaires à la mise en œuvre de votre workflow de ML à l'aide du SDK Kubeflow Pipelines. Les composants sont des ensembles de code autonomes qui effectuent une étape de votre workflow de ML. Utilisez les options suivantes pour créer vos composants de pipeline.

  3. Créez le pipeline en tant que fonction Python.

    En savoir plus sur la définition de votre pipeline en tant que fonction Python.

  4. Utilisez le compilateur du SDK Kubeflow Pipelines pour compiler votre pipeline.

    from kfp import compiler
    
    compiler.Compiler().compile(
        pipeline_func=PIPELINE_FUNCTION,
        package_path=PIPELINE_PACKAGE_PATH)
    

    Remplacez les éléments suivants :

    • PIPELINE_FUNCTION : nom de la fonction de votre pipeline.
    • PIPELINE_PACKAGE_PATH : chemin d'accès où stocker votre pipeline compilé.
  5. Exécutez votre pipeline à l'aide de Google Cloud Console ou de Python.

Accéder aux ressources Google Cloud dans un pipeline

Si vous ne spécifiez pas de compte de service lorsque vous exécutez un pipeline, Vertex AI Pipelines utilise le compte de service Compute Engine par défaut pour exécuter le pipeline. Vertex AI Pipelines utilise également le compte de service d'une exécution de pipeline pour autoriser votre pipeline à accéder aux ressources Google Cloud. Le compte de service Compute Engine par défaut dispose du rôle d'éditeur de projet par défaut. Cela peut accorder à vos pipelines un accès excessif aux ressources Google Cloud de votre projet Google Cloud.

Nous vous recommandons de créer un compte de service pour exécuter vos pipelines, puis d'accorder à ce compte des autorisations précises sur les ressources Google Cloud nécessaires à l'exécution de votre pipeline.

Obtenez plus d'informations sur l'utilisation de Cloud Identity and Access Management pour créer un compte de service et gérer l'accès accordé à un compte de service.

Maintenir vos pipelines à jour

Les clients du SDK et les images de conteneur que vous utilisez pour créer et exécuter des pipelines sont régulièrement mis à jour vers les nouvelles versions afin de corriger les failles de sécurité et d'ajouter de nouvelles fonctionnalités. Pour maintenir vos pipelines à jour avec la dernière version, nous vous recommandons de procéder comme suit :

Étapes suivantes