このページでは、インタラクティブ シェルを使用して、トレーニング コードが実行されているコンテナを検査する方法について説明します。ファイル システムを参照して、Vertex AI で実行されているビルド済みコンテナまたはカスタム コンテナごとにデバッグ ユーティリティを実行できます。
インタラクティブ シェルを使用してトレーニング コンテナを検査すると、トレーニング コードや Vertex AI の構成の問題をデバッグできます。たとえば、インタラクティブ シェルを使用すると、次のことができます。
- トレースツールとプロファイリング ツールを実行する
- GPU の使用状況を分析する
- コンテナで使用できる Google Cloud 権限を確認する。
Cloud Profiler を使用して、カスタム トレーニング ジョブのモデル トレーニングのパフォーマンスをデバッグすることもできます。詳細については、Profiler を使用してモデルのトレーニング パフォーマンスのプロファイルを作成するをご覧ください。
始める前に
CustomJob リソース、HyperparameterTuningJob リソース、またはカスタム TrainingPipeline リソースを使用してカスタム トレーニングを行う場合は、インタラクティブ シェルを使用できます。トレーニング コードを準備して任意のカスタム トレーニング リソースを構成する場合は、次の要件を満たしていることを確認してください。
- トレーニング コンテナに - bashがインストールされている。- すべてのビルド済みトレーニング コンテナに - bashがインストールされている。トレーニング用のカスタム コンテナを作成する場合は、- bashを含むベースコンテナを使用するか、- bashを Dockerfile にインストールします。
- インタラクティブ シェルをサポートするリージョンでカスタム トレーニングを行う。 
- インタラクティブ シェルにアクセスするすべてのユーザーに、カスタム トレーニングを実行している Google Cloud プロジェクトに対する次の権限が付与されていることを確認する。 - aiplatform.customJobs.create
- aiplatform.customJobs.get
- aiplatform.customJobs.cancel
 - 自分でカスタム トレーニングを開始する場合、これらの権限がすでに付与されているため、インタラクティブ シェルにアクセスできます。ただし、インタラクティブ シェルを使用して、組織内の他のユーザーが作成したカスタム トレーニングのリソースを検査する場合は、これらの権限の取得が必要になることがあります。 - これらの権限を取得するには、組織の管理者に Vertex AI ユーザーロール( - roles/aiplatform.user)を付与するように依頼する方法があります。
高度なケースの要件
特定の高度な機能を使用する場合は、次の追加要件を満たす必要があります。
- カスタム トレーニング リソースにカスタム サービス アカウントを関連付ける場合は、インタラクティブ シェルにアクセスするユーザーに、関連するサービス アカウントに対する - iam.serviceAccounts.actAs権限があることを確認します。- カスタム サービス アカウントのガイドには、サービス アカウントを関連付けるにはこの権限が必要であることが記載されています。この権限は、カスタム トレーニングでインタラクティブ シェルを表示する場合にも必要です。 - たとえば、サービス アカウントが設定された - CustomJobを作成するには、サービス アカウントに対する- iam.serviceAccounts.actAs権限が必要です。同僚の 1 人がこの- CustomJobのインタラクティブ シェルを表示するには、そのユーザーにも同じ- iam.serviceAccounts.actAs権限が付与されている必要があります。
- Vertex AI で VPC Service Controls を使用するようにプロジェクトを構成している場合は、次の制限も考慮する必要があります。 - カスタム トレーニングにプライベート IP は使用できません。VPC-SC と VPC ピアリングが必要な場合、インタラクティブ シェルを使用するには追加の設定が必要です。VPC-SC と VPC ピアリングを使用した Ray ダッシュボードとインタラクティブ シェルの手順に沿って、ユーザー プロジェクトで VPC-SC と VPC ピアリングを使用してインタラクティブ シェルの設定を構成します。 
- インタラクティブ シェル内から、サービス境界外の公共のインターネットやGoogle Cloud リソースにアクセスすることはできません。 
- インタラクティブ シェルへのアクセスを保護するには、 - aiplatform.googleapis.comに加えて、サービス境界内で制限されているサービスとして- notebooks.googleapis.comを追加する必要があります。- notebooks.googleapis.comではなく- aiplatform.googleapis.comのみを制限すると、ユーザーはサービス境界外のマシンからインタラクティブ シェルにアクセスできるため、VPC Service Controls を使用するセキュリティ上のメリットが少なくなります。
 
