トレーニング コードを準備する

Vertex AI でカスタム トレーニングを実行し、AutoML の代わりにクラウドで独自の ML トレーニング コードを実行します。このドキュメントでは、トレーニング コードを作成する際に考慮すべきベスト プラクティスについて説明します。

トレーニング コードの構造を選択する

まず、ML トレーニング コードの構造を決めます。Vertex AI には、次のいずれかの形式のトレーニング コードを提供できます。

  • ビルド済みコンテナで使用する Python スクリプト。Vertex AI SDK を使用して、カスタムジョブを作成します。この方法では、トレーニング アプリケーションを単一の Python スクリプトとして提供できます。

  • ビルド済みのコンテナで使用する Python トレーニング アプリケーション。ML モデルをトレーニングして Cloud Storage にエクスポートするコードを含む Python ソース ディストリビューションを作成します。このトレーニング アプリケーションは、使用するビルド済みコンテナに含まれている依存関係を使用できます。

    Vertex AI のビルド済みトレーニング用コンテナのいずれかに、トレーニングに必要なすべての依存関係が含まれている場合は、このオプションを使用します。たとえば、PyTorch、scikit-learn、TensorFlow、XGBoost を使用してトレーニングする場合は、おそらくこの方法が適しています。

    このオプションに固有のベスト プラクティスについては、Python トレーニング アプリケーションの作成に関するガイドをご覧ください。

  • カスタム コンテナ イメージ。ML モデルをトレーニングして Cloud Storage にエクスポートするコードを含む Docker コンテナ イメージを作成します。コードに必要な依存関係をコンテナ イメージに含めます。

    Vertex AI のビルド済みトレーニング用コンテナに含まれていない依存関係を使用する場合は、このオプションを使用します。たとえば、ビルド済みのコンテナでは対応していない Python ML フレームワークを使用してトレーニングする場合や、Python 以外のプログラミング言語を使用してトレーニングする場合は、この方法が適しています。

    このオプションに固有のベスト プラクティスについては、カスタム コンテナ イメージの作成に関するガイドをご覧ください。

このドキュメントの残りの部分では、両方のトレーニング コード構造に関連するベスト プラクティスについて説明します。

すべてのカスタム トレーニング コードのベスト プラクティス

Vertex AI 用のカスタム トレーニング コードを作成すると、そのコードは Google Cloud によって管理される 1 つ以上の仮想マシン(VM)インスタンスで実行されます。このセクションでは、すべてのカスタム トレーニング コードに適用されるベスト プラクティスについて説明します。

コードから Google Cloud サービスにアクセスする

以下のいくつかのセクションでは、コードから他の Google Cloud サービスにアクセスする方法について説明します。Google Cloud サービスにアクセスするには、アプリケーションのデフォルト認証情報(ADC)を使用するようにトレーニング コードを記述します。多くの Google Cloud クライアント ライブラリでは、デフォルトで ADC を使用して認証を行います。環境変数を構成する必要はありません。Vertex AI は、Vertex AI カスタムコード サービス エージェント(プロジェクトのデフォルト)またはカスタム サービス アカウント(すでに構成している場合)として認証するように ADC を自動的に構成します。

ただし、コード内で Google Cloud クライアント ライブラリを使用する場合、デフォルトでは Vertex AI が適切な Google Cloud プロジェクトに接続しないことがあります。権限エラーが発生した場合は、間違ったプロジェクトに接続している可能性があります。

この問題は、Vertex AI が Google Cloud プロジェクトでコードを直接実行しないために発生します。Vertex AI は、Google が管理する個別のプロジェクトのいずれかでコードを実行します。Vertex AI は、プロジェクトに関連するオペレーションにのみ、これらのプロジェクトを使用します。そのため、トレーニング ID または予測コードの環境からプロジェクト ID を推測しないでください。プロジェクト ID を明示的に指定する必要があります。

