トレーニング パイプラインの作成

トレーニング パイプラインを使用すると、カスタム機械学習(ML)のトレーニングを実行し、トレーニング出力に基づいて Model リソースを自動的に作成できます。

パイプラインを作成する前に

トレーニング パイプラインを Vertex AI に作成する前に、Python トレーニング アプリケーションまたはカスタム コンテナを作成して、Vertex AI で実行するトレーニング コードと依存関係を定義する必要があります。TensorFlow、scikit-learn、または XGBoost を使用して Python トレーニング アプリケーションを作成する場合は、ビルド済みのコンテナを使用してコードを実行できます。どちらを選択すればよいかわからない場合は、トレーニング コードの要件をご覧ください。

トレーニング パイプラインのオプション

トレーニング パイプラインは、追加のステップでトレーニング ジョブをカプセル化します。このガイドでは、2 つの異なるトレーニング パイプラインについて説明します。

  • CustomJob を起動して、生成されたモデルを Vertex AI にアップロードする
  • ハイパーパラメータ調整ジョブを起動して、生成されたモデルを Vertex AI にアップロードする

また、トレーニング パイプラインでマネージド データセットを使用することもできます。マネージド データセットを使用するようにトレーニング パイプラインを構成する方法をご覧ください

CustomJob の内容

カスタムジョブを作成する場合、Vertex AI がトレーニング コードを実行するために必要な設定を指定します。次のような設定になります。

ワーカープールでは次の設定を指定できます。

Vertex AI Training パイプラインの外部でスタンドアロン カスタムジョブを作成する場合は、カスタムジョブのガイドをご覧ください。

マネージド データセットを使用するようにパイプラインを構成する

トレーニング パイプライン内では、マネージド データセットを使用するようにカスタム トレーニング ジョブまたはハイパーパラメータ調整ジョブを構成できます。マネージド データセットでは、トレーニング アプリケーションとモデルを使用してデータセットを管理できます。

トレーニング パイプラインでマネージド データセットを使用するには:

  1. データセットを作成します。
  2. マネージド データセットを使用するようにトレーニング アプリケーションを更新します。詳細については、Vertex AI がデータセットをトレーニング アプリケーションに渡す方法をご覧ください。
  3. トレーニング パイプラインを作成するときに、マネージド データセットを指定します。たとえば、REST API を使用してトレーニング パイプラインを作成する場合は、inputDataConfig セクションにデータセット設定を指定します。

    トレーニング パイプラインは、データセットを作成したリージョンと同じリージョンに作成する必要があります。

詳しくは、TrainingPipeline の API リファレンスをご覧ください。

分散トレーニングを構成する

トレーニング パイプライン内では、複数のワーカープールを指定して、分散トレーニング用のカスタム トレーニング ジョブまたはハイパーパラメータ調整ジョブを構成できます。

このページの例はすべて、1 つのワーカープールを持つ単一レプリカ トレーニング ジョブを示しています。分散トレーニング用に変更するには:

  • 最初のワーカープールを使用してプライマリ レプリカを構成し、レプリカ数を 1 に設定します。
  • 機械学習フレームワークが分散トレーニング用のこれらの追加クラスタタスクをサポートしている場合は、ワーカープールを追加して、ワーカー レプリカ、パラメータ サーバー レプリカ、またはエバリュエータ レプリカを構成します。

分散トレーニングの使用方法の詳細。

CustomJob とモデルのアップロード

このトレーニング パイプラインでは、追加された便利な手順によりカスタムジョブがカプセル化されます。これにより、トレーニング後にモデルを Vertex AI に簡単にデプロイできます。このトレーニング パイプラインは、次の 2 つの主要な処理を行います。

  1. トレーニング パイプラインは CustomJob リソースを作成します。カスタムジョブは、指定したコンピューティング リソースを使用してトレーニング アプリケーションを実行します。

  2. カスタムジョブが完了すると、トレーニング パイプラインにより、トレーニング アプリケーションが Cloud Storage バケットに指定した出力ディレクトリに作成するモデル アーティファクトが検出されます。これらのアーティファクトを使用して、モデルのデプロイ用に設定するモデルリソースを作成します。

モデル アーティファクトの場所を設定するには、次の 2 つの方法があります。

  • トレーニング ジョブに baseOutputDirectory を設定する場合は、Vertex AI によって設定された $AIP_MODEL_DIR 環境変数を使用して、トレーニング コードがモデル アーティファクトをこの場所に保存するようにします。トレーニング ジョブが完了すると、Vertex AI は gs://BASE_OUTPUT_DIRECTORY/model で結果のモデル アーティファクトを検索します。

  • modelToUpload.artifactUri フィールドを設定すると、トレーニング パイプラインは、その URI からモデル アーティファクトをアップロードします。baseOutputDirectory を設定していない場合は、このフィールドを設定する必要があります。

baseOutputDirectorymodelToUpload.artifactUri の両方を指定している場合、Vertex AI は modelToUpload.artifactUri を使用します。

このタイプのトレーニング パイプラインを作成するには:

コンソール

  1. Google Cloud コンソールの [Vertex AI] セクションで、[トレーニング パイプライン] ページに移動します。

    [トレーニング パイプライン] に移動

  2. [作成] をクリックして、[新しいモデルのトレーニング] ペインを開きます。

  3. トレーニング方法のステップで、次の設定を指定します。

    1. マネージド データセットをトレーニングに使用する場合は、データセットアノテーション セットを指定します。

      それ以外の場合は、[Dataset] プルダウン リストで、[管理されているデータセットなし] を選択します。

    2. [カスタム トレーニング(上級者向け)] を選択します。

    [続行] をクリックします。

  4. [モデルの詳細] ステップで、[新しいモデルをトレーニング] または [新しいバージョンをトレーニング] を選択します。新しいモデルをトレーニングする場合は、モデルに任意の名前(MODEL_NAME)を入力します。[続行] をクリックします。

  5. [トレーニング コンテナ] ステップで、次の設定を指定します。

    1. トレーニングにビルド済みのコンテナカスタム コンテナのどちらを使用するかを選択します。

    2. 選択した内容に応じて、次のいずれかを行います。

    3. [Model output directory] フィールドに、アクセス権があるバケット内のディレクトリの Cloud Storage URI を指定します。そのディレクトリがまだ存在していなくてもかまいません。

      この値は、Vertex AI の baseOutputDirectory API フィールドに渡されます。この値に基づいて、トレーニング アプリケーションが実行時にアクセスする複数の環境変数が設定されます。

      トレーニングが終了すると、Vertex AI はこの URI のサブディレクトリでモデル アーティファクトを探して Model を作成します(このサブディレクトリは、トレーニング コードで AIP_MODEL_DIR 環境変数として使用できます)。

      ハイパーパラメータ調整を使用しない場合、Vertex AI は BASE_OUTPUT_DIRECTORY/model/ にモデル アーティファクトがあると想定します。

    4. 省略可: [引数] フィールドに、Vertex AI がトレーニング コードの実行開始時に使用する引数を指定できます。すべての引数の合計長は 100,000 文字以下にする必要があります。これらの引数の動作は、使用しているコンテナの種類によって異なります。

      • ビルド済みのコンテナを使用する場合、Vertex AI は引数をコマンドライン フラグとして Python モジュールに渡します。

      • カスタム コンテナを使用している場合、Vertex AI はコンテナの CMD 命令を引数でオーバーライドします。

    [続行] をクリックします。

  6. [ハイパーパラメータ調整] ステップで、[Enable hyperparameter tuning] チェックボックスがオフになっていることを確認します。[続行] をクリックします。

  7. [コンピューティングと料金] ステップで、次の設定を指定します。

    1. [リージョン] プルダウン リストで、カスタム トレーニングをサポートするリージョンを選択します。

    2. [Worker pool 0] セクションで、トレーニングに使用するコンピューティング リソースを指定します。

      アクセラレータを指定する場合は、選択したアクセラレータが選択したリージョンで使用できることを確認してください

      分散トレーニングを行う場合は、[ADD MORE WORKER POOLS] をクリックし、追加のワーカープールごとに追加のコンピューティング リソースのセットを指定します。

    [続行] をクリックします。

  8. [予測コンテナ] ステップで、次の設定を指定します。

    1. トレーニング済みモデルから予測を提供するには、ビルド済みのコンテナカスタム コンテナのどちらを使用するかを選択します。

    2. 選択した内容に応じて、次のいずれかを行います。

    3. [モデル ディレクトリ] フィールドには、トレーニング コンテナのステップの [Model output directory] で設定した値が含まれています。どちらのフィールドを変更しても影響は同じです。このフィールドの詳細については、前の手順をご覧ください。

    4. [予測 schemata] セクションのフィールドは空白のままにします。

  9. [トレーニングを開始] をクリックして、カスタム トレーニング パイプラインを開始します。

REST

次のコードサンプルを使用して、trainingPipeline リソースの create メソッドを使用してトレーニング パイプラインを作成します。

注: このパイプラインを設定して新しいモデル バージョンを作成する場合は、必要に応じて trainingPipeline フィールドに PARENT_MODEL を追加できます。

詳細については、Vertex AI Model Registry を使用したモデルのバージョニングをご覧ください。