インタラクティブ シェルを有効にする
カスタム トレーニング リソースにインタラクティブ シェルを有効にするには、CustomJob、HyperparameterTuningJob、またはカスタム TrainingPipeline を作成するときに、enableWebAccess API フィールドを true に設定します。
以下では、この操作をいくつかの異なるツールで行う方法を説明します。
コンソール
ガイドに沿って、 Google Cloud コンソールでカスタム TrainingPipeline を作成します。[新しいモデルのトレーニング] ペインで、[モデルの詳細] ステップになるまで次の操作を行います。
- [詳細オプション] をクリックします。 
- [Enable training debugging] チェックボックスをオンにします。 
次に、[新しいモデルのトレーニング] ワークフローの残りの作業を完了します。
gcloud
- CustomJobを作成する場合は、- gcloud ai custom-jobs createコマンドに- --enable-web-accessフラグを指定して実行します。
- HyperparameterTuningJobを作成する場合は、- gcloud ai hp-tuning-jobs createコマンドに- --enable-web-accessフラグを指定して実行します。
これらのコマンドの使用方法については、CustomJob の作成に関するガイドと HyperparameterTuningJob の作成に関するガイドをご覧ください。
API
以下に、カスタム トレーニング リソースの種類ごとに REST リクエスト本文で enableWebAccess フィールドを指定する場所を示します。
CustomJob
次の例は、projects.locations.customJobs.create API メソッドのリクエスト本文の一部を示したものです。
{
  ...
  "jobSpec": {
    ...
    "enableWebAccess": true
  }
  ...
}
CustomJob を作成する API リクエストを送信する例については、カスタム トレーニング ジョブの作成をご覧ください。
HyperparameterTuningJob
次の例は、projects.locations.hyperparameterTuningJobs.create API メソッドのリクエスト本文の一部を示したものです。
{
  ...
  "trialJobSpec": {
    ...
    "enableWebAccess": true
  }
  ...
}
API リクエストを送信して HyperparameterTuningJob を作成する例については、ハイパーパラメータ調整の使用をご覧ください。
カスタム TrainingPipeline
次の例は、projects.locations.trainingPipelines.create API メソッドのリクエスト本文の一部を示したものです。ハイパーパラメータ調整を使用しているかどうかに応じてタブを選択してください。
ハイパーパラメータ調整なし
{
  ...
  "trainingTaskInputs": {
    ...
    "enableWebAccess": true
  }
  ...
}
ハイパーパラメータ調整あり
{
  ...
  "trainingTaskInputs": {
    ...
    "trialJobSpec": {
      ...
      "enableWebAccess": true
    }
  }
  ...
}
API リクエストを送信してカスタム TrainingPipeline を作成する例については、トレーニング パイプラインの作成をご覧ください。
Python
Vertex AI SDK for Python のインストールまたは更新の方法については、Vertex AI SDK for Python をインストールするをご覧ください。 詳細については、 Python API リファレンス ドキュメントをご覧ください。
次のいずれかのメソッドを実行する場合は、enable_web_access パラメータを true に設定します。
- CustomJobを作成する場合は、- CustomJob.runメソッドを使用します。
- HyperparameterTuningJobを作成する場合は、- HyperparameterTuningJob.runメソッドを使用します。
- カスタム - TrainingPipelineを作成する場合は、次のいずれかのメソッドを使用します。
インタラクティブ シェルに移動する
前のセクションのガイダンスに従ってカスタム トレーニングを開始すると、Vertex AI は、インタラクティブ シェルへのアクセスに使用できる URI を生成します。Vertex AI は、ジョブのトレーニング ノードごとに一意の URI を生成します。
次のいずれかの方法でインタラクティブ シェルを開くことができます。
- Google Cloud コンソールでリンクをクリックする
- Vertex AI API を使用してシェルのウェブアクセス URI を取得する
Google Cloud コンソールから移動する
- Google Cloud コンソールの [Vertex AI] セクションで、次のいずれかのページに移動します。 - ハイパーパラメータ調整を使用していない場合は、[CUSTOM JOBS] ページに移動します。 
- ハイパーパラメータ チューニングを使用している場合は、[ハイパーパラメータ チューニング ジョブ] ページに移動します。 
 
