カスタム トレーニング ジョブを作成する

カスタム トレーニング ジョブは、Vertex AI でカスタム機械学習(ML)トレーニング コードを実行するための基本的な方法です。

ジョブを送信する前に

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

カスタムジョブの内容

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

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

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

分散トレーニングのカスタム トレーニング ジョブを構成するには、複数のワーカープールを指定します。

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

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

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

カスタムジョブを作成する

カスタムジョブを作成するには:

Console

Google Cloud Console では、CustomJob リソースを直接作成することはできません。ただし、CustomJob を作成する TrainingPipeline リソースを作成することは可能です。

次の手順では、CustomJob を作成する TrainingPipeline を作成し、他の処理は行いません。追加の TrainingPipeline 機能(マネージド データセットを使用したトレーニングやトレーニングの最後での Model リソースの作成)を使用する場合は、トレーニング パイプラインの作成をご覧ください。

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

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

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

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

    1. [データセット] プルダウン リストで、[管理されているデータセットなし] を選択します。

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

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

  4. [モデルの詳細] ステップで、モデルに任意の名前(MODEL_NAME)を入力します。[続行] をクリックします。

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

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

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

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

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

    4. [引数] フィールドで、Vertex AI がトレーニング コードの実行開始時に使用する引数を指定することもできます。これらの引数の動作は、使用しているコンテナの種類によって異なります。

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

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

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

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

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

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

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

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

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

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

  8. [予測コンテナ] ステップで、[No prediction container] を選択します。

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

gcloud

次の例では、gcloud beta ai custom-jobs create コマンドを使用しています。

ビルド済みのコンテナで使用する Python トレーニング アプリケーションを作成したか、カスタム コンテナを使用しているかに応じて、次のいずれかのコマンドを実行します。

ビルド済みコンテナ

gcloud beta ai custom-jobs create \
  --region=LOCATION \
  --display-name=JOB_NAME \
  --python-package-uris=PYTHON_PACKAGE_URIS \
  --worker-pool-spec=machine-type=MACHINE_TYPE,replica-count=REPLICA_COUNT,executor-image-uri=PYTHON_PACKAGE_EXECUTOR_IMAGE_URI,python-module=PYTHON_MODULE

次のように置き換えます。

  • LOCATION: コンテナまたは Python パッケージを実行するリージョン。
  • JOB_NAME: 必須。CustomJob の表示名。
  • PYTHON_PACKAGE_URIS: トレーニング プログラムとその依存パッケージである Python パッケージ ファイルを指定する Cloud Storage URI のカンマ区切りのリスト。パッケージ URI の最大数は 100 です。
  • MACHINE_TYPE: マシンのタイプ。トレーニングで使用可能なマシンタイプをご覧ください。
  • REPLICA_COUNT: 使用するワーカー レプリカの数。最初のワーカープールは、ほとんどの場合、1 に設定します。
  • PYTHON_PACKAGE_EXECUTOR_IMAGE_URI: 提供された Python パッケージを実行するコンテナ イメージの URI。トレーニングに使用可能なビルド済みのコンテナをご覧ください。
  • PYTHON_MODULE: パッケージのインストール後に実行する Python モジュール名。

カスタム コンテナ

gcloud beta ai custom-jobs create \
  --region=LOCATION \
  --display-name=JOB_NAME \
  --worker-pool-spec=machine-type=MACHINE_TYPE,replica-count=REPLICA_COUNT,container-image-uri=CUSTOM_CONTAINER_IMAGE_URI

次のように置き換えます。

  • LOCATION: コンテナまたは Python パッケージを実行するリージョン。
  • JOB_NAME: 必須。CustomJob の表示名。
  • MACHINE_TYPE: マシンのタイプ。トレーニングで使用可能なマシンタイプをご覧ください。
  • REPLICA_COUNT: 使用するワーカー レプリカの数。最初のワーカープールは、ほとんどの場合、1 に設定します。
  • CUSTOM_CONTAINER_IMAGE_URI: 各ワーカー レプリカで実行される Artifact Registry、Container Registry、Docker Hub 内のコンテナ イメージの URI。