リクエストのデータを使用する前に、次のように置き換えます。

  • LOCATION_ID: トレーニング コードが実行され、Model が保存されるリージョン。
  • PROJECT_ID: 実際のプロジェクト ID。
  • TRAINING_PIPELINE_NAME: 必須。trainingPipeline の表示名。
  • トレーニング アプリケーションで Vertex AI データセットを使用する場合は、以下を指定します。
    • DATASET_ID: データセットの ID。
    • ANNOTATIONS_FILTER: 指定したアノテーションでデータセットをフィルタします。
    • ANNOTATION_SCHEMA_URI: 指定したアノテーション スキーマ URI でデータセットをフィルタします。
    • 次のいずれかのオプションを使用して、データ項目をトレーニング セット、検証セット、テストセットに分割する方法を指定します。
      • 各セットのサイズを定義する割合に基づいてデータセットを分割するには、以下を指定します。
        • TRAINING_FRACTION: モデルのトレーニングに使用するデータセットの割合。
        • VALIDATION_FRACTION: モデルの検証に使用するデータセットの割合。
        • TEST_FRACTION: モデルの評価に使用するデータセットの割合。
      • フィルタに基づいてデータセットを分割するには、次のように指定します。
        • TRAINING_FILTER: モデルのトレーニングに使用するデータ項目にデータセットをフィルタします。
        • VALIDATION_FILTER: モデルの検証に使用するデータ項目にデータセットをフィルタします。
        • TEST_FILTER: モデルの評価に使用するデータ項目にデータセットをフィルタします。
      • 事前定義された分割を使用するには、次のように指定します。
        • PREDEFINED_SPLIT_KEY: データセットの分割に使用する列の名前。この列に指定できる値は、「training」、「validation」、「test」です。
      • dataitems のタイムスタンプに基づいてデータセットを分割するには、次のように指定します。
        • TIMESTAMP_TRAINING_FRACTION: モデルのトレーニングに使用するデータセットの割合。
        • TIMESTAMP_VALIDATION_FRACTION: モデルの検証に使用するデータセットの割合。
        • TIMESTAMP_TEST_FRACTION: モデルの評価に使用するデータセットの割合。
        • TIMESTAMP_SPLIT_KEY: データセットの分割に使用するタイムスタンプ列の名前。
    • OUTPUT_URI_PREFIX: Vertex AI でトレーニング データセットがトレーニング セット、検証セット、テストセットに分割された後にエクスポートされる Cloud Storage の場所。
  • カスタム トレーニング ジョブを定義します。
    • MACHINE_TYPE: マシンのタイプ。トレーニングで使用可能なマシンタイプをご覧ください。
    • ACCELERATOR_TYPE: 省略可。各トライアルに接続するアクセラレータのタイプ。
    • ACCELERATOR_COUNT: 省略可。各トライアルに接続するアクセラレータの数。
    • REPLICA_COUNT: 各トライアルで使用するワーカー レプリカの数。
    • トレーニング アプリケーションがカスタム コンテナで実行される場合は、次のように指定します。
      • CUSTOM_CONTAINER_IMAGE_URI: 各ワーカー レプリカで実行される Artifact Registry または Docker Hub 内のコンテナ イメージの URI。
      • CUSTOM_CONTAINER_COMMAND: 省略可。コンテナの起動時に呼び出されるコマンド。このコマンドは、コンテナのデフォルトのエントリポイントをオーバーライドします。
      • CUSTOM_CONTAINER_ARGS: 省略可。コンテナの起動時に渡される引数。すべての引数の合計長は 100,000 文字以下にする必要があります。
    • トレーニング アプリケーションが事前ビルド済みのコンテナで実行される Python パッケージの場合は、以下を指定します。
      • PYTHON_PACKAGE_EXECUTOR_IMAGE_URI: 提供された Python パッケージを実行するコンテナ イメージの URI。トレーニングに使用可能なビルド済みのコンテナをご確認ください。
      • PYTHON_PACKAGE_URIS: トレーニング プログラムとその依存パッケージである Python パッケージ ファイルの Cloud Storage 上のロケーション。パッケージ URI の最大数は 100 です。
      • PYTHON_MODULE: パッケージのインストール後に実行する Python モジュール名。
      • PYTHON_PACKAGE_ARGS: 省略可。Python モジュールに渡すコマンドライン引数。すべての引数の合計長は 100,000 文字以下にする必要があります。
    • TIMEOUT: 省略可。ジョブの最大実行時間。
  • MODEL_NAME: TrainingPipeline によってアップロード(作成)されたモデルの表示名。
  • MODEL_DESCRIPTION: モデルの説明。
  • IMAGE_URI: 予測の実行に使用するコンテナ イメージの URI。例: us-docker.pkg.dev/vertex-ai/prediction/tf2-cpu.2-1:latestビルド済みのコンテナまたはカスタム コンテナを使用します。
  • modelToUpload.labels: モデルを整理するための任意の Key-Value ペアのセット。例:
    • "env": "prod"
    • "tier": "backend"
  • このトレーニング パイプラインに適用するラベルの LABEL_NAMELABEL_VALUE を指定します。

HTTP メソッドと URL:

POST https://LOCATION_ID-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/trainingPipelines

リクエストの本文(JSON):

{
  "displayName": "TRAINING_PIPELINE_NAME",
  "inputDataConfig": {
    "datasetId": DATASET_ID,
    "annotationsFilter": ANNOTATIONS_FILTER,
    "annotationSchemaUri": ANNOTATION_SCHEMA_URI,

    // Union field split can be only one of the following:
    "fractionSplit": {
      "trainingFraction": TRAINING_FRACTION,
      "validationFraction": VALIDATION_FRACTION,
      "testFraction": TEST_FRACTION
    },
    "filterSplit": {
      "trainingFilter": TRAINING_FILTER,
      "validationFilter": VALIDATION_FILTER,
      "testFilter": TEST_FILTER
    },
    "predefinedSplit": {
      "key": PREDEFINED_SPLIT_KEY
    },
    "timestampSplit": {
      "trainingFraction": TIMESTAMP_TRAINING_FRACTION,
      "validationFraction": TIMESTAMP_VALIDATION_FRACTION,
      "testFraction": TIMESTAMP_TEST_FRACTION,
      "key": TIMESTAMP_SPLIT_KEY
    }
    // End of list of possible types for union field split.
    "gcsDestination": {
      "outputUriPrefix": OUTPUT_URI_PREFIX
    }
  },
  "trainingTaskDefinition": "gs://google-cloud-aiplatform/schema/trainingjob/definition/custom_task_1.0.0.yaml",
  "trainingTaskInputs": {
    "workerPoolSpecs": [
        {
          "machineSpec": {
            "machineType": MACHINE_TYPE,
            "acceleratorType": ACCELERATOR_TYPE,
            "acceleratorCount": ACCELERATOR_COUNT
          },
          "replicaCount": REPLICA_COUNT,

          // Union field task can be only one of the following:
          "containerSpec": {
            "imageUri": CUSTOM_CONTAINER_IMAGE_URI,
            "command": [
              CUSTOM_CONTAINER_COMMAND
            ],
            "args": [
              CUSTOM_CONTAINER_ARGS
            ]
          },
          "pythonPackageSpec": {
            "executorImageUri": PYTHON_PACKAGE_EXECUTOR_IMAGE_URI,
            "packageUris": [
              PYTHON_PACKAGE_URIS
            ],
            "pythonModule": PYTHON_MODULE,
            "args": [
              PYTHON_PACKAGE_ARGS
            ]
          }
          // End of list of possible types for union field task.
        }
      ],
      "scheduling": {
        "TIMEOUT": TIMEOUT
      }
    }
  },
  "modelToUpload": {
    "displayName": "MODEL_NAME",
    "predictSchemata": {},
    "containerSpec": {
      "imageUri": "IMAGE_URI"
    }
  },
  "labels": {
    LABEL_NAME_1": LABEL_VALUE_1,
    LABEL_NAME_2": LABEL_VALUE_2
  }
}