- カスタム トレーニング リソースの名前をクリックします。 - カスタム トレーニング用に - TrainingPipelineを作成した場合は、- TrainingPipelineによって作成された- CustomJobまたは- HyperparameterTuningJobの名前をクリックします。たとえば、パイプラインの名前が- PIPELINE_NAMEの場合、- PIPELINE_NAME-custom-jobまたは- PIPELINE_NAME-hyperparameter-tuning-jobになります。
- ジョブのページで、[ウェブ ターミナルを起動] をクリックします。ジョブで複数のノードを使用している場合は、インタラクティブ シェルを追加するノードの横にある [ウェブ ターミナルを起動] をクリックします。 - インタラクティブ シェルには、ジョブの実行中にのみアクセスできます。[ウェブ ターミナルを起動] が表示されない場合は、Vertex AI がまだジョブの実行を開始していないか、ジョブがすでに完了または失敗している可能性があります。ジョブのステータスが - Queuedまたは- Pendingの場合は、1 分ほど待ち、ページを更新してみてください。- ハイパーパラメータ調整を使用している場合は、トライアルごとに個別の [ウェブ ターミナルを起動] リンクがあります。 
API からウェブアクセス URI を取得する
projects.locations.customJobs.get API メソッドまたは projects.locations.hyperparameterTuningJobs.get API メソッドを使用して、インタラクティブ シェルへのアクセスに使用できる URI を確認します。
使用しているカスタム トレーニング リソースの種類に応じて次のいずれかのタブを選択してください。webAccessUris API フィールドを見つける方法を確認できます。このフィールドには、ジョブの各ノードのインタラクティブ シェル URI が格納されています。
CustomJob
以下のタブでは、projects.locations.customJobs.get リクエストの送信方法を説明します。
gcloud
gcloud ai custom-jobs describe コマンドを実行します。
gcloud ai custom-jobs describe JOB_ID \
  --region=LOCATION \
  --format=json
次のように置き換えます。
- JOB_ID: ジョブの数値 ID。この ID は、ジョブの - nameフィールドの最後の部分です。ジョブを作成したときに、ID が表示される場合があります(ジョブの ID がわからない場合は、- gcloud ai custom-jobs listコマンドを実行して、該当するジョブを探します)。
- LOCATION: ジョブを作成したリージョン。 
REST
リクエストのデータを使用する前に、次のように置き換えます。
- LOCATION: ジョブを作成したリージョン。 
- PROJECT_ID: 実際のプロジェクト ID。 
- JOB_ID: ジョブの数値 ID。この ID は、ジョブの - nameフィールドの最後の部分です。ジョブを作成したときに、ID が表示される場合があります。
HTTP メソッドと URL:
GET https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/customJobs/JOB_ID
リクエストを送信するには、次のいずれかのオプションを展開します。
出力で、次のものを探します。
{
  ...
  "state": "JOB_STATE_RUNNING",
  ...
  "webAccessUris": {
    "workerpool0-0": "INTERACTIVE_SHELL_URI"
  }
}
webAccessUris フィールドが表示されない場合は、Vertex AI がジョブの実行をまだ開始していない可能性があります。JOB_STATE_RUNNING に state フィールドが表示されていることを確認します。状態が JOB_STATE_QUEUED または JOB_STATE_PENDING の場合は、1 分ほど待ちます。その後、プロジェクト情報をもう一度取得してみてください。
HyperparameterTuningJob
以下のタブでは、projects.locations.hyperparameterTuningJobs.get リクエストの送信方法を説明します。
gcloud
gcloud ai hp-tuning-jobs describe コマンドを実行します。
gcloud ai hp-tuning-jobs describe JOB_ID \
  --region=LOCATION \
  --format=json
