Cloud TPU ツール

このドキュメントでは、プロファイリング ツールを設定して、TensorFlow の TensorBoard コンソールでプロファイルをキャプチャし、Cloud TPU のプログラム パフォーマンスを分析する方法について説明します。また、コマンドラインで TPU ジョブを継続的に監視する方法についても説明します(ジョブのモニタリングを参照)。

前提条件

このガイドで説明する Cloud TPU プロファイリング ツールを使用する前に、次のことを行う必要があります。

TensorBoard での Cloud TPU ツールの使用

TensorBoard には、TensorFlow データを視覚的に表示するためのツールが用意されています。Cloud TPU Profiler プラグインをインストールすると、TensorBoard から一連の Cloud TPU プロファイリング ツールにアクセスできます。このプラグインを使用すると、規模の大小に関係なく、Cloud TPU ノードのパフォーマンスを可視化できます。

実行中の TensorFlow モデルからトレース情報が収集されると、TensorBoard メニューバーの [Profile] タブで Cloud TPU ツールセレクタが使用可能になります。

以降のセクションでは、ツールを使用できるようにコンピューティング環境を準備し、モデルを実行して Cloud TPU プロファイルのキャプチャを行い、VM コマンドラインから TensorBoard を実行する方法について説明します。コードから TensorBoard を呼び出す方法については、TensorBoard プログラミング ガイドをご覧ください。

Cloud TPU リソースの作成

Compute Engine VM と Cloud TPU リソースの作成方法については、Cloud TPU のクイックスタートをご覧ください。

リソースの作成後すぐにこのガイドの手順を続ける場合は、クリーンアップ手順を行わないでください。モデルの実行が完了してリソースの使用が終了したら、不要な請求が発生しないように、クリーンアップ手順を行ってください。

cloud_tpu_profiler の実行

cloud-tpu-profiler 1.14 を実行して、TensorBoard の Cloud TPU プロファイリング プラグインと capture-tpu-profile スクリプトを作成します。このスクリプトを実行すると、TensorBoard で表示できるプロファイルをキャプチャできます。また、コマンドラインから TPU ジョブをモニタリングできます(ジョブのモニタリングを参照)。

モデルを実行した後にプロファイル(トレース)情報のキャプチャを実行すると、TensorBoard に [Profile] タブが表示されます。

プロファイラのバージョンを確認するには、pip を使用します。最新バージョンでない場合は、次の 2 番目のコマンドを使用してインストールします。

(vm)$ pip freeze | grep cloud-tpu-profiler
(vm)$ pip install --upgrade "cloud-tpu-profiler>=1.14"

PATH 環境変数も次のように設定する必要があります。

(vm)$ export PATH="$PATH:`python -m site --user-base`/bin"

capture_tpu_profile について

capture_tpu_profile を使用してプロファイルをキャプチャすると、.tracetable ファイルが Google Cloud Storage バケットに保存されます。このファイルには大量のトレース イベントが記録されます。このイベントは、TensorBoard のトレース ビューアストリーミング トレース ビューアの両方で確認できます。

プロファイルまたはトレースデータをキャプチャするには、モデルを実行して capture_tpu_profile を実行し、モデルの実行が停止する前に TensorBoard を起動します。次に例を示します。

(vm)$ 
capture_tpu_profile --tpu=$TPU_NAME --logdir=${MODEL_DIR}

モデルの実行時に次のパラメータを設定します。

  • --tpu=$TPU_NAME - Cloud TPU の作成時に割り当てられた名前です。Compute Engine VM と Cloud TPU の起動に ctpu up を使用した場合は、デフォルトでユーザー名が使用されます。gcloud または Cloud Console で VM と TPU を設定した場合は、設定時に指定した名前です。
  • --logdir=${MODEL_DIR} - モデルとチェックポイントが保存されている Cloud Storage のロケーションです。通常、モデル ディレクトリは次のように定義されています。
    export STORAGE_BUCKET=gs://[YOUR-BUCKET-NAME]
    export MODEL_DIR=${STORAGE_BUCKET}/OUTPUT DIRECTORY
    たとえば、MNIST モデルを実行している場合、出力ディレクトリは次のように定義します。
    export STORAGE_BUCKET=gs://[YOUR-BUCKET-NAME]
    export MODEL_DIR=${STORAGE_BUCKET}/mnist

モデルが実行されると、Cloud TPU サービス アカウントがディレクトリ(オブジェクト)を作成し、Compute Engine バケットにデータを書き込みます。モデルを実行する前に、そのアカウントの権限をバケットに設定する必要があります。

デフォルトでは、capture_tpu_profile は 2 秒間のトレースをキャプチャします。トレース期間は、duration_ms コマンドライン オプションで設定するか、モデルの実行時にプログラムで設定します。

プロファイルのキャプチャ

このセクションでは、プロファイルのキャプチャ方法について説明します。まず、モデルを実行して capture_tpu_profile を実行し、モデルの実行が停止する前に TensorBoard を起動します。ここで説明するように、TensorBoard を実行すると、ストリーミング トレース ビューアを除き、すべての Profile ツールにアクセスできます。

コマンドラインで TPU のモニタリングを行う場合は、ジョブのモニタリングをご覧ください。