リクエストを送信するには、次のいずれかのオプションを選択します。

curl

リクエスト本文を request.json という名前のファイルに保存して、次のコマンドを実行します。

curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://LOCATION_ID-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/trainingPipelines"

PowerShell

リクエスト本文を request.json という名前のファイルに保存して、次のコマンドを実行します。

$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }

Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://LOCATION_ID-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/trainingPipelines" | Select-Object -Expand Content

レスポンスには、仕様と TRAININGPIPELINE_ID に関する情報が含まれています。

Java

このサンプルを試す前に、Vertex AI クイックスタート: クライアント ライブラリの使用にある Java の設定手順を完了してください。詳細については、Vertex AI Java API のリファレンス ドキュメントをご覧ください。

Vertex AI に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、ローカル開発環境の認証を設定するをご覧ください。

import com.google.cloud.aiplatform.v1.LocationName;
import com.google.cloud.aiplatform.v1.Model;
import com.google.cloud.aiplatform.v1.ModelContainerSpec;
import com.google.cloud.aiplatform.v1.PipelineServiceClient;
import com.google.cloud.aiplatform.v1.PipelineServiceSettings;
import com.google.cloud.aiplatform.v1.TrainingPipeline;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.google.protobuf.Value;
import com.google.protobuf.util.JsonFormat;
import java.io.IOException;

public class CreateTrainingPipelineCustomJobSample {

  public static void main(String[] args) throws IOException {
    // TODO(developer): Replace these variables before running the sample.
    String project = "PROJECT";
    String displayName = "DISPLAY_NAME";
    String modelDisplayName = "MODEL_DISPLAY_NAME";
    String containerImageUri = "CONTAINER_IMAGE_URI";
    String baseOutputDirectoryPrefix = "BASE_OUTPUT_DIRECTORY_PREFIX";
    createTrainingPipelineCustomJobSample(
        project, displayName, modelDisplayName, containerImageUri, baseOutputDirectoryPrefix);
  }

  static void createTrainingPipelineCustomJobSample(
      String project,
      String displayName,
      String modelDisplayName,
      String containerImageUri,
      String baseOutputDirectoryPrefix)
      throws IOException {
    PipelineServiceSettings settings =
        PipelineServiceSettings.newBuilder()
            .setEndpoint("us-central1-aiplatform.googleapis.com:443")
            .build();
    String location = "us-central1";

    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests. After completing all of your requests, call
    // the "close" method on the client to safely clean up any remaining background resources.
    try (PipelineServiceClient client = PipelineServiceClient.create(settings)) {
      JsonObject jsonMachineSpec = new JsonObject();
      jsonMachineSpec.addProperty("machineType", "n1-standard-4");

      // A working docker image can be found at
      // gs://cloud-samples-data/ai-platform/mnist_tfrecord/custom_job
      // This sample image accepts a set of arguments including model_dir.
      JsonObject jsonContainerSpec = new JsonObject();
      jsonContainerSpec.addProperty("imageUri", containerImageUri);
      JsonArray jsonArgs = new JsonArray();
      jsonArgs.add("--model_dir=$(AIP_MODEL_DIR)");
      jsonContainerSpec.add("args", jsonArgs);

      JsonObject jsonJsonWorkerPoolSpec0 = new JsonObject();
      jsonJsonWorkerPoolSpec0.addProperty("replicaCount", 1);
      jsonJsonWorkerPoolSpec0.add("machineSpec", jsonMachineSpec);
      jsonJsonWorkerPoolSpec0.add("containerSpec", jsonContainerSpec);

      JsonArray jsonWorkerPoolSpecs = new JsonArray();
      jsonWorkerPoolSpecs.add(jsonJsonWorkerPoolSpec0);

      JsonObject jsonBaseOutputDirectory = new JsonObject();
      // The GCS location for outputs must be accessible by the project's AI Platform
      // service account.
      jsonBaseOutputDirectory.addProperty("output_uri_prefix", baseOutputDirectoryPrefix);

      JsonObject jsonTrainingTaskInputs = new JsonObject();
      jsonTrainingTaskInputs.add("workerPoolSpecs", jsonWorkerPoolSpecs);
      jsonTrainingTaskInputs.add("baseOutputDirectory", jsonBaseOutputDirectory);

      Value.Builder trainingTaskInputsBuilder = Value.newBuilder();
      JsonFormat.parser().merge(jsonTrainingTaskInputs.toString(), trainingTaskInputsBuilder);
      Value trainingTaskInputs = trainingTaskInputsBuilder.build();
      String trainingTaskDefinition =
          "gs://google-cloud-aiplatform/schema/trainingjob/definition/custom_task_1.0.0.yaml";
      String imageUri = "gcr.io/cloud-aiplatform/prediction/tf-cpu.1-15:latest";
      ModelContainerSpec containerSpec =
          ModelContainerSpec.newBuilder().setImageUri(imageUri).build();
      Model modelToUpload =
          Model.newBuilder()
              .setDisplayName(modelDisplayName)
              .setContainerSpec(containerSpec)
              .build();
      TrainingPipeline trainingPipeline =
          TrainingPipeline.newBuilder()
              .setDisplayName(displayName)
              .setTrainingTaskDefinition(trainingTaskDefinition)
              .setTrainingTaskInputs(trainingTaskInputs)
              .setModelToUpload(modelToUpload)
              .build();
      LocationName parent = LocationName.of(project, location);
      TrainingPipeline response = client.createTrainingPipeline(parent, trainingPipeline);
      System.out.format("response: %s\n", response);
      System.out.format("Name: %s\n", response.getName());
    }
  }
}