次のように置き換えます。
- JOB_ID: ジョブの数値 ID。この ID は、ジョブの - nameフィールドの最後の部分です。ジョブを作成したときに、ID が表示される場合があります(ジョブの ID がわからない場合は、- gcloud ai hp-tuning-jobs listコマンドを実行して、該当するジョブを探します)。
- LOCATION: ジョブを作成したリージョン。 
REST
リクエストのデータを使用する前に、次のように置き換えます。
- LOCATION: ジョブを作成したリージョン。 
- PROJECT_ID: 実際のプロジェクト ID。 
- JOB_ID: ジョブの数値 ID。この ID は、ジョブの - nameフィールドの最後の部分です。ジョブを作成したときに、ID が表示される場合があります。
HTTP メソッドと URL:
GET https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION/hyperparameterTuningJobs/JOB_ID
リクエストを送信するには、次のいずれかのオプションを展開します。
出力で、次のものを探します。
{
  ...
  "state": "JOB_STATE_RUNNING",
  ...
  "trials": [
    ...
    {
      ...
      "state": "ACTIVE",
      ...
      "webAccessUris": {
        "workerpool0-0": "INTERACTIVE_SHELL_URI"
      }
    }
  ],
}
webAccessUris フィールドが表示されない場合は、Vertex AI がジョブの実行をまだ開始していない可能性があります。JOB_STATE_RUNNING に state フィールドが表示されていることを確認します。状態が JOB_STATE_QUEUED または JOB_STATE_PENDING の場合は、1 分ほど待ちます。その後、プロジェクト情報をもう一度取得してみてください。
トライアルが ACTIVE 状態になると、Vertex AI は各ハイパーパラメータ調整トライアルに一連のインタラクティブ シェル URI を提供します。以降のトライアルのインタラクティブ シェル URI を取得する場合は、トライアルの開始後にジョブ情報を再度取得します。
上の例は、単一レプリカのトレーニングで予想される出力を示しています。これは、プライマリ トレーニング ノードの URI の 1 つです。分散トレーニングを実行している場合、出力にはトレーニング ノード(ワーカープール)ごとに 1 つの URI が表示されます。
たとえば、ジョブに 1 つのレプリカを持つプライマリ ワーカープールと 2 つのレプリカを持つセカンダリ ワーカープールがある場合、webAccessUris フィールドは次のようになります。
{
  "workerpool0-0": "URI_FOR_PRIMARY",
  "workerpool1-0": "URI_FOR_FIRST_SECONDARY",
  "workerpool1-1": "URI_FOR_SECOND_SECONDARY"
}
インタラクティブ シェルを使用する
トレーニング ノードでインタラクティブ シェルを使用するには、前のセクションで確認した URI の 1 つに移動します。ブラウザに Bash シェルが表示され、Vertex AI がトレーニング コードを実行しているコンテナのファイル システムにアクセスできます。
以降のセクションでは、シェルを使用する際の考慮事項について説明します。また、シェルで使用できるモニタリング ツールの例を示します。
ジョブの実行を継続する
Vertex AI でジョブまたはトライアルの実行を終了するとすぐに、インタラクティブ シェルへのアクセス権が失われます。その場合、command terminated with exit code 137 というメッセージが表示されるか、シェルが応答不能になります。コンテナのファイル システムにファイルを作成した場合、ジョブが終了すると、そのファイルは保持されません。
インタラクティブ シェルでデバッグするために、ジョブを長時間実行したい場合があります。たとえば、例外が発生してから 1 時間以上、ジョブの実行を継続させる場合は、次のようなコードをトレーニング コードに追加します。
import time
import traceback
try:
    # Replace with a function that runs your training code
    train_model()
except Exception as e:
    traceback.print_exc()
    time.sleep(60 * 60)  # 1 hour