ローカルコードに基づくカスタム コンテナ

ローカル コンピュータにトレーニング コードがある場合、単一のコマンドで次のことを行うことができます。

  • コードに基づいてカスタム Docker イメージをビルドします。
  • イメージを Container Registry に push します。
  • 画像に応じて CustomJob を開始します。

結果は、他のカスタム コンテナを使用した CustomJob を作成する場合と似ています。ワークフローに役立つ場合は、このバージョンのコマンドを使用できます。

始める前に

このバージョンのコマンドでは、Docker イメージをビルドして push するため、ローカル コンピュータで次の構成を行う必要があります。

  1. Docker Engine をインストールします。

  2. Linux を使用している場合は、sudo なしで実行できるように Docker を構成します。

  3. Container Registry API を有効にします。

    API を有効にする

  4. Docker イメージを Container Registry に push できるように Docker の認証を構成します

    gcloud auth configure-docker
    

Docker イメージをビルドして push し、CustomJob を作成する

次のコマンドは、ビルド済みのトレーニング コンテナ イメージとローカルの Python コードに基づいて Docker イメージをビルドし、Container Registry に push して CustomJob を作成します。

gcloud beta ai custom-jobs create \
  --region=LOCATION \
  --display-name=JOB_NAME \
  --worker-pool-spec=machine-type=MACHINE_TYPE,replica-count=REPLICA_COUNT,executor-image-uri=PYTHON_PACKAGE_EXECUTOR_IMAGE_URI,local-package-path=WORKING_DIRECTORY,script=SCRIPT_PATH

次のように置き換えます。

  • LOCATION: コンテナまたは Python パッケージを実行するリージョン。

  • JOB_NAME: 必須。CustomJob の表示名。

  • MACHINE_TYPE: マシンのタイプ。トレーニングで使用可能なマシンタイプをご覧ください。

  • REPLICA_COUNT: 使用するワーカー レプリカの数。最初のワーカープールは、ほとんどの場合、1 に設定します。

  • PYTHON_PACKAGE_EXECUTOR_IMAGE_URI: 提供された Python パッケージを実行するコンテナ イメージの URI。トレーニングに使用可能なビルド済みのコンテナをご覧ください。

    このイメージは、このコマンドでビルドする新しい Docker イメージのベースイメージとして機能します。

  • WORKING_DIRECTORY: トレーニング コードを実行するエントリ ポイント スクリプトを含む、ローカル ファイル システム内のディレクトリ(次のリストを参照)。

    スクリプトの親ディレクトリを使用することも、上位レベルのディレクトリを使用することもできます。完全修飾された Python モジュール名を指定するには、上位のディレクトリを使用することをおすすめします(次のリストを参照)。requirements.txt ファイルまたは setup.py ファイルを含む場合は、上位のディレクトリも使用できます。これは、コンテナに追加の依存関係をインストールする場合に必要です。この機能は、gcloud beta ai custom-jobs local-run コマンドの対応する機能に類似しています。ただし、上位のディレクトリを指定した場合でも、このコマンドはエントリ ポイント スクリプトの親ディレクトリを Docker イメージにコピーします。

  • SCRIPT_PATH: ローカル ファイル システム上の WORKING_DIRECTORY の相対パス。トレーニング コードのエントリ ポイントとなるスクリプトへの相対パスになります。これは、Python スクリプト(.py で終わるもの)または Bash スクリプトです。

    たとえば、/hello-world/trainer/task.py を実行し、WORKING_DIRECTORY/hello-world の場合は、この値に trainer/task.py を使用します。

    script ではなく python-module を使用する

    必要に応じて、script=SCRIPT_PATHpython-module=PYTHON_MODULE に置き換えて、トレーニングのエントリ ポイントとして実行する Python モジュールの名前を WORKING_DIRECTORY に指定します。たとえば、script=trainer/task.py の代わりに python-module=trainer.task を指定できます。

    この場合、作成された Docker コンテナはスクリプトではなく、モジュールとしてコードを読み込みます。エントリ ポイント スクリプトが WORKING_DIRECTORY 内の他の Python モジュールをインポートする場合は、このオプションを使用できます。

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

