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

トレーニング中に、インタラクティブ シェルを使用して、トレーニング コードが実行されているコンテナを検査できます。ファイル システムを参照して、AI Platform Training で実行されているランタイム バージョンまたはカスタム コンテナごとにデバッグ ユーティリティを実行できます。

インタラクティブ シェルを使用してトレーニング コンテナを検査すると、トレーニング コードや AI Platform Training の構成の問題をデバッグできます。たとえば、インタラクティブ シェルを使用すると、次のことができます。

  • トレースツールとプロファイリング ツールを実行する
  • GPU の使用状況を分析する
  • コンテナで使用できる Google Cloud の権限を確認する

始める前に

トレーニング ジョブまたはハイパーパラメータ調整ジョブを実行する場合は、インタラクティブ シェルを使用できます。トレーニング コードを準備してトレーニング ジョブを実行する場合は、次の要件を満たしていることを確認してください。

  • トレーニング コンテナに bash がインストールされている。

  • すべてのランタイム バージョン コンテナbash がインストールされている。トレーニング用のカスタム コンテナを作成する場合は、bash を含むベースコンテナを使用するか、bash を Dockerfile にインストールします。

  • インタラクティブ シェルをサポートするリージョンでトレーニングを行う。

  • インタラクティブ シェルにアクセスするすべてのユーザーに、トレーニングを実行している Google Cloud プロジェクトに対する次の権限が付与されていることを確認する。

    • ml.jobs.create
    • ml.jobs.get
    • ml.jobs.cancel

    自分でトレーニングを開始する場合、これらの権限がすでに付与されているため、インタラクティブ シェルにアクセスできます。ただし、インタラクティブ シェルを使用して、組織内の他のユーザーが作成したトレーニング ジョブを検査する場合は、これらの権限の取得が必要になることがあります。

    これらの権限を取得するには、組織の管理者に AI Platform Training 管理者ロールroles/ml.admin)を付与するよう依頼する方法があります。AI Platform Training デベロッパーのロールroles/ml.developer)があれば、作成するジョブのインタラクティブ シェルにアクセスできます。

高度なケースの要件

特定の高度な機能を使用する場合は、次の追加要件を満たす必要があります。

  • トレーニング ジョブにカスタム サービス アカウントを関連付ける場合は、インタラクティブ シェルにアクセスするユーザーに、関連付けられたサービス アカウントに対する iam.serviceAccounts.actAs 権限があることを確認します。

    カスタム サービス アカウントのガイドには、サービス アカウントを関連付けるにはこの権限が必要であることが記載されています。この権限は、カスタム トレーニングでインタラクティブ シェルを表示する場合にも必要です。

    たとえば、サービス アカウントが設定されたジョブを作成するには、サービス アカウントに対する iam.serviceAccounts.actAs 権限が必要です。同僚の 1 人がこのジョブのインタラクティブ シェルを表示するには、そのユーザーにも同じ iam.serviceAccounts.actAs 権限が付与されている必要があります。

  • AI Platform Training で VPC Service Controls を使用するようにプロジェクトを構成している場合は、次の制限も考慮してください。

    • VPC ネットワーク ピアリングでは VPC Service Controls を使用できません。

    • インタラクティブ シェル内から、サービス境界外の公共のインターネットや Google Cloud リソースにアクセスすることはできません。

    • インタラクティブ シェルへのアクセスを保護するには、ml.googleapis.com に加えて、サービス境界内で制限されているサービスとして notebooks.googleapis.com を追加する必要があります。notebooks.googleapis.com ではなく ml.googleapis.com のみを制限すると、ユーザーはサービス境界外のマシンからインタラクティブ シェルにアクセスできるため、VPC Service Controls を使用するセキュリティ上のメリットが少なくなります。

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

トレーニング ジョブでインタラクティブ シェルを有効にするには、トレーニング ジョブを作成するときに、ジョブの trainingInput フィールドで enableWebAccess API フィールドtrue に設定します。

次の例は、gcloud CLI を使用するときに --enable-web-access フラグを追加してこれを行う方法を示しています。現在、Google Cloud コンソールでインタラクティブ シェルを有効にしてトレーニング ジョブを作成することはできません。

