在 Vertex AI Pipelines 上使用自定义数据微调图片分类模型

本教程介绍如何使用 Vertex AI Pipelines 运行端到端机器学习工作流,包括以下任务:

  • 导入和转换数据。
  • 使用转换后的数据微调 TFHub 中的图片分类模型
  • 将经过训练的模型导入 Vertex AI Model Registry。
  • 可选:使用 Vertex AI Prediction 部署用于在线服务的模型。

准备工作

  1. 确保您已完成设置 Google Cloud 项目和开发环境中的步骤 1-3。

  2. 创建一个独立的 Python 环境并安装 Python 版 Vertex AI SDK

  3. 安装 Kubeflow Pipelines SDK:

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

运行机器学习模型训练流水线

示例代码会执行以下操作:

  • 组件代码库加载组件,以用作流水线基本组件。
  • 创建组件任务并使用参数在任务之间传递数据,从而构建流水线。
  • 提交流水线以在 Vertex AI Pipelines 上执行。请参阅 Vertex AI Pipelines 价格

将以下示例代码复制到开发环境中并运行代码。

图片分类

# 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('http://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('http://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('http://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('http://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('http://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('http://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.go888ogle.com.fqhub.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()

关于提供的示例代码,请注意以下几点:

  • Kubeflow 流水线定义为 Python 函数。
  • 流水线的工作流步骤是使用 Kubeflow 流水线组件创建的。通过使用组件的输出作为另一个组件的输入,您可以将流水线的工作流定义为图。例如,preprocess_image_data_op 组件任务依赖于 transcode_imagedataset_tfrecord_from_csv_op 组件任务中的 tfrecord_image_data_path 输出。
  • 您可以使用 Python 版 Vertex AI SDK 创建在 Vertex AI Pipelines 上运行的流水线。

监控流水线

在 Google Cloud 控制台的 Vertex AI 部分中,转到流水线页面并打开运行标签页。

转到“流水线运行”

后续步骤