トレーニング コードにプロジェクト ID をハードコードしない場合、CLOUD_ML_PROJECT_ID 環境変数を参照できます。Vertex AI は、この環境変数をすべてのカスタム トレーニング コンテナに設定し、カスタム トレーニングを開始したプロジェクトのプロジェクト番号を格納します。Google Cloud の多くのツールでは、プロジェクト ID を指定する場所でプロジェクト番号を指定できます。

たとえば、Google BigQuery 用 Python クライアントを使用して同じプロジェクト内の BigQuery テーブルにアクセスする場合は、トレーニング コードのプロジェクトを推測させないでください。

暗黙的なプロジェクトの選択

from google.cloud import bigquery

client = bigquery.Client()

プロジェクトを明示的に選択するコードを使用します。

明示的なプロジェクトの選択

import os

from google.cloud import bigquery

project_number = os.environ["CLOUD_ML_PROJECT_ID"]

client = bigquery.Client(project=project_number)

この方法でコードを構成した後に権限エラーが発生した場合は、次のセクションでコードがアクセスできるリソースを確認し、トレーニング コードで使用可能な権限を調整してください。

コードがアクセスできるリソース

デフォルトでは、プロジェクトの Vertex AI カスタム コード サービス エージェント(CCSA)で使用可能なすべての Google Cloud リソースにトレーニング アプリケーションからアクセスできます。CCSA 権限を付与することで、トレーニング アプリケーションは、Vertex AI サービス エージェントに他のリソースへのアクセス権を付与するの手順に沿って特定の数の他のリソースにアクセス権を付与できます。トレーニング アプリケーションで、このページに表示されていない Google Cloud リソースへの読み取りレベルを超えるアクセス権が必要な場合は、https://www.googleapis.com/auth/cloud-platform スコープで OAuth 2.0 アクセス トークンを取得する必要があります。これは、カスタム サービス アカウントを使用してのみ実行できます。

たとえば、トレーニング コードの Cloud Storage リソースへのアクセスについて考えてみます。

デフォルトでは、Vertex AI はカスタム トレーニングを実行している Google Cloud プロジェクトの Cloud Storage バケットにアクセスできます。また、Vertex AI に他のプロジェクト内の Cloud Storage バケットに対するアクセス権を付与することや、カスタム サービス アカウントを使用して特定のジョブがアクセスできるバケットを正確にカスタマイズすることも可能です。

Cloud Storage FUSE を使用した Cloud Storage ファイルの読み取りと書き込み

すべてのカスタム トレーニング ジョブで、Vertex AI はアクセス可能な Cloud Storage バケットを各トレーニング ノードのファイル システムの /gcs/ ディレクトリにマウントします。Cloud Storage 用の Python クライアントまたは他のライブラリを使用して Cloud Storage にアクセスする代わりに、便利な方法として、ローカル ファイル システムに対して直接読み取り / 書き込みを行い、Cloud Storage のデータを読み書きすることもできます。たとえば、gs://BUCKET/data.csv からデータを読み込むには、次の Python コードを使用します。

file = open('/gcs/BUCKET/data.csv', 'r')

Vertex AI は、Cloud Storage FUSE を使用してストレージ バケットをマウントします。Cloud Storage FUSE によってマウントされたディレクトリは POSIX に準拠していません

カスタム トレーニングに使用する認証情報により、この方法でアクセスできるバケットが決まります。コードがアクセスできるリソースに関する前のセクションでは、デフォルトでアクセスできるバケットと、このアクセスをカスタマイズする方法について説明しています。

入力データを読み込む

通常、ML コードはモデルをトレーニングするためにトレーニング データを処理します。作成するのが Python トレーニング アプリケーションかカスタム コンテナ イメージかにかかわらず、トレーニング データをコードと一緒に保存しないでください。コードと一緒にデータを保存すると、プロジェクトの構成が複雑になり、別のデータセットでコードの再利用が難しくなります。また、大規模なデータセットの場合、エラーの原因となることもあります。

