Compilación de una canalización

Vertex AI Pipelines te permite organizar los flujos de trabajo de aprendizaje automático (AA) sin servidores. Antes de que Vertex AI Pipelines pueda organizar el flujo de trabajo de AA, debes describirlo como una canalización. Las canalizaciones de AA son flujos de trabajo de AA portátiles y escalables que se basan en contenedores y servicios de Google Cloud.

En esta guía, se describe cómo comenzar a compilar canalizaciones de AA.

¿Qué SDK de canalización debo usar?

Vertex AI Pipelines puede ejecutar canalizaciones compiladas con cualquiera de los siguientes SDK:

  • SDK de Kubeflow Pipelines v1.8 o posterior (se recomienda la versión 2)

  • TensorFlow Extended v0.30.0 o una versión posterior

Si usas TensorFlow en un flujo de trabajo de AA que procesa terabytes de datos estructurados o datos de texto, te recomendamos que compiles tu canalización con TFX.

Para otros casos prácticos, te recomendamos que compiles tu canalización con Kubeflow Pipelines SDK. Si compilas una canalización con el SDK de Kubeflow Pipelines, puedes implementar el flujo de trabajo mediante la compilación de componentes personalizados o la reutilización de componentes precompilados, como los componentes de canalización de Google Cloud. Los componentes de canalización de Google Cloud facilitan el uso de los servicios de Vertex AI, como AutoML, en tu canalización.

En esta guía, se describe cómo compilar canalizaciones mediante el SDK de Kubeflow Pipelines.

Antes de comenzar

Antes de compilar y ejecutar tus canalizaciones, usa las siguientes instrucciones para configurar tu proyecto de Google Cloud y el entorno de desarrollo.

  1. Para preparar tu proyecto de Google Cloud a fin de ejecutar canalizaciones de AA, sigue las instrucciones que figuran en la guía para configurar un proyecto de Google Cloud.

  2. Para compilar tu canalización con el SDK de Kubeflow Pipelines, instala la versión 1.8 o posterior del SDK de Kubeflow Pipelines.

  3. Para usar el cliente de Python de Vertex AI en tus canalizaciones, instala las bibliotecas del cliente de Vertex AI versión 1.7 o posterior.

  4. Para usar los servicios de Vertex AI en tus canalizaciones, instala el SDK de componentes de canalización de Google Cloud.

Comienza a compilar una canalización

Para organizar tu flujo de trabajo de AA en Vertex AI Pipelines, primero debes describirlo como una canalización. En el siguiente ejemplo, se muestra cómo emplear los componentes de canalización de Google Cloud para usar Vertex AI a fin de crear un conjunto de datos, entrenar un modelo mediante AutoML y, luego, implementar el modelo entrenado y realizar predicciones.

Antes de ejecutar la siguiente muestra de código, debes configurar la autenticación.

Cómo configurar la autenticación