ただし、ジョブが実行されている間は Vertex AI Training の料金が課金されます。
権限の問題を確認する
インタラクティブ シェル環境では、Vertex AI がトレーニング コードの実行に使用するサービス アカウントのアプリケーションのデフォルト認証情報(ADC)を使用して認証が行われます。詳細については、シェルで gcloud auth list を実行してください。
シェルでは、bq など、ADC をサポートするツールを使用できます。これは、ジョブが特定の Cloud Storage バケット、BigQuery テーブル、またはトレーニング コードに必要な他のGoogle Cloud リソースにアクセスできることの確認に役立ちます。
py-spy を使用して Python の実行を可視化する
py-spy を使用すると、実行中の Python プログラムを変更せずにプロファイリングできます。インタラクティブ シェルで py-spy を使用するには、次の操作を行います。
- py-spyをインストールします。- pip3 install py-spy
- シェルで - ps auxを実行し、Python トレーニング プログラムの PID を確認します。
- py-spyのドキュメントで説明されているサブコマンドのいずれかを実行し、前の手順で確認した PID を使用します。
- py-spy recordを使用して SVG ファイルを作成する場合は、後でローカル コンピュータで閲覧できるように、このファイルを Cloud Storage バケットにコピーします。次に例を示します。- gcloud storage cp profile.svg gs://BUCKET- BUCKET は、アクセスできるバケットの名前に置き換えます。 
perf でパフォーマンスを分析する
perf を使用すると、トレーニング ノードのパフォーマンスを分析できます。ノードの Linux カーネルに適した perf のバージョンをインストールするには、次のコマンドを実行します。
apt-get update
apt-get install -y linux-tools-generic
rm /usr/bin/perf
LINUX_TOOLS_VERSION=$(ls /usr/lib/linux-tools | tail -n 1)
ln -s "/usr/lib/linux-tools/${LINUX_TOOLS_VERSION}/perf" /usr/bin/perf
その後、perf のドキュメントで説明されているサブコマンドを実行できます。
GPU の使用状況に関する情報を取得する
通常、GPU を使用するノード上で動作する GPU 対応コンテナには、GPU の使用状況のモニタリングに役立つコマンドライン ツールがプリインストールされています。次に例を示します。
- nvidia-smiを使用して、GPU の使用状況をモニタリングします。
- nvprofを使用して、さまざまな GPU プロファイリング情報を収集します。- nvprofは既存のプロセスには接続できないため、このツールを使用して、トレーニング コードを実行する追加のプロセスを開始することをおすすめします(この場合、ノードでトレーニング コードが 2 回実行されることになります)。例:- nvprof -o prof.nvvp python3 -m MODULE_NAME- MODULE_NAME は、トレーニング アプリケーションのエントリ ポイント モジュールの完全修飾名で置き換えます(例: - trainer.task)。- 後でローカル コンピュータで分析できるように、この出力ファイルを Cloud Storage バケットに転送します。次に例を示します。 - gcloud storage cp prof.nvvp gs://BUCKET- BUCKET は、アクセスできるバケットの名前に置き換えます。 
- 構成または Vertex AI の問題ではなく、GPU のエラーが発生した場合は、 - nvidia-bug-report.shを使用してバグレポートを作成します。- その後、レポートを Cloud Storage バケットに転送すると、ローカル コンピュータ上でレポートを分析できるようになります。また、レポートを NVIDIA に送信することもできます。次に例を示します。 - gcloud storage cp nvidia-bug-report.log.gz gs://BUCKET- BUCKET は、アクセスできるバケットの名前に置き換えます。 
これらの NVIDIA コマンドが bash で見つからない場合は、シェルの PATH に /usr/local/nvidia/bin と /usr/local/cuda/bin を追加してみてください。
export PATH="/usr/local/nvidia/bin:/usr/local/cuda/bin:${PATH}"
VPC-SC と VPC ピアリングを使用した Ray ダッシュボードとインタラクティブ シェル
- 
    peered-dns-domainsを構成します。{ VPC_NAME=NETWORK_NAME REGION=LOCATION gcloud services peered-dns-domains create training-cloud \ --network=$VPC_NAME \ --dns-suffix=$REGION.aiplatform-training.cloud.google.com. # Verify gcloud beta services peered-dns-domains list --network $VPC_NAME; } - 
        NETWORK_NAME: ピアリングされたネットワークに変更します。 
- 
        LOCATION: 目的のロケーション(例: us-central1)。
 
- 
        
- 
    DNS managed zoneを構成します。{ PROJECT_ID=PROJECT_ID ZONE_NAME=$PROJECT_ID-aiplatform-training-cloud-google-com DNS_NAME=aiplatform-training.cloud.google.com DESCRIPTION=aiplatform-training.cloud.google.com gcloud dns managed-zones create $ZONE_NAME \ --visibility=private \ --networks=https://www.googleapis.com/compute/v1/projects/$PROJECT_ID/global/networks/$VPC_NAME \ --dns-name=$DNS_NAME \ --description="Training $DESCRIPTION" } - 
        PROJECT_ID: プロジェクト ID。これらの ID は、 Google Cloud コンソールの [ようこそ] ページで確認できます。 
 
- 
        
- 
    DNS トランザクションを記録します。 { gcloud dns record-sets transaction start --zone=$ZONE_NAME gcloud dns record-sets transaction add \ --name=$DNS_NAME. \ --type=A 199.36.153.4 199.36.153.5 199.36.153.6 199.36.153.7 \ --zone=$ZONE_NAME \ --ttl=300 gcloud dns record-sets transaction add \ --name=*.$DNS_NAME. \ --type=CNAME $DNS_NAME. \ --zone=$ZONE_NAME \ --ttl=300 gcloud dns record-sets transaction execute --zone=$ZONE_NAME } 
- 
    インタラクティブ シェル、VPC-SC、VPC ピアリングを有効にしてトレーニング ジョブを送信します。 
次のステップ
- Profiler を使用して、カスタム トレーニング ジョブのパフォーマンスを最適化する方法を確認する。
- Vertex AI によるカスタム トレーニングのオーケストレーション方法を確認する。
- トレーニング コードの要件を確認する。