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 によって設定されます。
AIP_MODEL_DIR
: モデル アーティファクトの保存を目的としたディレクトリの Cloud Storage URI。AIP_CHECKPOINT_DIR
: チェックポイントの保存を目的としたディレクトリの Cloud Storage URI。AIP_TENSORBOARD_LOG_DIR
: TensorBoard ログの保存を目的としたディレクトリの Cloud Storage URIカスタム トレーニングで Vertex AI TensorBoard を使用するを確認する。
これらの環境変数の値は、ハイパーパラメータ調整を使用するかどうかによってわずかに異なります。詳細については、baseOutputDirectory
の API リファレンスをご覧ください。
これらの環境変数を使用すると、同じトレーニング コードを簡単に再利用できます。たとえば、baseOutputDirectory
API フィールドを変更するだけで、別のデータまたは構成オプションを使用して、モデル アーティファクトとチェックポイントを別のロケーションに保存できます。ただし、不要であれば、コードで環境変数を使用する必要はありません。たとえば、チェックポイントの保存やモデル アーティファクトのエクスポートを行うロケーションを直接ハードコードすることもできます。
また、カスタム トレーニングに TrainingPipeline
を使用しているときに、modelToUpload.artifactUri
フィールドを指定しないと、Vertex AI が modelToUpload.artifactUri
に AIP_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 によってログが自動的に取得されます。
- 標準出力(
stdout
)または標準エラー(stderr
)ストリーム output*.log
の命名規則に従う/var/log-storage/
のログファイル。- syslog(
/dev/log
) - 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 コンソールでコンテナログを表示する手順は次のとおりです。
Google Cloud コンソールで、[Vertex AI カスタムジョブ] ページに移動します。
ログを表示するカスタムジョブの名前をクリックします。
[ログを表示] をクリックします。
ハイパーパラメータ チューニングのコードを作成する
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 Toolkit と NVIDIA cuDNN を使用します。これを行うには、nvidia/cuda
Docker リポジトリのベースイメージを使用します。また、Deep Learning Containers インスタンスをベースイメージとして使用することもできます。
分散トレーニング用のコードを作成する
大規模なデータセットでトレーニングを行うには、Vertex AI が管理する分散クラスタ内の複数の VM でコードを実行します。詳しくは、トレーニング用に複数の VM を構成するをご覧ください。
TensorFlow や PyTorch などの一部の ML フレームワークでは、複数のマシンで同一のトレーニング コードを実行できます。これにより、マシンごとに環境変数に基づいて作業の分割方法が自動的に調整されます。Vertex AI で、ML フレームワークでこの処理が行われるように環境変数が設定されているかどうか確認します。
また、複数のワーカープールごとに別のコンテナを実行することもできます。ワーカープールとは、同じコンピューティング オプションとコンテナを使用するように構成した VM のグループです。この場合、引き続き Vertex AI によって設定される環境変数を利用して、VM 間の通信を調整することも可能です。各ワーカープールのトレーニング コードをカスタマイズして、任意のタスクを実行できます。その方法は、使用する ML フレームワークによって異なります。
Vertex AI TensorBoard を使用してカスタム トレーニング テストの追跡と可視化を行う
Vertex AI TensorBoard は TensorBoard のマネージド バージョンで、機械学習テストを可視化するための Google オープンソース プロジェクトです。Vertex AI TensorBoard を使用すると、ML テストの追跡、可視化、比較を行い、それをチームと共有できます。また、Cloud Profiler でパフォーマンスのボトルネックを特定して修正し、モデルをより迅速かつ低コストでトレーニングすることもできます。
カスタム トレーニングで Vertex AI TensorBoard を使用するには、次の操作を行う必要があります。
プロジェクトにテストを保存する Vertex AI TensorBoard インスタンスを作成します(TensorBoard インスタンスを作成するをご覧ください)。
適切な権限を持つカスタム トレーニング ジョブを実行するようにサービス アカウントを構成します。
カスタム トレーニング コードを調整して、TensorBoard 互換ログを Cloud Storage に書き出します(トレーニング スクリプトの変更点をご覧ください)。
手順ガイドについては、カスタム トレーニングでの Vertex AI TensorBoard の使用をご覧ください。
次のステップ
ビルド済みのコンテナで使用する Python トレーニング アプリケーションを作成する。または、カスタム コンテナ イメージの作成方法を確認する。
カスタム トレーニングを実行する方法がわからない場合は、カスタム トレーニングと AutoML の比較をご覧ください。