Vertex AI マネージド データセットからデータを読み込むことができます。また、独自のコードを記述して、BigQuery や Cloud Storage などの Vertex AI 以外のソースからデータを読み込むこともできます。

Cloud Storage からデータを読み込む際に最高のパフォーマンスを得るには、カスタム トレーニングを実行するリージョンのバケットを使用します。Cloud Storage にデータを保存する方法については、ストレージ バケットの作成オブジェクトのアップロードをご覧ください。

データを読み込むことができる Cloud Storage バケットについては、コードがアクセスできるリソースに関する前のセクションをご覧ください。

トレーニング コードで Cloud Storage からデータを読み込むには、前のセクションで説明した Cloud Storage FUSE 機能を使用するか、ADC をサポートするライブラリを使用します。認証情報をコードで明示的に指定する必要はありません。

たとえば、Cloud Storage ガイドのオブジェクトをダウンロードで説明しているように、いずれかのクライアント ライブラリを使用できます。特に、ビルド済みコンテナには Cloud Storage 用の Python クライアントが含まれています。TensorFlow の tf.io.gfile.GFile クラスは ADC もサポートしています。

大規模なデータセットを読み込む

カスタム トレーニングで使用するマシンタイプによっては、VM が大きなデータセット全体をメモリに読み込めない場合があります。

大きすぎてメモリに収まらないデータを読み取る必要がある場合は、データをストリーミングするか、段階的に読み取ります。おすすめの方法は ML フレームワークごとに異なります。たとえば、TensorFlow の tf.data.Dataset クラスは Cloud Storage から TFRecord またはテキストデータをストリーミングできます。

データ並列処理を使用して複数の VM でカスタム トレーニングを実行すると、各 VM がメモリに読み込むデータ量を削減できます。このドキュメントの分散トレーニング用のコードの作成をご覧ください。

トレーニング済み ML モデルをエクスポートする

ML コードは通常、トレーニングの最後にトレーニング済みモデルを 1 つ以上のモデル アーティファクトの形式でエクスポートします。その後、モデル アーティファクトを使用して予測を取得できます。

カスタム トレーニングが完了すると、トレーニング コードを実行した VM にはアクセスできなくなります。そのため、トレーニング コードで Vertex AI の外部にモデル アーティファクトをエクスポートする必要があります。

モデル アーティファクトは Cloud Storage バケットにエクスポートすることをおすすめします。コードがアクセスできるリソースに関する前のセクションで説明したように、Vertex AI では、カスタム トレーニングを実行する Google Cloud プロジェクトの Cloud Storage バケットにアクセスできます。ADC をサポートするライブラリを使用して、モデル アーティファクトをエクスポートします。たとえば、Keras モデルを保存する TensorFlow API は、Cloud Storage パスにアーティファクトを直接エクスポートできます。

トレーニング済みモデルを使用して Vertex AI で予測を行う場合は、予測用の事前ビルドコンテナのいずれかと互換性のある形式を使用して、モデル アーティファクトをエクスポートする必要があります。詳細については、予測に使用するモデル アーティファクトのエクスポートに関するガイドをご覧ください。

特別な Cloud Storage ディレクトリの環境変数

baseOutputDirectory API フィールドを指定すると、トレーニング コードの実行時に次の環境変数が Vertex AI によって設定されます。

これらの環境変数の値は、ハイパーパラメータ調整を使用するかどうかによってわずかに異なります。詳細については、baseOutputDirectory の API リファレンスをご覧ください。

これらの環境変数を使用すると、同じトレーニング コードを簡単に再利用できます。たとえば、baseOutputDirectory API フィールドを変更するだけで、別のデータまたは構成オプションを使用して、モデル アーティファクトとチェックポイントを別のロケーションに保存できます。ただし、不要であれば、コードで環境変数を使用する必要はありません。たとえば、チェックポイントの保存やモデル アーティファクトのエクスポートを行うロケーションを直接ハードコードすることもできます。