この例では、trainer という名前のディレクトリに、task というモジュール名で、トレーニング アプリケーションが置かれていると想定しています。

トレーニング ジョブを作成するには、次のコマンドを実行します。

  gcloud ai-platform jobs submit training JOB_ID \
    --enable-web-access \
    --job-dir=JOB_DIR \
    --module-name=trainer.task \
    --package-path=trainer \
    --python-version=3.7 \
    --region=REGION \
    --runtime-version=2.11 \
    --scale-tier=CUSTOM \
    --master-machine-type=n1-highmem-8

このコマンドで、プレースホルダは次のように置き換えます。

  • JOB_ID: ジョブに付ける名前。
  • JOB_DIR: トレーニング アプリケーションをアップロードする Cloud Storage ディレクトリのパス。
  • REGION: トレーニング ジョブを作成する予定のリージョン。インタラクティブ シェルをサポートするリージョンである必要があります。

    正常な場合は、次の出力が表示されます。

    Job [JOB_ID] submitted successfully.
    Your job is still active. You may view the status of your job with the command
    
      $ gcloud ai-platform jobs describe JOB_ID
    
    or continue streaming the logs with the command
    
      $ gcloud ai-platform jobs stream-logs JOB_ID
    jobId: JOB_ID
    state: QUEUED
    

ウェブアクセス URI を取得する

前のセクションのガイダンスに従ってトレーニングを開始したら、Google Cloud コンソールまたは gcloud コマンドライン ツールを使用して、インタラクティブ シェルへのアクセスに使用できる URI を確認します。AI Platform Training は、ジョブの一部である各トレーニング ノードの URI を提供します。

作成したトレーニング ジョブのタイプに応じて、次のいずれかのタブを選択して、ジョブの各ノードのインタラクティブ シェル URI を含む webAccessUris API フィールドを検索する方法を確認してください。

トレーニング ジョブ

以下のタブでは、標準のトレーニング ジョブの TrainingOutput にアクセスする方法を示します。

gcloud

gcloud ai-platform jobs describe コマンドを実行します。

gcloud ai-platform jobs describe JOB_ID

次のように置き換えます。

  • JOB_ID: ジョブの ID。この ID はジョブの作成時に設定しています(ジョブの ID がわからない場合は、gcloud ai-platform jobs list コマンドを実行して、該当するジョブを探します)。

出力で、次のものを探します。

trainingOutput:
  webAccessUris:
    master-replica-0: INTERACTIVE_SHELL_URI

コンソール

  1. Google Cloud コンソールで AI Platform Training の [ジョブ] ページを開きます。

    Google Cloud コンソールで [ジョブ] を開く

  2. リスト内のジョブ名をクリックして、[ジョブの詳細] ページを開きます。

  3. [トレーニング出力] セクションの [JSON を表示] ボタンをクリックして、ジョブの TrainingOutput の JSON ビューを開きます。

出力で、次のものを探します。

{
  "webAccessUris": {
    "master-replica-0": "INTERACTIVE_SHELL_URI"
  }
}

webAccessUris フィールドが表示されない場合は、AI Platform Training がジョブまたはトライアルの実行をまだ開始していない可能性があります。RUNNINGstate フィールドが表示されていることを確認します。状態が QUEUED または PREPARING の場合は、1 分ほど待ちます。その後、ジョブ情報をもう一度取得してみてください。

ハイパーパラメータ調整ジョブ

以下のタブでは、ハイパーパラメータ調整ジョブの TrainingOutput にアクセスするさまざまな方法を示しています。

gcloud

gcloud ai-platform jobs describe コマンドを実行します。

gcloud ai-platform jobs describe JOB_ID

次のように置き換えます。

  • JOB_ID: ジョブの ID。この ID はジョブの作成時に設定しています(ジョブの ID がわからない場合は、gcloud ai-platform jobs list コマンドを実行して、該当するジョブを探します)。

出力で、次のものを探します。

trainingOutput:
  trials:
  - trialId: '1'
    webAccessUris:
      master-replica-0: INTERACTIVE_SHELL_URI