この例では、モデルとして MNIST チュートリアルを使用します。

  1. ctpu を起動します。

  2. Cloud Console のダッシュボード(ホーム)に移動し、[Compute Engine] > [TPU] の順に選択します。

  3. 作成した Cloud TPU をクリックします。

  4. Cloud TPU サービス アカウント名を探してコピーします。次に例を示します。

    service-11111111118@cloud-tpu.iam.myserviceaccount.com

  5. ダッシュボードの [リソース] パネルで Cloud Storage をクリックします。ストレージ バケットのリストが表示されるか、バケットの作成が求められます。ストレージ バケットをまだ作成していない場合は、ページの上部にある [バケットを作成] をクリックして、TPU と同じリージョンに作成します。

  6. 使用するストレージ バケットのチェックボックスをクリックします。バケットが Cloud TPU と同じリージョンであることを確認します。

  7. リストからストレージ バケットを選択したら、[情報パネルを表示] を選択して [バケットの権限を編集] を選択します。

  8. そのバケットの [メンバーを追加] フィールドに TPU サービス アカウント名を貼り付けます

  9. [Storage Legacy] を選択してから、Storage Legacy バケット読み取り、作成者、オーナーの各権限を選択します。

    image

  10. VM シェルで、pip を使用して TensorBoard のバージョンを確認します。

    (vm)$ pip freeze | grep tensorboard
    
  11. TensorBoard のバージョンが 1.14 より前の場合は、TensorFlow の最新バージョンをインストールして、TensorBoard のバージョンをアップグレードします。

    (vm)$ pip install --upgrade "tensorboard>=1.14"
  12. まだ行っていない場合は、PATH 環境変数を設定します。

    (vm)$ export PATH="$PATH:`python -m site --user-base`/bin" 
  13. MNIST チュートリアルに従って、MNIST トレーニング ジョブを設定して実行します。次に例を示します。

    (vm)$ python /usr/share/models/official/mnist/mnist_tpu.py \
      --tpu=$TPU_NAME \
      --data_dir=${STORAGE_BUCKET}/data \
      --model_dir=${MODEL_DIR} \
      --use_tpu=True \
      --iterations=500 \
      --train_steps=5000 
  14. ジョブの実行中に、新しい Cloud Shell を開き、ctpu up を実行します。デフォルト以外の TPU 名を使用する場合は、それを指定します。VM にログインしたら、前の手順で示したように環境変数 STORAGE_BUCKET、MODEL_DIR を設定します。

  15. ジョブの実行中に、3 番目の Cloud Shell を開き、SSH で VM に接続します(コマンドの $vm は自分の VM 名で置き換えます)。

    gcloud compute ssh $vm --ssh-flag=-L6006:localhost:6006 

    ログイン後、前の手順で示したように環境変数 TPU_NAME、STORAGE_BUCKET、MODEL_DIR を設定します。

  16. 2 番目の Cloud Shell で capture_tpu_profile を実行し、.tracetable ファイルをキャプチャします。

    (vm)$ capture_tpu_profile --tpu=$TPU_NAME --logdir=${MODEL_DIR} 
  17. 3 番目の Cloud Shell で TensorBoard を実行し、モデル ディレクトリを指定します。

    (vm)$ tensorboard --logdir=${MODEL_DIR} & 
  18. 2 番目の Cloud Shell で [ウェブでプレビュー] ボタンをクリックし、ポート 8080 を開いて TensorBoard の出力を表示します。

グラフ

TensorBoard では、さまざまなグラフを使用してモデルとそのパフォーマンスを視覚的に表示できます。グラフと一緒にプロファイリング ツールを使用すると、モデルを微調整して Cloud TPU でのパフォーマンスを改善できます。

XLA 構造グラフ

モデルのコンパイルを開始すると、モデルの実行前に TensorFlow が Cloud TPU で実行される XLA グラフを生成します。グラフのデータは MODEL_DIR ディレクトリに保存されます。このグラフは、capture_tpu_profile を実行しなくても表示できます。

モデルの XLA 構造グラフを表示するには、TensorBoard の [Graphs] タブを選択します。デフォルトでは、[Color] で [Structure] が選択されています。

image

構造グラフ内のノードは XLA 命令を表しています。たとえば、x/y/z という名前の TensorFlow 加算演算の場合、グラフでは x/y/z/add と表示されます。

XLA グラフには、Cloud TPU が特定のモデルを実行する方法に関する情報が表示されます。グラフには、さまざまな演算の入力と出力も表示されます。モデルのプロファイルを取得したら、XLA グラフとトレース ビューアまたはストリーミング トレース ビューアを使用して、処理時間が最も長い個所を特定できます。

注:

  • 一部のノードには TensorFlow 名前空間がありません。すべての XLA 命令(XLA コンパイラによって挿入されたものなど)に対応する TensorFlow 演算があるわけではありません。
  • 可能であれば TensorFlow プログラム構造が XLA グラフに組み込まれます。ただし、Cloud TPU で実行される XLA プログラムは高度に最適化されているため、グラフ構造が元の TensorFlow プログラムとかなり異なる場合があります。
  • fusion という特別な XLA 命令により、さまざまな TensorFlow 演算からの複数の命令を単一の計算にマージできます。fusion での root 命令に対応する TensorFlow 演算は、fusion 演算の名前空間として使用されます。

TPU 互換性グラフ

[Graphs] タブには、モデルの実行時に問題を引き起こす可能性がある TensorFlow 演算をチェックして表示する互換性チェック モジュールがあります。

モデルの TPU 互換性グラフを表示するには、TensorBoard の [Graphs] タブを選択してから [TPU Compatibility] オプションを選択します。互換性のある有効な演算は緑色で表示され、互換性のない無効な演算は赤色で表示されます。

image

Cloud TPU と互換性のある演算が色別で表示されるだけでなく、各ノードの演算の互換性のレベルも表示できます。互換性の結果の意味をご覧ください。

グラフの右側に表示されている互換性のサマリーパネルには、Cloud TPU と互換性のある演算の割合、それらの属性、選択されたノードで互換性のない演算の一覧が表示されます。

グラフで演算をクリックすると、その属性がサマリーパネルに表示されます。

image

互換性チェッカーは、手動デバイス割り当てを使用して TPU 以外のデバイスに明示的に割り当てられた演算を評価しません。また、実際にモデルをコンパイルして実行するわけでもありません。互換性の予測値として結果を解釈してください。

前提条件
  • tf.estimator API または TPUEstimatormodel_dir プロパティを設定して、モデルグラフをファイルに書き込むようにモデルを構成している。
  • Cloud TPU で実行する演算で GPU または CPU へのコードの手動割り当てを削除する。[TPU Compatibility] オプションを使用すると、互換性チェッカーは TPU 以外に明示的に割り当てられた演算をスキップします。
互換性の結果の意味

次の図は、Abalone モデルの互換性サマリーです。互換性のない演算の一部が表示されています。

image

このモデルでは手動デバイス割り当てが指定されていないため、すべての演算がチェックされています。このため、常に CPU で実行される演算や、save、report_uninitialized_variables などの演算も表示されています。

root_mean_squared_error の 2 つの AssignAdd 演算に潜在的な問題があります。

ソースコードを見てみると、root_mean_squared_error が追加の評価指標としてのみ使用されています。

    # Calculate root mean squared error as additional eval metric
    eval_metric_ops = {
        "rmse": tf.metrics.root_mean_squared_error(
            tf.cast(labels, tf.float64), predictions)
    }