分散トレーニングを行う場合は、ワーカープールごとに --worker-pool-spec フラグを複数回指定します。たとえば、次の例では、前述の例を 2 番目のワーカープールを使用するように変更しています。

ビルド済みコンテナ

gcloud beta ai custom-jobs create \
  --region=LOCATION \
  --display-name=JOB_NAME \
  --python-package-uris=PYTHON_PACKAGE_URIS \
  --worker-pool-spec=machine-type=MACHINE_TYPE,replica-count=REPLICA_COUNT,executor-image-uri=PYTHON_PACKAGE_EXECUTOR_IMAGE_URI,python-module=PYTHON_MODULE \
  --worker-pool-spec=machine-type=SECOND_POOL_MACHINE_TYPE,replica-count=SECOND_POOL_REPLICA_COUNT,executor-image-uri=SECOND_POOL_PYTHON_PACKAGE_EXECUTOR_IMAGE_URI,python-module=SECOND_POOL_PYTHON_MODULE

カスタム コンテナ

gcloud beta ai custom-jobs create \
  --region=LOCATION \
  --display-name=JOB_NAME \
  --worker-pool-spec=machine-type=MACHINE_TYPE,replica-count=REPLICA_COUNT,container-image-uri=CUSTOM_CONTAINER_IMAGE_URI \
  --worker-pool-spec=machine-type=SECOND_POOL_MACHINE_TYPE,replica-count=SECOND_POOL_REPLICA_COUNT,container-image-uri=SECOND_POOL_CUSTOM_CONTAINER_IMAGE_URI

ローカルコードに基づくカスタム コンテナ

コマンドで local-package-path=WORKING_DIRECTORY を使用する場合は、ワーカープールを 1 つだけ構成する必要があります。分散トレーニングは使用できません。

詳細構成

上の例では使用できない構成オプションを指定する場合は、--config フラグを使用して、CustomJobSpec のフィールドを含むローカル環境で config.yaml ファイルへのパスを指定します。次に例を示します。

gcloud beta ai custom-jobs create \
  --region=LOCATION \
  --display-name=JOB_NAME \
  --config=config.yaml

config.yaml ファイルの例をご覧ください。

REST とコマンドライン

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

  • LOCATION: コンテナまたは Python パッケージを実行するリージョン。
  • PROJECT_ID: プロジェクト ID またはプロジェクト番号。
  • JOB_NAME: 必須。CustomJob の表示名。
  • カスタム トレーニング ジョブを定義します。
    • MACHINE_TYPE: マシンのタイプ。トレーニングで使用可能なマシンタイプをご覧ください。
    • ACCELERATOR_TYPE: 省略可。ジョブに接続するアクセラレータのタイプ。
    • ACCELERATOR_COUNT: 省略可。ジョブに接続するアクセラレータの数。
    • DISK_TYPE: 省略可。ジョブに使用するブートディスクの種類。pd-standard(デフォルト)または pd-ssd のいずれか。ディスクタイプの詳細。
    • DISK_SIZE: 省略可。ジョブに使用するブートディスクのサイズ(GB 単位)。デフォルト値は 100 です。
    • REPLICA_COUNT: 使用するワーカー レプリカの数。最初のワーカープールは、ほとんどの場合、1 に設定します。
    • トレーニング アプリケーションがカスタム コンテナで実行される場合は、次のように指定します。
      • CUSTOM_CONTAINER_IMAGE_URI: 各ワーカー レプリカで実行される Artifact Registry、Container 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 のカンマ区切りのリスト。パッケージ URI の最大数は 100 です。
      • PYTHON_MODULE: パッケージのインストール後に実行する Python モジュール名。
      • PYTHON_PACKAGE_ARGS: 省略可。Python モジュールに渡すコマンドライン引数。
    • ジョブ スケジュール オプションをご覧ください。
    • TIMEOUT: 省略可。ジョブの最大実行時間。
  • このカスタムジョブに適用するラベルの LABEL_NAMELABEL_VALUE を指定します。

HTTP メソッドと URL:

POST https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/customJobs