コンソール

  1. Google Cloud コンソールで AI Platform Training の [ジョブ] ページを開きます。

    Google Cloud コンソールで [ジョブ] を開く

  2. リスト内のジョブ名をクリックして、[ジョブの詳細] ページを開きます。

  3. [トレーニング出力] セクションの [JSON を表示] ボタンをクリックして、ジョブの TrainingOutput の JSON ビューを開きます。

出力で、次のものを探します。

{
  "trials": [
    {
      ...
      "webAccessUris": {
        "master-replica-0": "INTERACTIVE_SHELL_URI"
      }
    },
    ...
  ]
}

webAccessUris フィールドが表示されない場合は、AI Platform Training がジョブまたはトライアルの実行をまだ開始していない可能性があります。RUNNINGstate フィールドが表示されていることを確認します。状態が QUEUED または PREPARING の場合は、1 分ほど待ちます。その後、ジョブ情報をもう一度取得してみてください。

トライアルが RUNNING 状態になると、AI Platform Training は各ハイパーパラメータ調整トライアルに一連のインタラクティブ シェル URI を提供します。以降のトライアルのインタラクティブ シェル URI を取得する場合は、トライアルの開始後にジョブ情報を再度取得します。

上の例は、単一レプリカのトレーニングで予想される出力を示しています。これは、プライマリ トレーニング ノードの URI の 1 つです。分散トレーニングを実行している場合、出力にはトレーニング ノードごとに 1 つの URI がタスク名で表示されます。

たとえば、ジョブにマスターと 2 つのワーカーがある場合、webAccessUris フィールドは次のようになります。

{
  "master-replica-0": "URI_FOR_PRIMARY",
  "worker-replica-0": "URI_FOR_FIRST_SECONDARY",
  "worker-replica-1": "URI_FOR_SECOND_SECONDARY"
}

利用可能なリージョン

次のリージョンでは、AI Platform Training でインタラクティブ シェルを使用できます。

アメリカ大陸

  • オレゴン(us-west1)
  • ロサンゼルス(us-west2)
  • アイオワ(us-central1)
  • サウス カロライナ(us-east1)
  • 北バージニア(us-east4)
  • モントリオール(northamerica-northeast1)

ヨーロッパ

  • ロンドン(europe-west2)
  • ベルギー(europe-west1)
  • チューリッヒ(europe-west6)
  • フランクフルト(europe-west3)

アジア太平洋

  • シンガポール(asia-southeast1)
  • 台湾(asia-east1)
  • 東京(asia-northeast1)
  • シドニー(australia-southeast1)
  • ソウル(asia-northeast3)

AI Platform Training には、トレーニング用の追加のリージョンも用意されています。

インタラクティブ シェルを使用する

トレーニング ノードでインタラクティブ シェルを使用するには、前のセクションで確認した URI の 1 つに移動します。ブラウザに Bash シェルが表示され、AI Platform Training がトレーニング コードを実行しているコンテナのファイル システムにアクセスできます。

以降のセクションでは、シェルを使用する際の考慮事項について説明します。また、シェルで使用できるモニタリング ツールの例を示します。

ジョブの実行を継続する

AI Platform Training でジョブまたはトライアルの実行を終了するとすぐに、インタラクティブ シェルへのアクセス権が失われます。その場合、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

ただし、ジョブが実行されている間は AI Platform Training のトレーニング料金が課金されます。

権限の問題を確認する

インタラクティブ シェル環境では、AI Platform Training がトレーニング コードの実行に使用するサービス アカウントのアプリケーションのデフォルト認証情報(ADC)を使用して認証が行われます。詳細については、シェルで gcloud auth list を実行してください。

シェルでは、gsutilbq など、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 バケットにコピーします。次に例を示します。

    gsutil 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 バケットに転送します。次に例を示します。

    gsutil cp prof.nvvp gs://BUCKET
    

    BUCKET は、アクセスできるバケットの名前に置き換えます。

  • 構成または AI Platform Training の問題ではなく、GPU のエラーが発生した場合は、nvidia-bug-report.sh を使用してバグレポートを作成します。

    その後、レポートを Cloud Storage バケットに転送すると、ローカル コンピュータ上でレポートを分析できるようになります。また、レポートを NVIDIA に送信することもできます。次に例を示します。

    gsutil 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}"

次のステップ