Para configurar la autenticación, debes crear una clave de cuenta de servicio y establecer una variable de entorno para la ruta a la clave de la cuenta de servicio.

  1. Crear una cuenta de servicio:

    1. En la consola de Google Cloud, ve a la página Crear cuenta de servicio.

      Ve a Crear cuenta de servicio

    2. Ingresa un nombre en el campo Nombre de cuenta de servicio.
    3. Opcional: en el campo Descripción de la cuenta de servicio, ingresa una descripción.
    4. Haz clic en Crear.
    5. Haz clic en el campo Seleccionar una función. En Todas las funciones, selecciona Vertex AI > Administrador de Vertex AI.
    6. Haz clic en Listo para crear la cuenta de servicio.

      No cierres la ventana del navegador. La usarás en la próxima tarea.

  2. Crea una clave de cuenta de servicio para la autenticación:

    1. En la consola de Google Cloud, haz clic en la dirección de correo electrónico de la cuenta de servicio que creaste.
    2. Haga clic en Claves.
    3. Haz clic en Agregar clave -> Crear nueva clave.
    4. Haz clic en Crear. Se descargará un archivo de claves JSON en tu computadora.
    5. Haga clic en Cerrar.
  3. Otorga a tu cuenta de servicio nueva acceso a la cuenta que usas para ejecutar las canalizaciones.
    1. Haz clic en para volver a la lista de cuentas de servicio.
    2. Haz clic en el nombre de la cuenta de servicio que usas para ejecutar las canalizaciones. Aparecerá la página Service account details.

      Si seguiste las instrucciones de la guía para configurar tu proyecto de Vertex AI Pipelines, esta es la misma cuenta de servicio que creaste en la sección Configura una cuenta de servicio con permisos detallados. De lo contrario, Vertex AI usa la cuenta de servicio predeterminada de Compute Engine para ejecutar las canalizaciones. La cuenta de servicio predeterminada de Compute Engine se llama de la siguiente manera: PROJECT_NUMBER-compute@developer.gserviceaccount.com

    3. Haz clic en la pestaña Permisos.
    4. Haz clic en Grant access. Aparecerá el panel Agregar principales.
    5. En el cuadro Principales nuevos, ingresa la dirección de correo electrónico de la cuenta de servicio que creaste en un paso anterior.
    6. En la lista desplegable Role, selecciona Service accounts > Service account user.
    7. Haga clic en Guardar.
  4. Configura la variable de entorno GOOGLE_APPLICATION_CREDENTIALS en la ruta del archivo JSON que contiene la clave de tu cuenta de servicio: Esta variable solo se aplica a tu sesión actual de shell. Por lo tanto, si abres una sesión nueva, deberás volver a configurar la variable.

    Ejemplo: Linux o macOS

    Reemplaza [PATH] por la ruta de acceso del archivo JSON que contiene la clave de tu cuenta de servicio.

    export GOOGLE_APPLICATION_CREDENTIALS="[PATH]"

    Por ejemplo:

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

    Ejemplo: Windows

    Reemplaza [PATH] con la ruta de acceso del archivo JSON que contiene la clave de tu cuenta de servicio y [FILE_NAME] con el nombre del archivo.

    Con PowerShell:

    $env:GOOGLE_APPLICATION_CREDENTIALS="[PATH]"

    Por ejemplo:

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

    Con el símbolo del sistema:

    set GOOGLE_APPLICATION_CREDENTIALS=[PATH]

Define tu flujo de trabajo mediante el paquete DSL de Kubeflow Pipelines

El paquete kfp.dsl contiene el lenguaje específico del dominio (DSL) que puedes usar para definir y, también, interactuar con las canalizaciones y los componentes.

Los componentes de canalización de Kubeflow son funciones de fábrica que crean pasos de canalización. Cada componente describe las entradas, salidas y su implementación. Por ejemplo, en la siguiente muestra de código, ds_op es un componente.

Los componentes se usan para crear los pasos de la canalización. Cuando se ejecuta una canalización, los pasos se ejecutan a medida que los datos de los que dependen están disponibles. Por ejemplo, un componente de entrenamiento puede tomar un archivo CSV como entrada y usarlo para entrenar un modelo.

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,
    )

Reemplaza lo siguiente:

  • PROJECT_ID: Es el proyecto de Google Cloud en el que se ejecuta esta canalización.
  • PIPELINE_ROOT_PATH: Especifica un URI de Cloud Storage al que pueda acceder la cuenta de servicio de tus canalizaciones. Los artefactos de las ejecuciones de tus canalizaciones se almacenan en la raíz de la canalización.

    La raíz de la canalización se puede configurar como un argumento de la anotación @kfp.dsl.pipeline en la función de canalización, o se puede configurar cuando llamas a create_run_from_job_spec para crear una ejecución de canalización.

Compila tu canalización en un archivo YAML

Después de definir el flujo de trabajo de tu canalización, puedes continuar con la compilación de la canalización en formato YAML. El archivo YAML incluye toda la información para ejecutar tu canalización en Vertex AI Pipelines.

from kfp import compiler

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

Envíe la ejecución de su canalización

Una vez que el flujo de trabajo de su canalización se compila en el formato YAML, puede usar el cliente de Python de Vertex AI para enviar y ejecutar su canalización.

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()

Reemplaza lo siguiente:

  • PROJECT_REGION: Es la región en la que se ejecuta esta canalización.

En el ejemplo anterior:

  1. Una canalización de Kubeflow se define como una función de Python. La función se anota con el decorador @kfp.dsl.pipeline, que especifica el nombre de la canalización y la ruta raíz. La ruta raíz de la canalización es la ubicación en la que se almacenan los artefactos de la canalización.
  2. Los pasos del flujo de trabajo de la canalización se crean mediante los componentes de canalización de Google Cloud. Cuando usas los resultados de un componente como entrada de otro componente, defines el flujo de trabajo de la canalización como un grafo. Por ejemplo: training_job_run_op depende del resultado de dataset de ds_op.
  3. Compila la canalización mediante kfp.compiler.Compiler.
  4. Crea una canalización que se ejecute en canalizaciones de Vertex AI mediante el cliente de Vertex AI para Python. Cuando ejecutas una canalización, puedes anular el nombre de la canalización y la ruta raíz. Las ejecuciones de las canalizaciones se pueden agrupar con el nombre de la canalización. La anulación del nombre de la canalización puede ayudarte a distinguir entre las ejecuciones de producción y las experimentales.

