このページでは、インタラクティブ シェルを使用して、トレーニング コードが実行されているコンテナを検査する方法について説明します。ファイル システムを参照して、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] チェックボックスをオンにします。
次に、[新しいモデルのトレーニング] ワークフローの残りの作業を完了します。
CustomJob
を作成する場合は、gcloud ai custom-jobs create
コマンドに--enable-web-access
フラグを指定して実行します。HyperparameterTuningJob
を作成する場合は、gcloud ai hp-tuning-jobs create
コマンドに--enable-web-access
フラグを指定して実行します。
これらのコマンドの使用方法については、CustomJob
の作成に関するガイドと HyperparameterTuningJob
の作成に関するガイドをご覧ください。
以下に、カスタム トレーニング リソースの種類ごとに REST リクエスト本文で enableWebAccess
フィールドを指定する場所を示します。
次の例は、projects.locations.customJobs.create
API メソッドのリクエスト本文の一部を示したものです。
{
...
"jobSpec": {
...
"enableWebAccess": true
}
...
}
CustomJob
を作成する API リクエストを送信する例については、カスタム トレーニング ジョブの作成をご覧ください。
次の例は、projects.locations.hyperparameterTuningJobs.create
API メソッドのリクエスト本文の一部を示したものです。
{
...
"trialJobSpec": {
...
"enableWebAccess": true
}
...
}
API リクエストを送信して HyperparameterTuningJob
を作成する例については、ハイパーパラメータ調整の使用をご覧ください。
次の例は、projects.locations.trainingPipelines.create
API メソッドのリクエスト本文の一部を示したものです。ハイパーパラメータ調整を使用しているかどうかに応じてタブを選択してください。
{
...
"trainingTaskInputs": {
...
"enableWebAccess": true
}
...
}
{
...
"trainingTaskInputs": {
...
"trialJobSpec": {
...
"enableWebAccess": true
}
}
...
}
API リクエストを送信してカスタム TrainingPipeline
を作成する例については、トレーニング パイプラインの作成をご覧ください。
Vertex AI SDK for Python のインストールまたは更新の方法については、Vertex AI SDK for Python をインストールするをご覧ください。 詳細については、 Vertex AI SDK for 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 が格納されています。
以下のタブでは、projects.locations.customJobs.get
リクエストの送信方法を説明します。
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: ジョブを作成したリージョン。
リクエストのデータを使用する前に、次のように置き換えます。
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
リクエストを送信するには、次のいずれかのオプションを展開します。
curl(Linux、macOS、Cloud Shell)
次のコマンドを実行します。
curl -X GET \
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
"https://LOCATION -aiplatform.googleapis.com/v1/projects/PROJECT_ID /locations/LOCATION /customJobs/JOB_ID "
PowerShell(Windows)
次のコマンドを実行します。
$cred = gcloud auth application-default print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }
Invoke-WebRequest `
-Method GET `
-Headers $headers `
-Uri "https://LOCATION -aiplatform.googleapis.com/v1/projects/PROJECT_ID /locations/LOCATION /customJobs/JOB_ID " | Select-Object -Expand Content
出力で、次のものを探します。
{
...
"state": "JOB_STATE_RUNNING",
...
"webAccessUris": {
"workerpool0-0": "INTERACTIVE_SHELL_URI "
}
}
webAccessUris
フィールドが表示されない場合は、Vertex AI がジョブの実行をまだ開始していない可能性があります。JOB_STATE_RUNNING
に state
フィールドが表示されていることを確認します。状態が JOB_STATE_QUEUED
または JOB_STATE_PENDING
の場合は、1 分ほど待ちます。その後、プロジェクト情報をもう一度取得してみてください。
以下のタブでは、projects.locations.hyperparameterTuningJobs.get
リクエストの送信方法を説明します。
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: ジョブを作成したリージョン。
リクエストのデータを使用する前に、次のように置き換えます。
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
リクエストを送信するには、次のいずれかのオプションを展開します。
curl(Linux、macOS、Cloud Shell)
次のコマンドを実行します。
curl -X GET \
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
"https://LOCATION -aiplatform.googleapis.com/v1/projects/PROJECT_ID /locations/LOCATION /hyperparameterTuningJobs/JOB_ID "
PowerShell(Windows)
次のコマンドを実行します。
$cred = gcloud auth application-default print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }
Invoke-WebRequest `
-Method GET `
-Headers $headers `
-Uri "https://LOCATION -aiplatform.googleapis.com/v1/projects/PROJECT_ID /locations/LOCATION /hyperparameterTuningJobs/JOB_ID " | Select-Object -Expand Content
出力で、次のものを探します。
{
...
"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 によるカスタム トレーニングのオーケストレーション方法を確認する。
- トレーニング コードの要件を確認する。