Python

Vertex AI SDK for Python のインストールまたは更新の方法については、Vertex AI SDK for Python をインストールするをご覧ください。 詳細については、Python API リファレンス ドキュメントをご覧ください。

次の例では、Vertex AI SDK for Python を使用してカスタム トレーニング パイプラインを作成する方法を示します。トレーニングにカスタム コンテナを使用するか、ビルド済みのコンテナを使用するかを選択します。

ビルド済みコンテナ

Vertex AI SDK for Python を使用して、ビルド済みのコンテナで Python コードを実行するトレーニング パイプラインを作成する場合は、次のいずれかの方法でトレーニング コードを提供できます。

  • Cloud Storage の Python ソース配布パッケージの URI を指定します。

    (このオプションは、Vertex AI SDK for Python を使用せずにトレーニング パイプラインを作成する場合にも使用できます)。

  • ローカルマシン上の Python スクリプトへのパスを指定します。トレーニング パイプラインを作成する前に、Vertex AI SDK for Python がスクリプトをソース ディストリビューションとしてパッケージ化し、選択した Cloud Storage バケットにアップロードします。

    (このオプションは、Vertex AI SDK for Python を使用している場合にのみ使用できます)。

各オプションのコードサンプルを確認するには、対応するタブを選択してください。

パッケージ

次のサンプルでは、CustomPythonPackageTrainingJob クラスを使用しています。

def create_training_pipeline_custom_package_job_sample(
    project: str,
    location: str,
    staging_bucket: str,
    display_name: str,
    python_package_gcs_uri: str,
    python_module_name: str,
    container_uri: str,
    model_serving_container_image_uri: str,
    dataset_id: Optional[str] = None,
    model_display_name: Optional[str] = None,
    args: Optional[List[Union[str, float, int]]] = None,
    replica_count: int = 1,
    machine_type: str = "n1-standard-4",
    accelerator_type: str = "ACCELERATOR_TYPE_UNSPECIFIED",
    accelerator_count: int = 0,
    training_fraction_split: float = 0.8,
    validation_fraction_split: float = 0.1,
    test_fraction_split: float = 0.1,
    sync: bool = True,
    tensorboard_resource_name: Optional[str] = None,
    service_account: Optional[str] = None,
):
    aiplatform.init(project=project, location=location, staging_bucket=staging_bucket)

    job = aiplatform.CustomPythonPackageTrainingJob(
        display_name=display_name,
        python_package_gcs_uri=python_package_gcs_uri,
        python_module_name=python_module_name,
        container_uri=container_uri,
        model_serving_container_image_uri=model_serving_container_image_uri,
    )

    # This example uses an ImageDataset, but you can use another type
    dataset = aiplatform.ImageDataset(dataset_id) if dataset_id else None

    model = job.run(
        dataset=dataset,
        model_display_name=model_display_name,
        args=args,
        replica_count=replica_count,
        machine_type=machine_type,
        accelerator_type=accelerator_type,
        accelerator_count=accelerator_count,
        training_fraction_split=training_fraction_split,
        validation_fraction_split=validation_fraction_split,
        test_fraction_split=test_fraction_split,
        sync=sync,
        tensorboard=tensorboard_resource_name,
        service_account=service_account,
    )

    model.wait()

    print(model.display_name)
    print(model.resource_name)
    print(model.uri)
    return model

スクリプト

次のサンプルでは、CustomTrainingJob クラスを使用しています。

def create_training_pipeline_custom_job_sample(
    project: str,
    location: str,
    staging_bucket: str,
    display_name: str,
    script_path: str,
    container_uri: str,
    model_serving_container_image_uri: str,
    dataset_id: Optional[str] = None,
    model_display_name: Optional[str] = None,
    args: Optional[List[Union[str, float, int]]] = None,
    replica_count: int = 0,
    machine_type: str = "n1-standard-4",
    accelerator_type: str = "ACCELERATOR_TYPE_UNSPECIFIED",
    accelerator_count: int = 0,
    training_fraction_split: float = 0.8,
    validation_fraction_split: float = 0.1,
    test_fraction_split: float = 0.1,
    sync: bool = True,
    tensorboard_resource_name: Optional[str] = None,
    service_account: Optional[str] = None,
):
    aiplatform.init(project=project, location=location, staging_bucket=staging_bucket)

    job = aiplatform.CustomTrainingJob(
        display_name=display_name,
        script_path=script_path,
        container_uri=container_uri,
        model_serving_container_image_uri=model_serving_container_image_uri,
    )

    # This example uses an ImageDataset, but you can use another type
    dataset = aiplatform.ImageDataset(dataset_id) if dataset_id else None

    model = job.run(
        dataset=dataset,
        model_display_name=model_display_name,
        args=args,
        replica_count=replica_count,
        machine_type=machine_type,
        accelerator_type=accelerator_type,
        accelerator_count=accelerator_count,
        training_fraction_split=training_fraction_split,
        validation_fraction_split=validation_fraction_split,
        test_fraction_split=test_fraction_split,
        sync=sync,
        tensorboard=tensorboard_resource_name,
        service_account=service_account,
    )

    model.wait()

    print(model.display_name)
    print(model.resource_name)
    print(model.uri)
    return model