Para obtener más información sobre cómo compilar canalizaciones, lee la sección compilación de canalizaciones de Kubeflow y sigue los instructivos y muestras.

Prueba una canalización de forma local (opcional)

Después de definir tus canalizaciones y componentes, puedes probar el código del componente mediante la ejecución del código en tu entorno de creación local. Si ejecutas tu canalización o un componente de forma local, puedes identificar y depurar posibles problemas antes de crear una ejecución de canalización en un entorno remoto, como Vertex AI Pipelines. Para obtener más información sobre la ejecución local de canalizaciones y componentes, consulta Ejecución local en la documentación de KFP.

En esta página, se muestra cómo definir y ejecutar una canalización que consta de dos tareas.

Cómo configurar tu entorno local

  1. Instala la última versión secundaria del SDK de Kubeflow Pipelines (KFP) v2:

    pip install --upgrade kfp>=2,<3
    
  2. Opcional: Instala Docker.

  3. Usa la siguiente muestra de código para definir una canalización 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
    

Invocar una ejecución local

Inicializa una sesión local con la función local.init(). Cuando usas local.init(), el SDK de KFP ejecuta de forma local tus canalizaciones y componentes cuando los llamas.

Cuando usas local.init(), debes especificar un tipo de ejecutor. El tipo de ejecutor indica cómo KFP debe ejecutar cada tarea.

Usa el siguiente ejemplo a fin de especificar el tipo de ejecutor DockerRunner para ejecutar cada tarea en un contenedor. Para obtener más información sobre los ejecutores locales compatibles con KFP, consulta Ejecutores locales en la documentación de KFP.

from kfp import local

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

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

Usa el siguiente código para ver el resultado de la tarea de canalización en la ejecución local:

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

Compila canalizaciones de Kubeflow

Usa el siguiente proceso para compilar una canalización.

  1. Diseña tu canalización como una serie de componentes. Para promover la reutilización, cada componente debe tener una sola responsabilidad. Siempre que sea posible, diseña tu canalización para que reutilice componentes comprobados, como los componentes de canalización de Google Cloud.

    Obtén más información sobre el diseño de canalizaciones.

  2. Compila los componentes personalizados que sean necesarios para implementar tu flujo de trabajo de AA con el SDK de Kubeflow Pipelines. Los componentes son conjuntos de código independientes que realizan un paso en tu flujo de trabajo de AA. Usa las siguientes opciones para crear los componentes de la canalización.

  3. Compila tu canalización como una función de Python.

    Obtén más información para definir tu canalización como una función de Python.

  4. Usar el compilador del SDK de Kubeflow Pipelines para compilar la canalización

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

    Reemplaza lo siguiente:

    • PIPELINE_FUNCTION: El nombre de la función de tu canalización.
    • PIPELINE_PACKAGE_PATH: La ruta en la que se debe almacenar tu canalización compilada.
  5. Ejecuta tu canalización con la consola de Google Cloud o Python.

Accede a recursos de Google Cloud en una canalización

Si no especificas una cuenta de servicio cuando ejecutas una canalización, Vertex AI Pipelines usa la cuenta de servicio predeterminada de Compute Engine para ejecutar la canalización. Vertex AI Pipelines también usa la cuenta de servicio de una ejecución de canalización para autorizar que tu canalización acceda a los recursos de Google Cloud. La cuenta de servicio predeterminada de Compute Engine tiene la función de editor del proyecto de forma predeterminada. Esto puede otorgar a las canalizaciones acceso excesivo a los recursos de Google Cloud en tu proyecto de Google Cloud.

Te recomendamos crear una cuenta de servicio para ejecutar las canalizaciones y, luego, otorgarle a esta cuenta permisos detallados sobre los recursos de Google Cloud necesarios para ejecutar la canalización.

Obtén más información sobre cómo usar Identity and Access Management para crear una cuenta de servicio y administrar el acceso otorgado a una cuenta de servicio.

Mantén tus canalizaciones actualizadas

Los clientes del SDK y las imágenes de contenedor que usas para compilar y ejecutar canalizaciones se actualizan periódicamente a versiones nuevas a fin de aplicar parches a las vulnerabilidades de seguridad y agregar funcionalidades nuevas. Para mantener tus canalizaciones actualizadas con la versión más reciente, te recomendamos que hagas lo siguiente:

¿Qué sigue?