トレーニング ループ内で発生しない限り、この演算は通常 CPU 上で実行されるため、このエラー報告は無視できます。結論として、このモデルは Cloud TPU 上で実行する準備ができています。

プロファイル

capture_tpu_profile の実行時に一部のモデルデータがキャプチャされると、TensorBoard に [Profile] タブが表示されます。データが利用可能になり、[Profile] タブをクリックすると、パフォーマンス分析に役立つ次のようなツールが表示されます。

プロファイルの概要ページ

[Profile] タブにある概要ページ(overview_page)には、キャプチャ中のモデルがどのように実行されたかが表示されます。このページには、すべての TPU を集計した概要と入力パイプライン全体の分析結果が表示されます。[Host] プルダウンから特定の TPU を選択することもできます。

このページでは、次のパネルにデータが表示されます。

image

  • パフォーマンスの概要

    • サンプリングされたすべてのステップの平均ステップ時間
    • ホストがアイドル状態だった時間の割合
    • TPU がアイドル状態だった時間の割合
    • TPU マトリックス ユニットの使用率
  • ステップ時間のグラフ。サンプリングされたすべてのステップのデバイス ステップ時間(ミリ秒)がグラフに表示されます。青色の領域は、TPU がホストからの入力データを待機しているステップ時間を表します。オレンジ色の領域は、Cloud TPU が実際に稼働していた時間数に対応します。

  • TPU での上位 10 個の TensorFlow 演算。多くの時間が費やされた TensorFlow 演算が表示されます。[Show table] ボタンをクリックすると、次のテーブルが表示されます。

    image

    各行は、演算に費やされた自己時間(すべての演算にかかった時間に占める割合)、累積時間、カテゴリ、名前、FLOPS 率を示します。

  • 実行環境

    • 使用されたホストの数
    • 使用された TPU のタイプ
    • TPU コアの数
    • トレーニング バッチサイズ
  • 次の推奨ステップ。モデルで入力処理の負荷が高くなった場合や、Cloud TPU で問題が発生した場合に報告されます。提案ツールを使用すると、パフォーマンスのボトルネックを見つけることができます。

入力パイプライン分析ツール

入力パイプライン分析ツールを使用すると、パフォーマンスの結果をより詳しく分析できます。このツールは、capture_tpu_profile ツールが収集した input_pipeline.json ファイルからパフォーマンスの結果を表示します。

このツールは、プログラムで負荷の高い入力処理をすぐに通知します。デバイス側とホスト側で分析を行い、ボトルネックとなっているパイプラインのステージをデバッグできます。

パイプラインのパフォーマンスを最適化する方法については、入力パイプラインのパフォーマンスに関するガイダンスをご覧ください。

入力パイプライン

TensorFlow プログラムがファイルからデータを読み込むと、TensorFlow グラフにパイプライン方式でデータが表示されます。読み取りプロセスは連続した複数のデータ処理ステージに分割され、1 つのステージの出力が次のステージの入力となります。この読み込み方式を入力パイプラインといいます。

ファイルからレコードを読み取るための一般的なパイプラインには、次のステージがあります。

  1. ファイルの読み取り
  2. ファイルの前処理(オプション)
  3. ホストマシンからデバイスへのファイル転送

入力パイプラインが非効率な場合、アプリケーションの速度が大幅に低下する可能性があります。入力パイプラインに多くの時間が費やされている場合、このアプリケーションは入力バウンドとみなされます。入力パイプライン分析ツールを使用すると、非効率な入力パイプラインを特定できます。

入力パイプライン ダッシュボード

入力パイプライン分析ツールを開くには、[Profile] を選択し、[Tools] プルダウンから [input_pipeline_analyzer] を選択します。

ダッシュボードは 3 つのセクションから構成されます。

image

  1. サマリー 入力パイプライン全体のサマリーが表示されます。たとえば、アプリケーションが入力バウンドかどうか表示されます。入力バウンドの場合はその量も表示されます。
  2. デバイス側の分析 デバイス側の分析結果が表示されます。デバイスのステップ時間、各ステップのコアで入力データの待機に費やしたデバイス時間などが表示されます。
  3. ホスト側の分析 ホスト側の分析結果が表示されます。ホスト上での入力処理時間の内訳などが表示されます。
入力パイプラインのサマリー

セクション 1 には、ホストからの入力の待機に費やされたデバイス時間の割合が表示されます。これにより、プログラムが入力バウンドかどうか確認できます。インストゥルメント化された標準の入力パイプラインを使用している場合は、多くの入力処理時間が費やされている部分を確認できます。次に例を示します。

image

デバイス側の分析

セクション 2 には、デバイス側の詳しい分析結果が表示されます。デバイスとホストの間で費やされた時間、ホストからの入力データの待機に費やされたデバイス時間などが表示されます。

image

  1. ステップ番号に対してプロットされたステップ時間。サンプリングされたすべてのステップのデバイス ステップ時間(ミリ秒)がグラフに表示されます。青色の領域は、Cloud TPU がホストからの入力データを待機していたステップ時間の部分を表します。オレンジ色の領域は、Cloud TPU が実際に稼働していた時間数に対応します。
  2. ステップ時間の統計。デバイス ステップ時間の平均、標準偏差、範囲(最小、最大)が報告されます。
  3. 入力データの待機に費やされた各コアのデバイス時間(ステップ番号別)。入力データ処理の待機に費やされたデバイス時間の割合を示す折れ線グラフを表示します(デバイスの合計ステップ時間との割合で表されます)。消費される時間の割合はコアごとに異なるため、各コアに対する割合の範囲もステップごとにプロットされます。ステップにかかる時間は最も遅いコアによって決まるため、範囲はできるだけ小さくする必要があります。
  4. 入力データを待機している時間の割合。入力データを待機していた時間の平均、標準偏差、範囲(最小、最大)が、デバイスの合計ステップ時間で正規化されて表示されます。
ホスト側の分析