カスタム コンテナ

次のサンプルでは、CustomContainerTrainingJob クラスを使用しています。

def create_training_pipeline_custom_container_job_sample(
    project: str,
    location: str,
    staging_bucket: str,
    display_name: str,
    container_uri: str,
    model_serving_container_image_uri: str,
    dataset_id: Optional[str] = None,
    model_display_name: Optional[str] = None,
    args: Optional[List[Union[str, float, int]]] = None,
    replica_count: int = 1,
    machine_type: str = "n1-standard-4",
    accelerator_type: str = "ACCELERATOR_TYPE_UNSPECIFIED",
    accelerator_count: int = 0,
    training_fraction_split: float = 0.8,
    validation_fraction_split: float = 0.1,
    test_fraction_split: float = 0.1,
    sync: bool = True,
    tensorboard_resource_name: Optional[str] = None,
    service_account: Optional[str] = None,
):
    aiplatform.init(project=project, location=location, staging_bucket=staging_bucket)

    job = aiplatform.CustomContainerTrainingJob(
        display_name=display_name,
        container_uri=container_uri,
        model_serving_container_image_uri=model_serving_container_image_uri,
    )

    # This example uses an ImageDataset, but you can use another type
    dataset = aiplatform.ImageDataset(dataset_id) if dataset_id else None

    model = job.run(
        dataset=dataset,
        model_display_name=model_display_name,
        args=args,
        replica_count=replica_count,
        machine_type=machine_type,
        accelerator_type=accelerator_type,
        accelerator_count=accelerator_count,
        training_fraction_split=training_fraction_split,
        validation_fraction_split=validation_fraction_split,
        test_fraction_split=test_fraction_split,
        sync=sync,
        tensorboard=tensorboard_resource_name,
        service_account=service_account,
    )

    model.wait()

    print(model.display_name)
    print(model.resource_name)
    print(model.uri)
    return model

ハイパーパラメータ調整ジョブとモデルのアップロード

このトレーニング パイプラインでは、追加された便利な手順によりハイパーパラメータ調整ジョブがカプセル化されます。これにより、トレーニング後にモデルを Vertex AI に簡単にデプロイできます。このトレーニング パイプラインは、次の 2 つの主要な処理を行います。

  1. トレーニング パイプラインは、ハイパーパラメータ調整ジョブのリソースを作成します。ハイパーパラメータ調整ジョブは複数のトライアルを作成します。トライアルごとに、カスタムジョブは、指定したコンピューティング リソースとハイパーパラメータを使用してトレーニング アプリケーションを実行します。

  2. ハイパーパラメータ調整ジョブが完了すると、トレーニング パイプラインにより、Cloud Storage バケットに指定した出力ディレクトリ(baseOutputDirectory)内で、最適なトライアルからモデル アーティファクトが検出されます。トレーニング パイプラインは、これらのアーティファクトを使用して、モデルのデプロイ用に設定するモデルリソースを作成します。

このトレーニング パイプラインでは、Vertex AI が最適なトライアルからモデル アーティファクトを検索する baseOutputDirectory を指定する必要があります。

ハイパーパラメータ調整ジョブを構成するには、追加の設定があります。詳しくは、HyperparameterTuningJob の設定についての説明をご覧ください。

REST

次のコードサンプルを使用して、trainingPipeline リソースの create メソッドを使用してトレーニング パイプラインを作成します。

