インタラクティブ シェルを使用したトレーニングのモニタリングとデバッグを行う

このページでは、インタラクティブ シェルを使用して、トレーニング コードが実行されているコンテナを検査する方法について説明します。ファイル システムを参照して、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 を使用するセキュリティ上のメリットが少なくなります。

インタラクティブ シェルを有効にする

カスタム トレーニング リソースにインタラクティブ シェルを有効にするには、CustomJobHyperparameterTuningJob、またはカスタム TrainingPipeline を作成するときに、enableWebAccess API フィールドtrue に設定します。

以下では、この操作をいくつかの異なるツールで行う方法を説明します。

Console

ガイドに沿って、Google Cloud コンソールでカスタム TrainingPipeline を作成します。[新しいモデルのトレーニング] ペインで、[モデルの詳細] ステップになるまで次の操作を行います。

  1. [詳細オプション] をクリックします。

  2. [Enable training debugging] チェックボックスをオンにします。

次に、[新しいモデルのトレーニング] ワークフローの残りの作業を完了します。

gcloud

これらのコマンドの使用方法については、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 を作成する例については、トレーニング パイプラインの作成をご覧ください。

Vertex AI SDK for Python

Vertex AI SDK for Python のインストールまたは更新の方法については、Vertex AI SDK for Python をインストールするをご覧ください。 詳細については、 Vertex AI SDK for Python API のリファレンス ドキュメントをご覧ください。

次のいずれかのメソッドを実行する場合は、enable_web_access パラメータを true に設定します。

前のセクションのガイダンスに従ってカスタム トレーニングを開始すると、Vertex AI は、インタラクティブ シェルへのアクセスに使用できる URI を生成します。Vertex AI は、ジョブのトレーニング ノードごとに一意の URI を生成します。

次のいずれかの方法でインタラクティブ シェルを開くことができます。

  • Google Cloud コンソールでリンクをクリックする
  • Vertex AI API を使用してシェルのウェブアクセス URI を取得する
  1. Google Cloud コンソールの [Vertex AI] セクションで、次のいずれかのページに移動します。

  2. カスタム トレーニング リソースの名前をクリックします。

    カスタム トレーニング用に TrainingPipeline を作成した場合は、TrainingPipeline によって作成された CustomJob または HyperparameterTuningJob の名前をクリックします。たとえば、パイプラインの名前が PIPELINE_NAME の場合、PIPELINE_NAME-custom-job または PIPELINE_NAME-hyperparameter-tuning-job になります。

  3. ジョブのページで、[ウェブ ターミナルを起動] をクリックします。ジョブで複数のノードを使用している場合は、インタラクティブ シェルを追加するノードの横にある [ウェブ ターミナルを起動] をクリックします。

    インタラクティブ シェルには、ジョブの実行中にのみアクセスできます。[ウェブ ターミナルを起動] が表示されない場合は、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_RUNNINGstate フィールドが表示されていることを確認します。状態が 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_RUNNINGstate フィールドが表示されていることを確認します。状態が 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 を使用するには、次の操作を行います。

  1. py-spy をインストールします。

    pip3 install py-spy
    
  2. シェルで ps aux を実行し、Python トレーニング プログラムの PID を確認します。

  3. py-spy のドキュメントで説明されているサブコマンドのいずれかを実行し、前の手順で確認した PID を使用します。

  4. 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 ダッシュボードとインタラクティブ シェル

  1. 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)。

  2. 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 コンソールの [ようこそ] ページで確認できます。

  3. 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
    }
        
  4. インタラクティブ シェル、VPC-SC、VPC ピアリングを有効にしてトレーニング ジョブを送信します。

次のステップ