セクション 3 にはホスト側の分析の詳細が表示されます。これにより、ホスト上での入力処理時間(データセット API 演算に費やされた時間)をいくつかのカテゴリに分類した内訳が報告されます。

  • ファイルからのオンデマンドのデータ読み取り。キャッシュ、プリフェッチ、インターリーブなしで、ファイルからデータを読み取る際に費やされた時間。
  • ファイルからの事前のデータ読み取り。キャッシング、プリフェッチ、インターリーブなど、ファイルの読み取りに費やされた時間。
  • データの前処理。画像の圧縮など、前処理操作に費やされた時間。
  • デバイスに転送するデータのエンキュー。デバイスへの転送前にデータがインフィード キューに追加される際に費やされた時間。

image

個々の入力演算の統計とそのカテゴリの内訳を実行時間別に表示するには、[Show Input Op statistics] ボタンをクリックします。

ソースデータ テーブルは次のようになります。

image

各テーブル エントリには、次の情報が含まれます。

  1. 入力演算。入力演算の TensorFlow 演算名が表示されます。
  2. 件数。プロファイリング期間中に実行された演算のインスタンスの合計数が表示されます。
  3. 合計時間(ミリ秒)。各インスタンスに費やされた時間の累積合計が表示されます。
  4. 合計時間(%)。演算に費やされた合計時間が、入力処理に費やされた合計時間との割合で表示されます。
  5. 合計自己時間(ミリ秒)。各インスタンスに費やされた自己時間の累積合計が表示されます。この自己時間は、関数本体内で費やされた時間を測定したもので、関数本体から呼び出される関数で費やされた時間は含まれません。たとえば、Iterator::PaddedBatch::Filter::ForeverRepeat::MapIterator::PaddedBatch::Filter によって呼び出されるため、その合計自己時間は、後者の合計自己時間から除外されます。
  6. 合計自己時間(%)。合計自己時間が、入力処理に費やされた合計時間との割合で表示されます。
  7. カテゴリ。入力演算の処理カテゴリを示します。

演算プロファイル

演算プロファイル(op_profile)は、プロファイリング期間中に実行された XLA 演算のパフォーマンス統計を表示する Cloud TPU ツールです。演算プロファイルには、次の情報が表示されます。

  • アプリケーションによる Cloud TPU の使用状況。演算に費やされた時間の割合がカテゴリ別に表示されます。また、TPU FLOPS の使用率も表示されます。
  • 最も時間のかかる演算。これらの演算は、最適化の潜在的なターゲットとなります。
  • 個々の演算の詳細。演算で使用される形状、パディング、式などが表示されます。

演算プロファイルを使用すると、最適化のターゲットを見つけることができます。たとえば、モデルで TPU のピーク FLOPS が 5% にすぎない場合、このツールを使用して、実行に最も時間を費やした XLA 演算とその演算による TPU FLOPS の使用量を特定できます。

演算プロファイルの使用

プロファイル収集中、capture_tpu_profile は XLA 演算のパフォーマンス統計を含む op_profile.json ファイルも収集します。

TensorBoard の op_profile からデータを表示するには、画面上部の [Profile] タブをクリックし、[Tools] プルダウンから op_profile を選択します。次のような画面が表示されます。

image

  1. 概要セクション。Cloud TPU の計算能力の使用率と最適化の推奨事項が表示されます。
  2. コントロール パネル。演算テーブルに表示される演算数を制御する設定スライダーが表示されます。また、トグルボタンを使用すると、総実行時間の 90% を占める演算の一覧を演算テーブルに表示できます。
  3. 演算テーブル。XLA 演算に関連付けられている TensorFlow 演算のカテゴリの中で、実行時間の多い上位のカテゴリが Cloud TPU 使用率の割合で表示されます。この実行時間は、このカテゴリ内のすべての演算の実行に費やした時間を表します。
  4. 演算詳細カード。テーブル内の演算にカーソルを合わせると、演算に関する詳細情報が表示されます。FLOPS 使用率、演算が使用されている式、演算レイアウト(fit)などが表示されます。
XLA 演算テーブル

演算テーブルには、Cloud TPU 使用率の高い順に XLA 演算が表示されます。最初の段階では、カテゴリの実行時間の割合、演算カテゴリ名、関連する TensorFlow 演算名、FLOPS 使用率が表示されます。カテゴリで最も実行時間の長い XLA 演算の上位 10 個を表示または非表示にするには、テーブル内のカテゴリ名の横にある三角形をクリックします。

image

  1. 時間。そのカテゴリに含まれるすべての演算の実行時間の合計を割合で表します。クリックするとエントリが展開され、個々の演算によって費やされた時間の内訳が表示されます。
  2. 横棒。カテゴリ間の時間分布が表示されます。
  3. 上位 10 個の演算。カテゴリ名の横にあるトグルを使用すると、カテゴリ内で時間のかかる上位 10 個の演算を表示または非表示にできます。演算リストに fusion 演算が表示されている場合、このエントリを展開すると、fusion 以外の要素ごとの演算が表示されます。
  4. TensorFlow 演算。XLA 演算に関連付けられる TensorFlow 演算名が表示されます。
  5. FLOPS。FLOPS 使用率が表示されます。FLOPS の測定値が Cloud TPU ピーク FLOPS の割合として表示されます。FLOPS 使用率が高いほど、演算が速くなります。テーブルセルは色分けされています。FLOPS 使用率が高い場合には緑色(良好)、FLOPS 使用率が低い場合には赤色(不良)です。
演算詳細カード。

テーブル エントリにカーソルを合わせると、左側にカードが表示され、XLA 演算または演算カテゴリの詳細が表示されます。通常、次のようなカードが表示されます。

image

  1. 名前。XLA 演算名が表示されます。
  2. カテゴリ。演算カテゴリが表示されます。
  3. FLOPS 使用率。FLOPS の使用率が FLOPS の合計数との割合で表示されます。
  4. 。演算を含む XLA 式が表示されます。
  5. メモリ使用率。プログラムで使用されているピーク時のメモリ量が、使用可能な合計との割合で表示されます。
  6. レイアウト(畳み込み演算のみ)。テンソルの形状とレイアウトが表示されます。テンソルの形状がマトリックス ユニットに正確に一致しているかどうか、形状がどのようにパディングされているかも表示されます。
結果の解釈

畳み込み演算の場合、次のいずれかまたは両方の理由で、TPU FLOPS の使用率が低くなることがあります。

  • パディング(マトリックス ユニットが部分的に使用されている)
  • 畳み込み演算がメモリバインドになっている