リクエストのデータを使用する前に、次のように置き換えます。

  • LOCATION_ID: プロジェクトのリージョン。
  • PROJECT_ID: 実際のプロジェクト ID。
  • TRAINING_PIPELINE_NAME: 必須。trainingPipeline の表示名。
  • トレーニング アプリケーションで Vertex AI データセットを使用する場合は、以下を指定します。
    • DATASET_ID: データセットの ID。
    • ANNOTATIONS_FILTER: 指定したアノテーションでデータセットをフィルタします。
    • ANNOTATION_SCHEMA_URI: 指定したアノテーション スキーマ URI でデータセットをフィルタします。
    • 次のいずれかのオプションを使用して、データ項目をトレーニング セット、検証セット、テストセットに分割する方法を指定します。
      • 各セットのサイズを定義する割合に基づいてデータセットを分割するには、以下を指定します。
        • TRAINING_FRACTION: モデルのトレーニングに使用するデータセットの割合。
        • VALIDATION_FRACTION: モデルの検証に使用するデータセットの割合。
        • TEST_FRACTION: モデルの評価に使用するデータセットの割合。
      • フィルタに基づいてデータセットを分割するには、次のように指定します。
        • TRAINING_FILTER: モデルのトレーニングに使用するデータ項目にデータセットをフィルタします。
        • VALIDATION_FILTER: モデルの検証に使用するデータ項目にデータセットをフィルタします。
        • TEST_FILTER: モデルの評価に使用するデータ項目にデータセットをフィルタします。
      • 事前定義された分割を使用するには、次のように指定します。
        • PREDEFINED_SPLIT_KEY: データセットの分割に使用する列の名前。この列に指定できる値は、「training」、「validation」、「test」です。
      • dataitems のタイムスタンプに基づいてデータセットを分割するには、次のように指定します。
        • TIMESTAMP_TRAINING_FRACTION: モデルのトレーニングに使用するデータセットの割合。
        • TIMESTAMP_VALIDATION_FRACTION: モデルの検証に使用するデータセットの割合。
        • TIMESTAMP_TEST_FRACTION: モデルの評価に使用するデータセットの割合。
        • TIMESTAMP_SPLIT_KEY: データセットの分割に使用するタイムスタンプ列の名前。
    • OUTPUT_URI_PREFIX: Vertex AI でトレーニング データセットがトレーニング セット、検証セット、テストセットに分割された後にエクスポートされる Cloud Storage 上のロケーション。
  • ハイパーパラメータ調整ジョブを指定します。
    • 次のように指標を指定します。
      • METRIC_ID: この指標の名前。
      • METRIC_GOAL: この指標の目標。MAXIMIZE または MINIMIZE です。
    • ハイパーパラメータを指定します。
      • PARAMETER_ID: このハイパーパラメータの名前。
      • PARAMETER_SCALE: 省略可。パラメータのスケーリング方法。CATEGORICAL パラメータには設定しないでください。UNIT_LINEAR_SCALEUNIT_LOG_SCALEUNIT_REVERSE_LOG_SCALE または SCALE_TYPE_UNSPECIFIED のいずれかです。
      • このハイパーパラメータのタイプが DOUBLE の場合は、このハイパーパラメータの最小値(DOUBLE_MIN_VALUE)と最大値(DOUBLE_MAX_VALUE)を指定します。
      • このハイパーパラメータのタイプが INTEGER の場合は、このハイパーパラメータの最小値(INTEGER_MIN_VALUE)と最大値(INTEGER_MAX_VALUE)を指定します。
      • このハイパーパラメータのタイプが CATEGORICAL の場合は、許容値(CATEGORICAL_VALUES)を文字列の配列として指定します。
      • このハイパーパラメータのタイプが DISCRETE の場合は、許容値(DISCRETE_VALUES)を数値の配列として指定します。
    • ALGORITHM: 省略可。このハイパーパラメータ調整ジョブで使用する検索アルゴリズム。ALGORITHM_UNSPECIFIEDGRID_SEARCH または RANDOM_SEARCH のいずれかです。
    • MAX_TRIAL_COUNT: このジョブで実行するトライアルの最大数。
    • PARALLEL_TRIAL_COUNT: 並列実行できるトライアルの最大数。
    • MAX_FAILED_TRIAL_COUNT: ハイパーパラメータ調整ジョブが失敗する前に失敗する可能性があるジョブの数。
    • トライアルのカスタム トレーニング ジョブを定義します。
      • MACHINE_TYPE: マシンのタイプ。トレーニングで使用可能なマシンタイプをご覧ください。
      • ACCELERATOR_TYPE: 省略可。各トライアルに接続するアクセラレータのタイプ。
      • ACCELERATOR_COUNT: 省略可。各トライアルに接続するアクセラレータの数。
      • REPLICA_COUNT: 各トライアルで使用するワーカー レプリカの数。
      • トレーニング アプリケーションがカスタム コンテナで実行される場合は、次のように指定します。
        • CUSTOM_CONTAINER_IMAGE_URI: 各ワーカー レプリカで実行される Artifact Registry または Docker Hub 内のコンテナ イメージの URI。
        • CUSTOM_CONTAINER_COMMAND: 省略可。コンテナの起動時に呼び出されるコマンド。このコマンドは、コンテナのデフォルトのエントリポイントをオーバーライドします。
        • CUSTOM_CONTAINER_ARGS: 省略可。コンテナの起動時に渡される引数。
      • トレーニング アプリケーションがビルド済みのコンテナで実行される Python パッケージの場合は、以下を指定します。
        • PYTHON_PACKAGE_EXECUTOR_IMAGE_URI: 提供された Python パッケージを実行するコンテナ イメージの URI。トレーニングに使用可能なビルド済みのコンテナをご確認ください。
        • PYTHON_PACKAGE_URIS: トレーニング プログラムとその依存パッケージである Python パッケージ ファイルの Cloud Storage 上のロケーション。パッケージ URI の最大数は 100 です。
        • PYTHON_MODULE: パッケージのインストール後に実行する Python モジュール名。
        • PYTHON_PACKAGE_ARGS: 省略可。Python モジュールに渡すコマンドライン引数。
    • ジョブ スケジュール オプションをご覧ください。
    • TIMEOUT: 省略可。トライアルごとの最大実行時間。
    • このハイパーパラメータ調整ジョブに適用するラベルの LABEL_NAMELABEL_VALUE を指定します。
  • MODEL_NAME: TrainingPipeline によってアップロード(作成)されたモデルの表示名。
  • MODEL_DESCRIPTION: 省略可。モデルの説明。
  • PREDICTION_IMAGE_URI: 必須。次の 2 つのオプションのいずれかを指定します。
  • modelToUpload.labels: 省略可。モデルを整理するための任意の Key-Value ペア。例:
    • "env": "prod"
    • "tier": "backend"
  • このトレーニング パイプラインに適用するラベルの LABEL_NAMELABEL_VALUE を指定します。

HTTP メソッドと URL:

POST https://LOCATION_ID-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/trainingPipelines

リクエストの本文(JSON):

