Vertex AI Pipelines でカスタムデータを使用して画像分類モデルを微調整する

このチュートリアルでは、Vertex AI Pipelines を使用して、次のタスクを含むエンドツーエンドの ML ワークフローを実行する方法について説明します。

  • データをインポートして変換する。
  • 変換されたデータを使用して、TFHub の画像分類モデルを微調整する。
  • トレーニング済みモデルを Vertex AI Model Registry にインポートする。
  • 省略可: Vertex AI Prediction を使用してオンライン サービング用のモデルをデプロイする。

始める前に

  1. Google Cloud プロジェクトと開発環境を設定するの手順 1~3 が完了していることを確認します。

  2. 隔離された Python 環境を作成し、Vertex AI SDK for Python をインストールします。

  3. Kubeflow Pipelines SDK をインストールします。

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

ML モデルのトレーニング パイプラインを実行する

このサンプルコードは、次のことを行います。

  • コンポーネント リポジトリから、パイプラインの構成要素として使用されるコンポーネントを読み込みます。
  • コンポーネント タスクを作成し、引数を使用してそれらのタスク間でデータを渡すことで、パイプラインを作成します。
  • 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 出力に依存します。
  • Vertex AI SDK for Python を使用して Vertex AI Pipelines でパイプライン実行を作成します。

パイプラインをモニタリングする

Google Cloud コンソールの Vertex AI セクションで、[パイプライン] ページに移動し、[実行] タブを開きます。

[パイプライン実行] に移動する

次のステップ