このセクションでは、FLOPS が低い別のモデルの数値について解釈します。この例では、output fusionconvolution が実行時間の大半を占め、FLOPS が非常に低いベクトル演算またはスカラー演算が長く続いています。

このようなプロファイルを最適化する方法としては、ベクトル演算またはスカラー演算を畳み込み演算に変換する方法があります。

次の例で、%convolution.399 は前の例の %convolution.340 よりも FLOPS とメモリ使用率が低くなっています。

image

レイアウトを確認すると、バッチサイズ 16 が 128 にパディングされ、特徴サイズ 3 が 8 にパディングされていることがわかります。これは、マトリックス ユニットの 5% しか効率的に使用されていないことを示します。この使用率の計算では、バッチ時間に特徴乗算し(16 x 3)、結果をパディングで割り、128、次に 8 で除算します。この例の FLOPS を前の例の %convolution.340 と比較すると、マトリックスに完全に適合していることがわかります。

Pod ビューア

Pod ビューアツールを使用すると、Pod 内の各コアのパフォーマンスを視覚的に表示し、Pod 内のコア間の通信チャネルのステータスを確認できます。Pod ビューアでは、潜在的なボトルネックや最適化が必要な領域が強調表示されます。このツールは、完全なポッドとすべての v2 / v3 Pod スライスに対応しています。

Pod ビューアツールを表示するには:

  1. Tensorboard ウィンドウの右上にあるメニューボタンから [Profile] を選択します。
  2. image
  3. ウィンドウの左側にある [Tools] メニューをクリックして、[pod_viewer] を選択します。
  4. image

Pod ビューアのユーザー インターフェースには次のものが表示されます。

  1. ステップ スライダー。調べたいステップを選択できます。
  2. トポロジグラフ。TPU システム全体で TPU コアをインタラクティブに視覚化できます。
  3. 通信リンクのグラフ。トポロジグラフの送受信チャネルが視覚的に表示されます。
  4. 送受信チャネルのレイテンシを示す棒グラフ。このグラフの棒にカーソルを合わせると、通信リンクのグラフが表示されます。左側のバーにチャンネル詳細カードが表示され、転送されたデータのサイズ、レイテンシ、帯域幅などのチャンネル情報が表示されます。
  5. ステップ内訳グラフ。すべてのコアステップの内訳が視覚的に表示されます。これは、システムのボトルネックや、システムの処理速度を低下させているコアの特定に使用します。

ステップ スライダー

image

スライダーでステップを選択します。ツールの残りの部分には、そのステップの内訳や通信リンクなどの統計が表示されます。

トポロジグラフ

トポロジグラフには、ホスト、チップ、コアが階層的に表示されます。TPU コアは、最小の長方形で表示されます。2 つのコアが TPU チップを表し、4 つのチップが 1 つのホストを表します。

image

トポロジグラフはヒートマップで、選択したステップで特定の内訳(高 FLOPS、インフィード、送信など)に費やされた時間の割合で色分けされています。トポロジグラフのすぐ下のバー(次の図を参照)には、コアとチップの使用状況が色別で表示されます。コアの色は使用率を表し、黄色から青色の範囲で表示されます。FLOPS が高い計算処理の場合、数値が大きいほど色が濃くなり、計算時間が長くなります。その他の内訳では、数値が小さいほど(色が薄いほど)待機時間が短くなります。他のコアより暗い色の部分は、潜在的な問題が存在しているか、ホットスポットになっています。

システム名の隣にあるプルダウン メニューのセレクタ(上の図で赤丸の部分)をクリックすると、特定の内訳を選択できます。

小さな四角形(単一コア)にカーソルを合わせると、システム内でのコアの位置、グローバル チップ ID、ホスト名などを含むヒントが表示されます。このヒントには、選択した内訳カテゴリの期間も表示されます。たとえば、FLOPS が高い処理の場合、そのステップの使用率が表示されます。

image

通信チャネル

このツールを使用すると、モデルがコア間の通信に使用する送受信リンクが視覚的に表示されます。モデルに send 演算と recv 演算が含まれている場合、チャネル ID セレクタを使用してチャネル ID を選択できます。送信元(src)コアと宛先(dst)コアからのリンクが通信チャネルを表します。送信チャネルと受信チャネルのレイテンシを示すグラフのバーにカーソルを合わせると、チャネルの情報がトポロジグラフに表示されます。

image

左側のバーにカードが表示され、通信チャネルの詳細が表示されます。通常、次のようなカードが表示されます。

image

  1. データ通信量。送受信チャネルで転送されたデータの量が MiB 単位で表示されます。
  2. レイテンシ。送信イベントの開始から受信完了イベントの終了までの時間がマイクロ秒単位で表示されます。
  3. BW。期間内に送信元コアから宛先コアに転送されたデータ量が GiB 単位で表示されます。
  4. 送信遅延。受信完了から送信開始までの時間がマイクロ秒単位で表示されます。send 演算の開始後に recv-done 演算が開始した場合、遅延はゼロになります。
  5. HLO 名。このチャネルに関連付けられた XLA HLO 演算の名前が表示されます。この HLO 名は、他の TensorBoard ツール(op_profile、memory_viewer など)に表示される統計に関連付けられています。

送受信チャネルのレイテンシを表すグラフ

このグラフには、送受信に使用される通信チャネルの詳細が表示されます。このグラフのバーにカーソルを合わせると、上記のトポロジグラフに送受信リンクが表示されます。

image

ステップ内訳グラフ

このグラフには、トレーニングまたは評価ステップの詳細が表示されます。

X 軸はグローバル チップ ID を表し、Y 軸が時間(ミリ秒)を表します。このグラフでは、特定のトレーニング ステップで使用された時間を確認できます。また、ボトルネックの存在や、チップ全体の負荷バランスの問題も確認できます。

image

左側のバーにカードが表示され、ステップ内訳の詳細を確認できます。通常、次のようなカードが表示されます。

image