{
  "displayName": "TRAINING_PIPELINE_NAME",
  "inputDataConfig": {
    "datasetId": DATASET_ID,
    "annotationsFilter": ANNOTATIONS_FILTER,
    "annotationSchemaUri": ANNOTATION_SCHEMA_URI,

    // Union field split can be only one of the following:
    "fractionSplit": {
      "trainingFraction": TRAINING_FRACTION,
      "validationFraction": VALIDATION_FRACTION,
      "testFraction": TEST_FRACTION
    },
    "filterSplit": {
      "trainingFilter": TRAINING_FILTER,
      "validationFilter": VALIDATION_FILTER,
      "testFilter": TEST_FILTER
    },
    "predefinedSplit": {
      "key": PREDEFINED_SPLIT_KEY
    },
    "timestampSplit": {
      "trainingFraction": TIMESTAMP_TRAINING_FRACTION,
      "validationFraction": TIMESTAMP_VALIDATION_FRACTION,
      "testFraction": TIMESTAMP_TEST_FRACTION,
      "key": TIMESTAMP_SPLIT_KEY
    }
    // End of list of possible types for union field split.
    "gcsDestination": {
      "outputUriPrefix": OUTPUT_URI_PREFIX
    }
  },
  "trainingTaskDefinition": "gs://google-cloud-aiplatform/schema/trainingjob/definition/hyperparameter_tuning_task_1.0.0.yaml",
  "trainingTaskInputs": {
    "studySpec": {
    "metrics": [
      {
        "metricId": METRIC_ID,
        "goal": METRIC_GOAL
      }
    ],
    "parameters": [
      {
        "parameterId": PARAMETER_ID,
        "scaleType": PARAMETER_SCALE,

        // Union field parameter_value_spec can be only one of the following:
        "doubleValueSpec": {
            "minValue": DOUBLE_MIN_VALUE,
            "maxValue": DOUBLE_MAX_VALUE
        },
        "integerValueSpec": {
            "minValue": INTEGER_MIN_VALUE,
            "maxValue": INTEGER_MAX_VALUE
        },
        "categoricalValueSpec": {
            "values": [
              CATEGORICAL_VALUES
            ]
        },
        "discreteValueSpec": {
            "values": [
              DISCRETE_VALUES
            ]
        }
        // End of list of possible types for union field parameter_value_spec.
      }
    ],
    "ALGORITHM": ALGORITHM
  },
  "maxTrialCount": MAX_TRIAL_COUNT,
  "parallelTrialCount": PARALLEL_TRIAL_COUNT,
  "maxFailedTrialCount": MAX_FAILED_TRIAL_COUNT,
  "trialJobSpec": {
      "workerPoolSpecs": [
        {
          "machineSpec": {
            "machineType": MACHINE_TYPE,
            "acceleratorType": ACCELERATOR_TYPE,
            "acceleratorCount": ACCELERATOR_COUNT
          },
          "replicaCount": REPLICA_COUNT,

          // Union field task can be only one of the following:
          "containerSpec": {
            "imageUri": CUSTOM_CONTAINER_IMAGE_URI,
            "command": [
              CUSTOM_CONTAINER_COMMAND
            ],
            "args": [
              CUSTOM_CONTAINER_ARGS
            ]
          },
          "pythonPackageSpec": {
            "executorImageUri": PYTHON_PACKAGE_EXECUTOR_IMAGE_URI,
            "packageUris": [
              PYTHON_PACKAGE_URIS
            ],
            "pythonModule": PYTHON_MODULE,
            "args": [
              PYTHON_PACKAGE_ARGS
            ]
          }
          // End of list of possible types for union field task.
        }
      ],
      "scheduling": {
        "TIMEOUT": TIMEOUT
      }
    },
    "labels": {
      LABEL_NAME_1": LABEL_VALUE_1,
      LABEL_NAME_2": LABEL_VALUE_2
    }
  },
  "modelToUpload": {
    "displayName": "MODEL_NAME",
    "description": "MODEL_DESCRIPTION",
    "predictSchemata": {},
    "containerSpec": {
      "imageUri": "PREDICTION_IMAGE_URI"
    }
  },
  "labels": {
    LABEL_NAME_1": LABEL_VALUE_1,
    LABEL_NAME_2": LABEL_VALUE_2
  }
}

リクエストを送信するには、次のいずれかのオプションを選択します。

curl

リクエスト本文を request.json という名前のファイルに保存して、次のコマンドを実行します。

curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://LOCATION_ID-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/trainingPipelines"

PowerShell

リクエスト本文を request.json という名前のファイルに保存して、次のコマンドを実行します。

$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }

Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://LOCATION_ID-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/trainingPipelines" | Select-Object -Expand Content

レスポンスには、仕様と TRAININGPIPELINE_ID に関する情報が含まれています。

トレーニングをモニタリングする

トレーニング ログを表示する方法は次のとおりです。

  1. Google Cloud コンソールの Vertex AI セクションで、[トレーニング] ページに移動します。

    [トレーニング] ページに移動

  2. ジョブの名前をクリックして、[CUSTOM JOB] に移動します。

  3. [ログを表示] をクリックします。

インタラクティブ シェルを使用して、トレーニング パイプライアンの実行中にトレーニング コンテナを検査することもできます。

トレーニング済みのモデルを表示する

カスタム トレーニング パイプラインが完了すると、Google Cloud コンソールの [Vertex AI] セクションの [モデル] ページにトレーニング済みモデルが表示されます。

[モデル] ページに移動

次のステップ