また、カスタム トレーニングに TrainingPipeline を使用しているときに、modelToUpload.artifactUri フィールドを指定しないと、Vertex AI が modelToUpload.artifactUriAIP_MODEL_DIR 環境変数の値を使用します(ハイパーパラメータ チューニングの場合、Vertex AI が最適なトライアルから AIP_MODEL_DIR 環境変数を使用します)。

再起動時の復元性を確保する

トレーニング コードを実行する VM はときどき再起動されます。たとえば、Google Cloud はメンテナンスのため VM を再起動する必要があります。VM が再起動すると、Vertex AI はコードの最初からもう一度実行をやり直します。

トレーニング コードが 4 時間以上実行される可能性がある場合は、再起動時に復元できるように、いくつかの処理をコードに追加します。

  • VM が再起動されても進行状況が失われないように、少なくとも 4 時間に 1 回、トレーニングの進行状況を Cloud Storage にエクスポートします。

  • トレーニング コードの先頭で、エクスポート先にトレーニングの進行状況が存在しているかどうか確認します。存在する場合は、最初からトレーニングを開始するのではなく、保存されたトレーニング状態を読み込みます。

4 時間はあくまで目安であり、ハードリミットではありません。復元力が重要な場合は、長時間の実行が想定されていない場合でも、これらの動作をコードに追加することを検討してください。

この動作を実現する方法は、使用する ML フレームワークによって異なります。たとえば、TensorFlow Keras の場合は、この目的のために ModelCheckpoint コールバックを使用する方法をご覧ください。

Vertex AI による VM の管理方法については、カスタム トレーニング サービスについてをご覧ください。

オプションのカスタム トレーニング機能のベスト プラクティス

特定のカスタム トレーニング機能を使用するには、トレーニング コードに追加の変更を加える必要があります。このセクションでは、ハイパーパラメータ チューニング、GPU、分散トレーニング、Vertex AI TensorBoard のコードのベスト プラクティスについて説明します。

自動ロギングを有効にするコードを記述する

Vertex AI SDK for Python を使用して自動ロギングを有効にし、カスタムジョブを送信するときにパラメータとパフォーマンス指標を自動的にキャプチャできます。詳細については、テスト追跡を使用してトレーニング ジョブを実行するをご覧ください。

コンテナログを返すコードを作成する

サービスまたはジョブからログを作成する場合、ログの出力先が次のいずれかであれば、Cloud Logging によってログが自動的に取得されます。

ほとんどのデベロッパーは、ログの出力先として標準出力と標準エラーを想定しています。

サポートされているロケーションに書き込まれたコンテナログは、Vertex AI カスタム トレーニング サービス、リビジョン、ロケーション、またはカスタム トレーニング ジョブに自動的に関連付けられます。これらのログに含まれる例外が Error Reporting でキャプチャされ、報告されます。

ログでの単純なテキストと構造化 JSON の使用を比較する

ログに出力するときに、単純なテキスト文字列を送信することも、シリアル化された JSON(構造化データ)の 1 行を送信することもできます。これは Cloud Logging によって取得され、解析された後、jsonPayload に配置されます。単純なテキスト メッセージは textPayload に配置されます。

構造化ログを書き込む

構造化 JSON ログは、さまざまな方法で渡すことができます。最も一般的な方法は、Python ロギング ライブラリを使用するか、print を使用して未加工の JSON を渡す方法です。

Python ロギング ライブラリ

import json
import logging
from pythonjsonlogger import jsonlogger


class CustomJsonFormatter(jsonlogger.JsonFormatter):
 """Formats log lines in JSON."""
  def process_log_record(self, log_record):
    """Modifies fields in the log_record to match Cloud Logging's expectations."""
    log_record['severity'] = log_record['levelname']
    log_record['timestampSeconds'] = int(log_record['created'])
    log_record['timestampNanos'] = int(
        (log_record['created'] % 1) * 1000 * 1000 * 1000)


    return log_record