カードのフィールドには、次の情報が表示されます。

  1. 高 FLOPS 計算。convolution 演算または output fusion 演算に費やされた時間。
  2. 低 FLOPS 計算。合計時間から他のすべての内訳を減算して計算されます。
  3. インフィード。TPU がホストの待機に費やした時間。
  4. アウトフィード。ホストが TPU からの出力を待機した時間。
  5. AllReduce 同期。他のコアとの同期を待機している CrossReplicaSum 演算に費やされた時間。CrossReplicaSum 演算はレプリカ間の合計を計算します。
  6. AllReduce 計算。CrossReplicaSum 演算に費やされた実際の計算時間です。
  7. チップ間の send 演算。send 演算に費やされた時間。
  8. チップ間の recv-done 演算。recv 演算に費やされた時間。

トレース ビューア

トレース ビューアは、[Profile] で利用可能な Cloud TPU パフォーマンス分析ツールです。このツールは、Chrome トレース イベント プロファイリング ビューアを使用するため、Chrome ブラウザでのみ機能します。

トレース ビューアには次のタイムラインが表示されます。

  • TensorFlow モデルによって実行された演算の実行期間。
  • 演算を実行したシステムの部分(TPU またはホストマシン)。通常、ホストマシンがトレーニング データを前処理して TPU に転送する infeed 演算を実行し、TPU は実際のモデル トレーニングを行います。

トレース ビューアを使用して、モデル内のパフォーマンスの問題を特定し、この問題を解決する対策を講じることができます。たとえば、大まかには、インフィードとモデル トレーニングのどちらに大部分の時間を費やしているかどうかを識別できます。さらに詳しく見ると、実行に最も時間がかかっている TensorFlow 演算も識別できます。

トレース ビューアは、Cloud TPU ごとに 1M イベントに制限されています。他のイベントを評価する場合は、代わりにストリーミング トレース ビューアを使用してください。

トレース ビューアのインターフェース

トレース ビューアを開くには、TensorBoard に移動して画面上部の [Profile] タブをクリックします。ビューアが開き、最新の実行結果が表示されます。

image

この画面には、次の主要な要素(上で番号が付けられています)が表示されます。

  1. [Runs] プルダウン。トレース情報をキャプチャしたすべての実行が表示されます。デフォルトのビューは最新の実行ですが、プルダウンを開いて別の実行を選択することもできます。
  2. [Tools] プルダウン。さまざまなプロファイリング ツールを選択します。
  3. [Host] プルダウン。Cloud TPU セットを含むホストを選択します。
  4. [Timeline] ペイン。Cloud TPU とホストマシンで実行された演算が時系列で表示されます。
  5. [Details] ペイン。[Timeline] ペインで選択した演算の詳細情報が表示されます。

では、[Timeline] ペインについて詳しく見てみましょう。

image

[Timeline] ペインには、次の要素が含まれます。

  1. 上部バー。さまざまな補助コントロールが表示されます。
  2. 時間軸。トレースの開始位置を基準にした時間が表示されます。
  3. セクションとトラックラベル。各セクションには複数のトラックが含まれています。左側にある三角形をクリックすると、セクションの展開や折りたたみを行うことができます。システムで処理中の要素ごとに 1 つのセクションがあります。
  4. ツールセレクタ。トレース ビューアを操作するさまざまなツールが用意されています。
  5. イベント。これらのイベントは、演算が実行されていた時間やトレーニング ステップなどのメタイベントの期間を示します。
  6. 垂直タブバー。Cloud TPU での使用は適しません。このバーは、Chrome が提供する汎用のトレース ビューアツールの一部で、さまざまなパフォーマンス分析タスクに使用されます。
セクションとトラック

トレース ビューアには、次のセクションがあります。

  • TPU ノードごとに 1 つのセクション。ラベルとして TPU チップの数とチップ内の TPU ノードの数が使用されます(例: 「Chip 2: TPU Core 1」)。TPU ノードのセクションには、次のトラックが含まれます。
    • Step。TPU で実行されていたトレーニング ステップの期間が表示されます。
    • TensorFlow Ops。TPU 上で実行される TensorFlow 演算が表示されます。
    • XLA Ops。TPU 上で実行される XLA 演算が表示されます。1 つの TensorFlow 演算が 1 つ以上の XLA 演算に変換されます。XLA コンパイラにより、XLA 演算が TPU 上で実行されるコードに変換されます。
  • ホストマシンの CPU 上で実行されるスレッドのセクション。「Host Threads」というラベルが付いています。このセクションには、CPU スレッドごとに 1 つのトラックが含まれます。注: セクション ラベルと一緒に表示される情報は無視してもかまいません。
タイムラインのツールセレクタ

TensorBoard のタイムライン ツールセレクタを使用して、タイムライン ビューを操作できます。タイムライン ツールをクリックするか、次のキーボード ショートカットを使用してツールをアクティブにできます。タイムライン ツールセレクタを移動するには、上部の点線部分をクリックしてセレクタを目的の場所にドラッグします。

タイムライン ツールの使い方は次のとおりです。

選択ツール
イベントをクリックして選択します。複数のイベントを選択するにはドラッグします。選択したイベントに関する詳細情報(名前、開始時間、期間)が、詳細ウィンドウに表示されます。

パンツール
ドラッグしてタイムライン ビューを水平方向または垂直方向にパンします。

ズームツール
水平方向(時間軸)に沿って上にドラッグするとズームインし、下にドラッグするとズームアウトします。マウスカーソルの水平位置により、ズームが行われる中心が決まります。

注: ズームツールには、マウスカーソルがタイムライン ビューの外部にあるときにマウスボタンを放すと、ズームがアクティブのままになるという既知のバグがあります。これが発生した場合は、タイムライン ビューを軽くクリックすると、ズームが解除されます。

タイミング ツール
水平方向にドラッグして、時間間隔をマークできます。間隔の長さは時間軸に表示されます。間隔を調整するには、間隔の両端をドラッグします。間隔をクリアするには、タイムライン ビュー内の任意の場所をクリックします。

他のいずれかのツールを選択しても、間隔はマークされたままになることに注意してください。
イベント

タイムライン内のイベントは異なる色で表示されます。色自体には特別な意味はありません。

タイムラインの上部バー

[Timeline] ペインの上部バーには、いくつかの補助コントロールがあります。

image

  1. メタデータ表示。TPU では使用しません。
  2. 表示オプション。TPU では使用しません。
  3. 検索ボックス。テキストを入力して、名前にそのテキストが含まれるすべてのイベントを検索します。検索ボックスの右側にある矢印ボタンをクリックして、一致するイベントを順方向および逆方向に移動することで順番に各イベントを選択します。
  4. コンソール ボタン。TPU では使用しません。
  5. ヘルプボタン。クリックしてヘルプのサマリーを表示します。