JSON 本文のリクエスト:

{
  "displayName": "JOB_NAME",
  "jobSpec": {
    "workerPoolSpecs": [
      {
        "machineSpec": {
          "machineType": MACHINE_TYPE,
          "acceleratorType": ACCELERATOR_TYPE,
          "acceleratorCount": ACCELERATOR_COUNT
        },
        "replicaCount": REPLICA_COUNT,
        "diskSpec": {
          "bootDiskType": DISK_TYPE,
          "bootDiskSizeGb": DISK_SIZE
        },

        // 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.
      }
      // Specify one workerPoolSpec for single replica training, or multiple workerPoolSpecs
      // for distributed training.
    ],
    "scheduling": {
      "timeout": TIMEOUT
    }
  },
  "labels": {
    LABEL_NAME_1": LABEL_VALUE_1,
    LABEL_NAME_2": LABEL_VALUE_2
  }
}

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

curl

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

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

PowerShell

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

$cred = gcloud auth application-default 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-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/customJobs" | Select-Object -Expand Content

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

Node.js

/**
 * TODO(developer): Uncomment these variables before running the sample.\
 * (Not necessary if passing values as arguments)
 */

// const customJobDisplayName = 'YOUR_CUSTOM_JOB_DISPLAY_NAME';
// const containerImageUri = 'YOUR_CONTAINER_IMAGE_URI';
// const project = 'YOUR_PROJECT_ID';
// const location = 'YOUR_PROJECT_LOCATION';

// Imports the Google Cloud Job Service Client library
const {JobServiceClient} = require('@google-cloud/aiplatform');

// Specifies the location of the api endpoint
const clientOptions = {
  apiEndpoint: 'us-central1-aiplatform.googleapis.com',
};

// Instantiates a client
const jobServiceClient = new JobServiceClient(clientOptions);

async function createCustomJob() {
  // Configure the parent resource
  const parent = `projects/${project}/locations/${location}`;
  const customJob = {
    displayName: customJobDisplayName,
    jobSpec: {
      workerPoolSpecs: [
        {
          machineSpec: {
            machineType: 'n1-standard-4',
            acceleratorType: 'NVIDIA_TESLA_K80',
            acceleratorCount: 1,
          },
          replicaCount: 1,
          containerSpec: {
            imageUri: containerImageUri,
            command: [],
            args: [],
          },
        },
      ],
    },
  };
  const request = {parent, customJob};

  // Create custom job request
  const [response] = await jobServiceClient.createCustomJob(request);

  console.log('Create custom job response');
  console.log(`${JSON.stringify(response)}`);
}
createCustomJob();

Python

この例では、Python 用 Vertex SDK を使用します。次のコードサンプルを実行する前に、認証を設定する必要があります。

from google.cloud import aiplatform

def create_custom_job_sample(
    project: str,
    display_name: str,
    container_image_uri: str,
    location: str = "us-central1",
    api_endpoint: str = "us-central1-aiplatform.googleapis.com",
):
    # The AI Platform services require regional API endpoints.
    client_options = {"api_endpoint": api_endpoint}
    # Initialize client that will be used to create and send requests.
    # This client only needs to be created once, and can be reused for multiple requests.
    client = aiplatform.gapic.JobServiceClient(client_options=client_options)
    custom_job = {
        "display_name": display_name,
        "job_spec": {
            "worker_pool_specs": [
                {
                    "machine_spec": {
                        "machine_type": "n1-standard-4",
                        "accelerator_type": aiplatform.gapic.AcceleratorType.NVIDIA_TESLA_K80,
                        "accelerator_count": 1,
                    },
                    "replica_count": 1,
                    "container_spec": {
                        "image_uri": container_image_uri,
                        "command": [],
                        "args": [],
                    },
                }
            ]
        },
    }
    parent = f"projects/{project}/locations/{location}"
    response = client.create_custom_job(parent=parent, custom_job=custom_job)
    print("response:", response)

次のステップ

  • Vertex AI へのモデルのインポートで、Vertex AI でカスタム トレーニング アプリケーションを実行するカスタム トレーニング ジョブの作成方法について確認する。