def configure_logger():
  """Configures python logger to format logs as JSON."""
  formatter = CustomJsonFormatter(
        '%(name)s|%(levelname)s|%(message)s|%(created)f'
        '|%(lineno)d|%(pathname)s', '%Y-%m-%dT%H:%M:%S')
  root_logger = logging.getLogger()
  handler = logging.StreamHandler()
  handler.setFormatter(formatter)
  root_logger.addHandler(handler)
  root_logger.setLevel(logging.WARNING)


logging.warning("This is a warning log")

未加工の JSON

import json


def log(severity, message):
  global_extras = {"debug_key": "debug_value"}
  structured_log = {"severity": severity, "message": message, **global_extras}
  print(json.dumps(structured_log))


def main(args):
  log("DEBUG", "Debugging the application.")
  log("INFO", "Info.")
  log("WARNING", "Warning.")
  log("ERROR", "Error.")
  log("CRITICAL", "Critical.")

メッセージ内の特別な JSON フィールド

特殊フィールドのドキュメントで説明されているように、構造化ログを JSON ディクショナリとして提供すると、いくつかの特殊フィールドが jsonPayload から削除され、生成された LogEntry の対応フィールドに書き込まれます。

たとえば、JSON に severity プロパティが含まれている場合、jsonPayload から削除され、代わりにログエントリの severity として表示されます。message プロパティが存在する場合は、ログエントリのメイン表示テキストとして使用されます。

コンテナログとリクエストログを関連付ける(サービスのみ)

ログ エクスプローラでは、同じ trace で関連付けられたログを「親子」形式で表示できます。リクエスト ログエントリの左側にある三角形のアイコンをクリックすると、該当するリクエストに関連付けられたコンテナログが、リクエストログの下にネストされた状態で表示されます。

Cloud Logging クライアント ライブラリを使用しない限り、コンテナログは自動的にリクエストログに関連付けられません。クライアント ライブラリを使用せずにコンテナログをリクエストログに関連付けるには、X-Cloud-Trace-Context ヘッダーから抽出されたトレース ID が設定された logging.googleapis.com/trace フィールドを含む構造化 JSON ログの行を使用します。

ログを表示する

Google Cloud コンソールでコンテナログを表示する手順は次のとおりです。

  1. Google Cloud コンソールで、[Vertex AI カスタムジョブ] ページに移動します。

    [カスタムジョブ] に移動

  2. ログを表示するカスタムジョブの名前をクリックします。

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

ハイパーパラメータ チューニングのコードを作成する

Vertex AI は、ML トレーニング コードでハイパーパラメータ調整を行うことができます。詳しくは、Vertex AI でのハイパーパラメータ調整の仕組みHyperparameterTuningJob リソースの構成方法をご覧ください。

ハイパーパラメータ調整を使用する場合は、トレーニング コードで次の処理を行う必要があります。

  • 調整するハイパーパラメータを表すコマンドライン引数を解析し、解析された値を使用してトレーニング用のハイパーパラメータを設定します。

  • ハイパーパラメータ調整指標を Vertex AI に断続的に報告します。

コマンドライン引数を解析する

ハイパーパラメータ調整の場合、Vertex AI はトレーニングごとに異なる方法でコマンドライン コードを実行します。トレーニング コードは、これらのコマンドライン引数を解析し、トレーニングのハイパーパラメータとして使用する必要があります。たとえば、オプティマイザーの学習率を調整するには、--learning_rate というコマンドライン引数を解析します。詳しくは、Vertex AI が提供するコマンドライン引数を構成する方法をご覧ください。

コマンドラインの引数は、Python の argparse ライブラリで解析することをおすすめします。

ハイパーパラメータ調整指標を報告する

