Optimiza un modelo de clasificación de imágenes con datos personalizados en las canalizaciones de Vertex AI

En este instructivo, se muestra cómo usar Vertex AI Pipelines para ejecutar un flujo de trabajo de AA de extremo a extremo, incluidas las siguientes tareas:

  • Importar y transformar datos
  • Ajustar un modelo de clasificación de imágenes de TFHub con los datos transformados
  • Importa el modelo entrenado a Vertex AI Model Registry.
  • Opcional: Implementa el modelo para la entrega en línea con Vertex AI Prediction.

Antes de comenzar

  1. Asegúrate de haber completado los pasos del 1 al 3 en Configura un proyecto de Google Cloud y un entorno de desarrollo.

  2. Crea un entorno aislado de Python e instala el SDK de Vertex AI para Python

  3. Instala el SDK de Kubeflow Pipelines:

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

Ejecuta la canalización de entrenamiento de modelos del AA

El código de muestra hace lo siguiente:

  • Carga componentes de un repositorio de componentes para usarlos como componentes básicos de la canalización.
  • Redacta una canalización mediante la creación de tareas de componentes y el paso de datos entre ellas mediante argumentos.
  • Envía la canalización para su ejecución en Vertex AI Pipelines. Consulta los precios de Vertex AI Pipelines.

Copia el siguiente código de muestra en tu entorno de desarrollo y ejecútalo.

Clasificación de imágenes

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

Ten en cuenta lo siguiente sobre el código de muestra proporcionado:

  • Una canalización de Kubeflow se define como una función de Python.
  • Los pasos del flujo de trabajo de la canalización se crean mediante los componentes de la canalización de Kubeflow. 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, la tarea de componente preprocess_image_data_op depende de la salida tfrecord_image_data_path de la tarea de componente transcode_imagedataset_tfrecord_from_csv_op.
  • Crea una canalización que se ejecute en Vertex AI Pipelines mediante el SDK de Vertex AI para Python.

Supervisa la canalización

En la consola de Google Cloud, en la sección Vertex AI, ve a la página Canalizaciones y abre la pestaña Ejecuciones.

Ir a Ejecuciones de canalización

¿Qué sigue?