キーボード ショートカット

トレース ビューアでは、次のキーボード ショートカットを使用できます。上部バーにあるヘルプボタン(?)をクリックすると、さらに多くのキーボード ショートカットが表示されます。

    w Zoom in
    s Zoom out
    a Pan left
    d Pan right
    f Zoom to selected event(s)
    m Mark time interval for selected event(s)
    1 Activate selection tool
    2 Activate pan tool
    3 Activate zoom tool
    4 Activate timing tool

f は非常に便利なショートカットです。ステップを選択して f を押すと、そのステップにすばやくズームインできます。

特徴的なイベント

TPU のパフォーマンスを分析する際に非常に役立つイベントタイプがあります。

image

  • InfeedDequeueTuple。この TensorFlow 演算は TPU 上で実行され、ホストから送信される入力データを受信します。インフィードに時間がかかっている場合、ホストマシン上のデータを前処理する TensorFlow 演算が、TPU でデータを消費できる速度に追いついていない可能性があります。InfeedEnqueueTuple というホストトレースで、該当するイベントを確認できます。より詳細な入力パイプラインの分析結果を表示するには、Input Pipeline Analyzer ツールを使用してください。

  • CrossReplicaSum。この TensorFlow 演算は TPU 上で実行され、レプリカ全体の合計を計算します。各レプリカは異なる TPU ノードに対応しているため、演算では、すべての TPU ノードでステップが完了するまで待機する必要があります。この演算に時間がかかる場合は、演算自体が遅いのではなく、TPU ノードがデータ インフィードの遅い別の TPU ノードを待機している可能性があります。

image

  • Dataset Ops。データが Dataset API で読み込まれると、トレース ビューアがデータセット演算を視覚的に表示します。この例の Iterator::Filter::Batch::ForeverRepeat::Memory がコンパイルされ、dataset.map() 演算に対応します。トレース ビューアで読み込みオペレーションを調査し、デバッグを実行しながら入力パイプラインのボトルネックを軽減できます。

image

  • Prefetch Threadsdataset.prefetch() を使用して入力データをバッファリングすると、入力パイプラインでボトルネックとなるファイル アクセスの散発的な減速を防ぐことができます。
うまくいかない場合

トレース ビューアを使用する場合は、次の点に注意してください。

  • 表示されるイベント数の上限。イベント ビューアには、最大で 100 万件のイベントが表示されます。これ以上のイベントをキャプチャした場合、最初の 100 万件のイベントが表示され、それ以降のイベントは破棄されます。より多くの TPU イベントをキャプチャするには、--include_dataset_ops=False フラグを使用して、capture_tpu_profile がデータセット演算を除外するように指定する必要があります。
  • 非常に長いイベント。キャプチャの開始前に発生したイベントと、キャプチャの終了後に発生したイベントはトレース ビューアに表示されません。結果として、非常に長いイベントが表示されない場合があります。
  • トレース キャプチャを開始するタイミング。トレース キャプチャは、Cloud TPU の稼働を確認した後に開始してください。稼働前に開始すると、イベント ビューアにイベントが表示されないことがあります。また、少数のイベントしか表示されないこともあります。--duration_ms フラグを使用すると、プロファイリング時間を延長できます。--num_tracing_attempts フラグを使用すると、自動再試行を設定できます。次に例を示します。

    (vm)$ capture_tpu_profile --tpu=$TPU_NAME
    --logdir=${MODEL_DIR} --duration_ms=60000 --num_tracing_attempts=10
    

メモリビューア

メモリビューアには、プログラムのピーク時のメモリ使用量と、プログラムの存続時間全体でのメモリ使用の傾向が視覚的に表示されます。

メモリビューアの UI は次のようになります。

image

  1. [Host] プルダウン。表示する TPU ホストと XLA High Level Optimizer(HLO)モジュールを選択します。
  2. メモリの概要。ピーク時のメモリ割り当てとパディングなしのサイズが表示されます。
  3. 作業スペースグラフ。ピーク時のメモリ使用量とプログラムの存続期間全体でのメモリ使用の傾向が表示されます。バッファグラフに表示されているバッファにカーソルを合わせると、バッファの存続期間とバッファの詳細カードの注釈が表示されます。
  4. バッファグラフ。ピーク時のメモリ使用量の時点(作業スペースのプロットの縦線)でのバッファ割り当てを表示する 2 つのグラフが表示されます。いずれかのバッファグラフに表示されているバッファにカーソルを合わせると、作業スペースグラフにバッファの存続期間バーが表示され、左側に詳細カードが表示されます。
  5. バッファ割り当て詳細カード。バッファの割り当て詳細が表示されます。
メモリ概要パネル

メモリの概要パネルには、合計バッファ割り当てサイズが最大に達したときのモジュール名とピークメモリ割り当てが表示されます。比較のため、パディングされていないピーク割り当てサイズも表示されます。

image

作業スペースグラフ

このグラフには、ピーク時のメモリ使用量とメモリ使用の傾向が表示されます。プロットの上から下に描かれた線は、プログラムのピーク時のメモリ使用率を表します。このポイントにより、プログラムが使用可能なグローバル メモリ空間に収まるかどうか判断できます。

image

プロット上の各ポイントは、コンパイラによってスケジュールされた、XLA の HLO プログラムにおける「プログラム ポイント」を表します。この線を見ると、ピーク時の使用量に起因する急激な変化がわかります。

バッファグラフ要素の操作

作業スペースグラフの下のバッファグラフに表示されているバッファにカーソルを合わせると、作業スペースグラフにバッファの存続期間が水平線で表示されます。水平線は、強調表示されたバッファと同じ色で表示されます。

image

水平線の太さは、ピーク時のメモリ割り当てに対する相対的なバッファサイズを表します。線の長さはバッファの存続期間を表します。プログラムでバッファ領域が割り当てられてから領域が解放されるまでの期間を表します。

バッファグラフ

2 つのグラフで、ピーク時のメモリ使用量(グラフ上でのプロットの縦線)の詳細が表示されます。