トレーニング コードは、最適化を試みているハイパーパラメータ指標を Vertex AI に断続的に報告する必要があります。たとえば、モデルの精度を最大化したい場合は、すべてのトレーニング エポックの最後にこの指標を報告することをおすすめします。Vertex AI は、この情報を使用して、次回のトレーニング トライアルに使用するハイパーパラメータを決定します。詳しくは、ハイパーパラメータ調整指標の選択と指定をご覧ください。

cloudml-hypertune Python ライブラリを使用して、ハイパーパラメータ チューニング指標を報告します。このライブラリは、トレーニング用にビルド済みのすべてのコンテナに含まれています。また、pip を使用してカスタム コンテナにインストールできます。

このライブラリをインストールして使用する方法については、cloudml-hypertune GitHub リポジトリまたは Vertex AI: ハイパーパラメータ チューニングの Codelab をご覧ください。

GPU のコードを作成する

グラフィック プロセッシング ユニット(GPU)を備えた VM を選択して、カスタム トレーニング コードを実行できます。詳しくは、GPU 対応の VM を使用する場合のカスタム トレーニングの構成をご覧ください。

GPU を使用してトレーニングする場合は、トレーニング コードで GPU を利用できることを確認してください。使用する ML フレームワークによっては、コードの変更が必要になる場合があります。たとえば、TensorFlow Keras を使用している場合は、複数の GPU を使用する場合のみコードを調整します。一部の ML フレームワークでは GPU をまったく使用できません。

また、コンテナで GPU がサポートされていることを確認します。GPU 対応のトレーニング用ビルド済みコンテナを選択するか、カスタム コンテナで NVIDIA CUDA ToolkitNVIDIA cuDNN を使用します。これを行うには、nvidia/cuda Docker リポジトリのベースイメージを使用します。また、Deep Learning Containers インスタンスをベースイメージとして使用することもできます。

分散トレーニング用のコードを作成する

大規模なデータセットでトレーニングを行うには、Vertex AI が管理する分散クラスタ内の複数の VM でコードを実行します。詳しくは、トレーニング用に複数の VM を構成するをご覧ください。

TensorFlowPyTorch などの一部の ML フレームワークでは、複数のマシンで同一のトレーニング コードを実行できます。これにより、マシンごとに環境変数に基づいて作業の分割方法が自動的に調整されます。Vertex AI で、ML フレームワークでこの処理が行われるように環境変数が設定されているかどうか確認します。

また、複数のワーカープールごとに別のコンテナを実行することもできます。ワーカープールとは、同じコンピューティング オプションとコンテナを使用するように構成した VM のグループです。この場合、引き続き Vertex AI によって設定される環境変数を利用して、VM 間の通信を調整することも可能です。各ワーカープールのトレーニング コードをカスタマイズして、任意のタスクを実行できます。その方法は、使用する ML フレームワークによって異なります。

Vertex AI TensorBoard を使用してカスタム トレーニング テストの追跡と可視化を行う

Vertex AI TensorBoardTensorBoard のマネージド バージョンで、機械学習テストを可視化するための Google オープンソース プロジェクトです。Vertex AI TensorBoard を使用すると、ML テストの追跡、可視化、比較を行い、それをチームと共有できます。また、Cloud Profiler でパフォーマンスのボトルネックを特定して修正し、モデルをより迅速かつ低コストでトレーニングすることもできます。

カスタム トレーニングで Vertex AI TensorBoard を使用するには、次の操作を行う必要があります。

  • プロジェクトにテストを保存する Vertex AI TensorBoard インスタンスを作成します(TensorBoard インスタンスを作成するをご覧ください)。

  • 適切な権限を持つカスタム トレーニング ジョブを実行するようにサービス アカウントを構成します。

  • カスタム トレーニング コードを調整して、TensorBoard 互換ログを Cloud Storage に書き出します(トレーニング スクリプトの変更点をご覧ください)。

手順ガイドについては、カスタム トレーニングでの Vertex AI TensorBoard の使用をご覧ください。

次のステップ