トレーニング コードの要件

Vertex AI でカスタム トレーニングを実行し、AutoML の代わりにクラウドで独自の機械学習(ML)トレーニング コードを実行します。このドキュメントでは、トレーニング コードを記述する際に考慮すべき要件について説明します。

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

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

  • ビルド済みのコンテナで使用する 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 カスタム コード サービス エージェントで使用可能なすべてのリソースにアクセスできます。トレーニング コードがアクセスするリソース数に応じて、Vertex AI を構成することもできます。

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

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

BigQuery テーブルと他の Google Cloud リソースにも、同様のアクセスルールと手法が適用されます。通常、トレーニング コードで使用可能なリソースは次のいずれかの方法で変更できます。

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

BigQuery や Cloud Storage など、Vertex AI 以外のソースからデータを読み込むようにコードを記述することをおすすめします。Vertex AI マネージド データセットを使用することもできますが、この方法はおすすめしません。マネージド データセットは AutoML モデルに適しています。

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 は、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 テストの追跡、可視化、比較を行い、それをチームと共有できます。

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

  • テストを保存する Vertex AI TensorBoard インスタンスをプロジェクト内に作成します。

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

  • カスタム トレーニング コードを調整して、TensorBoard 互換ログを Cloud Storage に書き出します。

これらの要件を満たすための詳しい手順については、カスタム トレーニングでの Vertex AI TensorBoard の使用をご覧ください。

次のステップ