image

  • By Program Order。プログラムの実行中にアクティブだったバッファが左から順に表示されます。アクティブな時間が最も長かったバッファが左側に表示されます。

  • By Size。プログラム実行中にアクティブだったバッファがサイズの降順で表示されます。ピーク時のメモリ使用量に最も大きな影響を与えたバッファが左側に表示されます。

バッファ割り当て詳細カード

バッファグラフに表示されているバッファにカーソルを合わせると、バッファ割り当て詳細カードが表示されます(作業スペースグラフにはバッファの存続期間を表す水平線が表示されます)。通常、次のような詳細カードが表示されます。

image

  1. 名前。XLA 演算の名前。
  2. カテゴリ。演算カテゴリ。
  3. サイズ。バッファ割り当てサイズ(パディングを含む)。
  4. パディングなしのサイズ。パディングなしのバッファ割り当てサイズ。
  5. 拡張。パディングありとパディングなしの場合のバッファサイズの違い。
  6. 追加メモリ。パディングのために余分に使用されるメモリ量。
  7. 形状。N 次元配列のランク、サイズ、データ型。
  8. TensorFlow 演算名。バッファ割り当てに関連した TensorFlow 演算の名前。
  9. 割り当てタイプ。バッファ割り当てのカテゴリです。タイプには、Parameter、Output、Thread-local、Temporary(fusion 内のバッファ割り当てなど)があります。
メモリ不足エラー

モデルの実行中にメモリ不足エラーが発生した場合は、次のコマンドを使用してメモリ プロファイルを取得し、メモリビューアで確認します。プロファイリング時間がプログラムのコンパイル時間と重なるように、適切な duration_ms を設定してください。次のコマンドの出力は、エラーの原因を特定するのに役立ちます。

(vm)$ capture_tpu_profile --tpu=$TPU_NAME --logdir=${MODEL_DIR} --duration_ms=60000

ストリーミング トレース ビューア

ストリーミング トレース ビューア(trace_viewer)は、TensorFlow 1.14 以降で利用可能な Cloud TPU パフォーマンス分析ツールで、動的なトレース レンダリングを行います。このツールは、Chrome トレース イベント プロファイリング ビューアを使用するため、Chrome ブラウザでのみ機能します。

capture_tpu_profile 1.14 を使用してプロファイルをキャプチャすると、.tracetable ファイルが Google Cloud Storage バケットに保存されます。このファイルには大量のトレース イベントが記録されます。このイベントは、トレース ビューアとストリーミング トレース ビューアの両方で確認できます。

ストリーミング トレース ビューアの使用

ストリーミング トレース ビューア trace_viewer を使用するには、既存の TensorBoard セッションをシャットダウンし、検査する TPU の IP アドレスを使用して TensorBoard を再起動する必要があります。ストリーミング トレース ビューアを使用するには、Google Remote Procedure Call(GRPC)で TensorBoard を Cloud TPU の IP アドレスに接続する必要があります。GRPC チャネルは暗号化されません。

GCP Console で Cloud TPU ホストの IP アドレスを確認するには、TPU のページを開き、表示されたテーブルで、トレースを表示する Cloud TPU の名前を探します。

image

Cloud TPU の [内部 IP] 列に IP アドレス [TPU_IP] が表示されています。

image

VM で、次のように TensorBoard を実行します。

(vm)$ tensorboard --logdir=${MODEL_DIR} --master_tpu_unsecure_channel=[TPU_IP]

[Tools] プルダウン リストに trace_viewer ツールが表示されます。

image

タイムラインでズームインまたはズームアウトを行うと、トレース イベントの負荷をブラウザで動的に確認できます。

image

Cloud TPU ジョブのモニタリング

このセクションでは、capture_tpu_profile を使用して単一プロファイルをキャプチャする方法について説明します。また、コマンドライン インターフェースで Cloud TPU ジョブをリアルタイムでモニタリングする方法についても説明します。--monitoring_level オプションを 0(デフォルト)、1 または 2 に設定すると、それぞれ単一プロファイルの生成、基本モニタリング、詳細モニタリングが実行されます。

  1. 新しい Cloud Shell を開いて VM に SSH で接続します(コマンドの $vm は VM 名に置き換えます)。

    gcloud compute ssh $vm --ssh-flag=-L6006:localhost:6006
    
  2. 新しい Cloud Shell で、--monitoring_level フラグに 1 または 2 を設定して capture_tpu_profile を実行します。次に例を示します。

    (vm)$ capture_tpu_profile --tpu=$TPU_NAME  --monitoring_level=1
    

monitoring_level=1 を設定すると、次のような出力が生成されます。

    TPU type: TPU v2
    Utilization of TPU Matrix Units is (higher is better): 10.7%

monitoring_level=2 に設定すると、より詳細な情報が表示されます。

    TPU type: TPU v2
    Number of TPU Cores: 8
    TPU idle time (lower is better): 0.091%
    Utilization of TPU Matrix Units is (higher is better): 10.7%
    Step time: 1.95 kms (avg), 1.90kms (minute), 2.00 kms (max)
    Infeed percentage: 87.5% (avg). 87.2% (min), 87.8 (max)

モニタリング フラグ

  • --tpu(必須)。モニタリングする Cloud TPU の名前を指定します。
  • --monitoring_levelcapture_tpu_profile の動作を単一プロファイルの作成から基本モニタリングまたは詳細な連続モニタリングに変更します。次の 3 つのレベルがあります。レベル 0(デフォルト): 単一プロファイルを生成して終了します。レベル 1: TPU のバージョンと TPU の使用率を表示します。レベル 2: TPU の使用率、TPU にアイドル時間、使用済みの TPU コア数が表示されます。min、avg、max のステップ時間と、インフィードの割合も表示されます。
  • --duration_ms(任意、デフォルトは 1000ms)。各サイクルで TPU ホストをプロファイリングする時間を指定します。一般に、少なくとも 1 トレーニング ステップ分のデータを取得するのに十分な長さにする必要があります。1 秒に設定すると、ほとんどのモデルでトレーニング ステップをキャプチャしますが、モデルのステップ時間が非常に長い場合は、値を 2x step_time (ミリ秒)にできます。
  • --num_queries には capture_tpu_profile の実行サイクルを指定します。TPU ジョブを継続的にモニタリングするには、高い値に設定してください。モデルのステップ時間をすばやく確認するには、値を小さい数値に設定します。
このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...