Cloud TPU ツール

このドキュメントでは、さまざまな Cloud TPU ツールの使用方法について説明します。

前提条件

このガイドのツールを使用する前に、次の前提条件を満たしている必要があります。

Compute Engine VM と TPU リソースを作成する

このガイドのツールを使用する前に、ml-images イメージ ファミリーの tf-1-8 イメージを使用して、Compute Engine VM インスタンスを作成します。Cloud TPU リソースも作成します。手順については、Cloud TPU クイックスタートをご覧ください。

TensorBoard を設定する

大規模なディープ ニューラル ネットワークのトレーニングなど、TensorFlow を使用する計算は複雑でわかりにくい場合があります。TensorFlow プログラムの理解、デバッグ、最適化を容易にするために、TensorBoard と呼ばれる可視化ツールのスイートが組み込まれています。TensorBoard を使用して、TensorFlow グラフを可視化したり、グラフの実行に関する定量メトリックをプロットしたり、TensorBoard を通過する画像などの追加データを表示したりできます。詳細については、tensorflow.org で公開されているチュートリアルに従ってください。

TensorBoard を TensorFlow および Cloud TPU とともに使用するには、いくつかの操作が必要です。

  1. gcloud compute ssh コマンドで Compute Engine VM に接続し、TensorBoard 用のポート転送を設定します。次の例の tpu-demo-vm を TPU ノードの名前に置き換えます。

    gcloud compute ssh tpu-demo-vm -- -L 6006:localhost:6006
    
  2. システムに TensorBoard がインストールされていることを確認します。

    (vm)$ pip freeze | grep tensorboard
    (vm)$ sudo pip install --upgrade "tensorboard>=1.8"
    
  3. model_dir ディレクトリを設定します。TensorBoard と統合するための手間のかかる作業は、Estimator と TPU Estimator により自動的に行われますが、いくつかの構成を行う必要があります。Estimator をビルドする際には、モデルに関するメタデータを保存するために、Cloud Storage バケット内のディレクトリのパスを指定します。

    (vm)$ export STORAGE_BUCKET=gs://[YOUR-BUCKET-NAME]
    (vm)$ export model_dir=${STORAGE_BUCKET}/output
    
  4. 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=1000
    
  5. TensorBoard を実行し、モデル ディレクトリを参照します。

    (vm)$ tensorboard --logdir=${model_dir}
    
  6. ローカル ワークステーションのブラウザで TensorBoard を開きます。ウェブブラウザで http://localhost:6006 に移動し、TensorBoard を表示します。[Graph] タブにモデルの XLA グラフが表示されるはずです。TPU プロファイルをキャプチャしていないため、プロファイラ ツールはまだ表示されません。

Cloud TPU Profiler をインストールする

TPU プロファイルをキャプチャするには、システムに cloud-tpu-profiler == 1.7.0 がインストールされている必要があります。

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

トレース情報をキャプチャする

ツールを使用するには、まず、モデルの実行中にトレース情報をキャプチャする必要があります。VM 上で次のコマンドを実行し、トレースをキャプチャします。

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

デフォルトでは、これにより 2 秒間のトレースがキャプチャされます。duration_ms コマンドライン オプションを使用して、トレース期間を設定できます。ローカル ブラウザで、もう一度 TensorBoard を開きます。これで、[Profile] タブが表示されます。

概要ページ

概要ページには、TPU での実行時のワークロードのパフォーマンスに関する最上位ビューが表示されます。このページでは、次のパネルにデータが表示されます。画像

  • Performance Summary。内容は次のとおりです。

    • サンプリングされたすべてのステップの平均ステップ時間
    • アイドル状態にあるホスト時間の割合
    • アイドル状態にある TPU 時間の割合
    • TPU マトリックス ユニットの使用率
  • Step-time Graph。サンプリングされたすべてのステップのステップ時間(ミリ秒単位)のグラフをプロットします。青色の領域は、ホストからの入力データを待機しているステップ時間部分に対応しており、オレンジ色の領域は、コンピューティング時間に対応しています。

  • Top 10 TensorFlow operations on TPU。TPU 上で行われた TensorFlow 演算のうち、大部分の時間が費やされたものを表示します。[Show] ボタンをクリックすると、次のような表が表示されます。 画像各行は、演算に費やされた自己時間(すべての演算にかかった時間に占める割合)、累積時間、カテゴリ、名前、FLOP 率を示します。

  • Run Environment。内容は次のとおりです。

    • 使用されたホストの数
    • 使用された TPU のタイプ
    • TPU コアの数
    • トレーニング バッチサイズ
  • Recommendation for Next Steps。ワークロードに入力の制限があるかどうかがレポートされます。該当する場合は、問題が入力時間なのか、TPU 時間なのか、この両方であるのかに応じて、ボトルネックを減らすために使用できるツールが提案されます。

XLA グラフ

モデルのコンパイル時には、TPU デバイスでモニタリングされる XLA(Accelerated Linear Algebra)プログラムを表すグラフも生成されます。グラフは model_dir ディレクトリにダンプされ、TensorBoard の [Graphs] タブで確認できます。

グラフのノードは XLA 命令を表します。XLA 命令(add など)が TensorFlow 演算(x/y/z など)から下に配置された場合、x/y/z/add としてグラフに表示されます。

XLA グラフによって、TPU による特定のモデルの実行や、さまざまな演算の入力と出力の形状に関するより多くの情報が得られます。Trace Viewer と組み合わせることで、実行時間の大部分が費やされている場所を把握できます。

画像

注:

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

TPU Compatibility Checker

TensorBoard グラフビューアには、TPU Compatibility Checker が含まれています。このツールは、TPU 使用のためのモデルをコンパイルするときに問題となる可能性のある TensorFlow 演算を警告するツールです。このツールは、TPU で現在使用できない演算について、モデルの TensorFlow グラフをスキャンすることによって機能します。

前提条件

  • モデルグラフをファイルに書き込むようにモデルを構成したことを確認します。tf.estimator API を使用している場合、この構成を行うには Estimator の model_dir プロパティを設定します。
  • TPU Compatibility Checker では、手動デバイス割り当てを使用して TPU 以外のデバイスに明示的に割り当てられた演算はチェックされません。たとえば、GPU に明示的に割り当てられた演算はスキップされます。そのような割り当てがある場合は、TPU 上で実行するすべての演算について、手動割り当てを削除します。

TPU Compatibility Checker の使用

TPU Compatibility Checker にアクセスするには、TensorBoard の [Graphs] タブを開きます。[Choose File] ボタンをクリックすると、任意のモデルのグラフをアップロードして確認できます。左側の構成ペインで、[Color] セクションに移動し、[TPU Compatibility] オプションを選択します。

画像

モデルグラフは次のようになります(例として Abalone チュートリアルを使用)。

画像

TPU と互換性のある演算は緑色で、TPU と互換性のない演算は赤色で表示されます。 互換性のある演算と互換性のない演算の両方を含むグラフノードには、含まれているそれぞれの演算の割合に比例して、両方の色が表示されます。

画面の右側には、互換性の概要が表示されます。

画像

上部の割合は、すべての演算における TPU と互換性がある演算の割合を表します。その下には、互換性のない演算が一覧表示されています。これらの演算のいずれかをクリックすると、メインのグラフビューでその演算が選択され、必要に応じてノードが展開されて、演算が表示されます。

結果の解釈

Abalone の例は、TPU Compatibility Checker の結果をどのように解釈するかを示しています。ここで、互換性の概要をもう一度示します。

画像

説明のために、使用できないいくつかの演算を含む理論上の互換性の概要を示しています。

このモデルの実行時、手動デバイス割り当ては指定されませんでした。その結果、Compatibility Checker により、常に CPU 上で実行する必要がある演算を含め、すべての演算がチェックされました。さまざまな「save」や「report_uninitialized_variables」の演算が確実にこのカテゴリに当てはまります。

これにより、問題となる可能性のある 3 つの演算、つまり GradientDescent 演算と root_mean_squared_error の 2 つの AssignAdd 演算が残ります。

GradientDescent ノードを見てみましょう。

画像

互換性のない演算は、グローバル ステップ数を更新する AssignAdd です。通常、この演算は CPU 上で実行されるため、問題にはなりません。

次に 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 上で実行することもできます。したがって、これも問題ではありません。結論として、このモデルは TPU 上で実行する準備ができています。

Trace Viewer

Trace Viewer は、TensorBoard に統合されたパフォーマンス分析ツールです。Trace Viewer に含まれるタイムラインには、次のものが表示されます。

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

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

ユーザー インターフェースの概要

Trace Viewer を開くには、TensorBoard に移動して、画面の上部にある [Profile] タブをクリックします。次のような出力が表示されます。

画像

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

  1. [Runs] プルダウン。トレース情報をキャプチャしたすべての実行が含まれます。デフォルトでは、Trace Viewer で最新の実行が開きます。プルダウンを開いて、別の実行を選択できます。
  2. [Tools] プルダウン。別のプロファイリング ツールを選択します。
  3. [Host] プルダウン。別の TPU からのトレースを選択して表示します。
  4. [Timeline] ペイン。ある期間にわたって TPU とホストマシンで実行された演算を表示します。
  5. [Details] ペイン。[Timeline] ペインで選択した演算の追加情報を表示します。

[Timeline] ペインを詳しく見てみましょう。

画像

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

  1. 上部バー。さまざまな補助コントロールが含まれます。
  2. 時間軸。トレースの開始点を基準にした時間を示します。
  3. セクションとトラックラベル。各セクションには複数のトラックが含まれており、左側にある三角形をクリックすると、セクションを展開したり折りたたんだりできます。システムで処理中の要素ごとに 1 つのセクションがあります。セクションとトラックについては、後で詳しく説明します。
  4. ツールセレクタ。Trace Viewer を操作するためのさまざまなツールが含まれます。
  5. イベント。これらのイベントは、演算が実行されていた時間やトレーニング ステップなどのメタイベントの期間を示します。
  6. 垂直タブバー。このバーは、TPU ではあまり使用しません。このバーは、Trace Viewer がさまざまなパフォーマンス分析タスクに使用される Chrome 提供の汎用ツールであることから存在します。次に、使用頻度の高いセクション、トラック、イベントについて説明します。

セクションとトラック

Trace Viewer には、次のセクションが含まれます。

  • TPU ノードごとに 1 つのセクション。TPU チップの数とチップ内の TPU ノードの数でラベル付けされています(「Chip 2: TPU Core 1」など)。各 TPU ノード セクションには、次のトラックが含まれます。
    • Step: このトラックには、TPU で実行されていたトレーニング ステップの期間が表示されます。
    • TensorFlow Ops: TPU 上で実行される TensorFlow 演算。
    • XLA Ops: XLA 演算。各 TensorFlow 演算は、1 つまたは複数の XLA 演算に変換されます。次に、XLA コンパイラにより、これらの XLA 演算は TPU 上で実行されるコードに変換されます。
  • Host Threads」というラベルの付いた、ホストマシンの CPU 上で実行されるスレッドの追加セクション。このセクションには、CPU スレッドごとに 1 つのトラックが含まれます。注: 他にもいくつかの情報が、セクション ラベルの横に表示されます(「n-e93653ba-w-0」や「pid 49」など)。この情報は内部的な理由のために表示されるものなので、無視してかまいません。

ツールセレクタ

ツールセレクタには、タイムライン ビューを操作する際に使用できるツールが含まれます。ツールをクリックしてアクティブにします(または、後で説明するようにキーボード ショートカットを使用します)。現在アクティブなツールがハイライト表示されます。上部の点線の領域をクリックしてドラッグすると、画面上でツールセレクタを移動できます。

次に、個々のツールの機能を示します。

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

パンツール
クリックしてドラッグし、タイムライン ビューを水平および垂直にパンします。

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

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

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

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

イベント

イベントにはさまざまな色が使用され、視覚的に区別しやすくなっています。色自体に特別な意味はありません。

上部バー([Timeline] ペイン)

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

画像

  1. Metadata display: TPU では使用しません。
  2. View Options: TPU では使用しません。
  3. 検索ボックス: テキストを入力して、名前にそのテキストが含まれるすべてのイベントを検索します。検索ボックスの右側にある矢印ボタンをクリックして、一致するイベントを順方向および逆方向に移動することで順番に各イベントを選択します。
  4. [Console] ボタン: TPU では使用しません。
  5. [Help] ボタン: クリックすると、クイックヘルプの概要が表示されます。

キーボード ショートカット

次に、Trace Viewer で使用できるキーボード ショートカットをいくつか示します。上部バーの [Help] ボタンをクリックすると、キーボード ショートカットがさらに表示されます。

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 のパフォーマンスを分析する際に主要なイベントタイプを示します。

画像

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

  • CrossReplicaSum: この TensorFlow 演算は TPU 上で実行され、レプリカ全体の合計を計算します。各レプリカは異なる TPU ノードに対応しているため、この演算では、すべての TPU ノードでステップが完了するのを待機する必要があります。この演算に多くの時間が費やされる場合、通常、合計自体が遅いのではなく、TPU ノードが他の一部の TPU ノードを待機していることを意味します。これは、多くの場合、データ インフィードが遅いために他の TPU ノードが遅延されたことが原因で発生します。

画像

  • データセット演算: データセット API を使用してデータを読み込む場合、Trace Viewer によりこれらのデータセット演算が可視化されます。この例の Iterator::Filter::Batch::ForeverRepeat::Memory はコンパイルされ、dataset.map() 演算に対応します。Trace Viewer でこれらの演算を確認すると、入力パイプラインのボトルネックをデバッグして軽減するのに役立ちます。

画像

  • プリフェッチ スレッド: dataset.prefetch() を使用して入力データをバッファします。この手法は、入力パイプラインにボトルネックを引き起こすファイル アクセスの散発的な遅延を防ぎます。dataset.prefetch() 演算がキャプチャされると、プリフェッチ スレッドが Trace Viewer に表示されます。

うまくいかない場合

次に、Trace Viewer を使用する際に注意すべきいくつかの潜在的な「落とし穴」を示します。

  • イベント表示制限: Trace Viewer には、最大で 100 万件のイベントが表示されます。キャプチャするイベントがこれよりも多くなると、先にキャプチャした 100 万件のイベントのみが表示され、それ以降のイベントは破棄されます。より多くの TPU イベントをキャプチャするために、--include_dataset_ops=False フラグを使用して、capture_tpu_profile でデータセット演算が除外されるよう明示的に指定できます。
  • 非常に長いイベント: キャプチャの開始前に開始したイベントやキャプチャの終了後に終了したイベントは Trace Viewer に表示されません。これは、非常に長いイベントがキャプチャされない可能性があることを意味します。
  • トレース キャプチャを開始するタイミング: トレース キャプチャの開始が早すぎると、TPU がまだ起動中で、少数のイベントしか表示されなかったり、イベントがまったく表示されなかったりする場合があります。トレース イベントが収集されていない場合には、--duration_ms フラグや --num_tracing_attempts フラグを追加してプロファイリング期間を増加し、トレース コレクションを自動的に再試行できます。

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

Op Profile

TensorBoard には、プロファイリング期間中に実行された XLA 演算のパフォーマンス統計を表示する、Op Profile というツールも含まれています。Op Profile には、次のものが表示されます。

  • アプリケーションでの TPU の使用状況。報告される TPU FLOPS 使用率は、TPU 上で使用可能なピーク FLOPS に正規化された、1 秒間の浮動小数点演算(FLOPS)の測定数値として定義されます。
  • 最も時間のかかる演算。これらの演算は、最適化の潜在的なターゲットとなります。
  • 形状、パディング、式などの個々の演算の詳細。

Op Profile は、モデルで TPU がどの程度適切に使用されているかを把握し、最適化にふさわしいターゲットを見つけるのに役立ちます。たとえば、モデルにより TPU のピーク FLOPS の 5% しか達成されない場合、どの XLA 演算に最も長い実行時間がかかり、どの程度の TPU FLOPS がこれらの演算に消費されているのかを、ドリルダウンして識別できます。

Op Profile の使用

プロファイルを収集すると同時に、capture_tpu_profile では、XLA 演算のパフォーマンス統計を含む op_profile.json ファイルも収集されます。Op Profile を開くには、TensorBoard に移動して、画面の上部にある [Profile] タブをクリックします。[Tools] プルダウンから op_profile を選択します。次のような出力が表示されます。

画像

  1. 概要セクション。TPU 全体の使用率と、プロファイル期間内で最も多くの時間を費やす演算が表示されます。また、このツールには、該当の演算でチップの計算能力がどの程度適切に使用されているか、および最適化のための提案も示されます。
  2. コントロール パネル。左側のバーをスライドして、XLA カテゴリごとに表示する演算数を選択できます。また、右側のボタンを切り替えて、合計実行時間の 90 パーセンタイル以内の演算のみを一覧表示することもできます。
  3. 演算テーブル。カテゴリ別の XLA 演算が、費やされた時間で降順にソートされ、一覧表示されます。
  4. 演算詳細カード。テーブル エントリの上にカーソルを合わせると、FLOPS 利用率、XLA 式、レイアウトなど、演算に関する詳細を示すカードが表示されます。

演算テーブル

テーブル内の各エントリには複数の列があり、左側にある三角形をクリックすると、エントリを展開したり折りたたんだりできます。演算カテゴリごとに 1 つのエントリがあります。テーブルには、各カテゴリについて時間、演算カテゴリ名、関連付けられる TensorFlow 演算の名前、その FLOPS 使用率が表示されます。

画像

  1. 時間。該当カテゴリ内のすべての演算によって費やされた時間の合計割合が表示されます。クリックするとエントリが展開され、個々の演算によって費やされた時間の内訳が表示されます。
  2. 水平バー。カテゴリ間の時間分布が可視化されます。
  3. 上位 10 個の演算。クリックして各カテゴリを展開すると、大部分の時間を費やしている上位 10 個の演算が一覧表示されます。さらに、fusion 演算エントリを展開すると、含まれている fusion 以外の要素ごとの演算を表示できます。
  4. TensorFlow 演算。XLA 演算に関連付けられる TensorFlow 演算名が表示されます。
  5. FLOPS。FLOPS 使用率(デバイスのピーク FLOPS に正規化された測定 FLOPS)が表示されます。FLOPS 使用率が高いほど、演算が速く実行されるのでパフォーマンスが向上します。テーブルセルは色分けされています。FLOPS 使用率が高い場合には緑色(良好)、FLOPS 使用率が低い場合には赤色(不良)です。

演算詳細カード

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

画像

  1. 名前。XLA 演算名が表示されます。
  2. カテゴリ。演算カテゴリが表示されます。
  3. FLOPS utilization。値と色分けされた進行状況バーが含まれます。
  4. Memory utilization。演算を実行するときに消費されるメモリ帯域幅の割合が表示されます。
  5. Expression。演算の XLA 式が表示されます。
  6. Layout(オプション)。テンソルの形状とレイアウトが表示されます。レイアウトは、畳み込み演算についてのみ表示されることに注意してください。このツールには、テンソルの形状がマトリックス ユニットに正確に一致しているかどうか、およびその形状がどのようにパディングされているかも表示されます。

結果の解釈

説明のために、このセクションでは、上の例に示した数値について簡単に解釈します。モデル全体では、デバイスによって実現可能な最大 FLOPS の 8.1% に達します。infeedcross-replica-sum が実行時間の大部分を占めていますが、FLOPS が非常に低いロングテールの vector 演算や scalar 演算も存在します。1 つの最適化戦略としては、Input Pipeline Analyzer ツールを使用して、モデルの入力パイプラインを改善します。

畳み込み演算では、次の理由により、TPU FLOPS の使用率も低下する可能性があります。

  • パディングやマトリックス ユニットが部分的にのみ使用されている
  • 畳み込み演算がメモリバウンドである

次の例では、%convolution.399 の FLOPS 使用率は、前の例の %convolution.395 より低くなっています。

画像

そのレイアウトを詳しく見てみると、16 から 128 までのパディングが存在します。これは、マトリックス ユニットの半分のみが効果的に使用されていることを示します。したがって、正確に一致していた前のケースと比較すると、FLOPS 使用率ははるかに低くなります。

別の例では、%reduce の FLOPS 使用率は、メモリ帯域幅が完全に使用されているため、低くなっています。

画像

Input Pipeline Analyzer

TensorBoard には、TensorFlow 入力パイプラインを分析するための強力なツールが備わっています。TensorFlow プログラムによりデータがファイルから読み取られる場合、データは、TensorFlow グラフの先頭でパイプライン方式により読み取られます。読み取りプロセスは連続した複数のデータ処理ステージに分割され、1 つのステージの出力が次のステージの入力となります。ファイルを読み取るこのプロセスは、入力パイプラインと呼ばれます。

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

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

入力パイプラインが非効率な場合、アプリケーションの速度が大幅に低下する可能性があります。アプリケーションで入力パイプラインに大部分の時間が費やされる場合、このアプリケーションは入力バウンドであると言います。このツールにより、収集されたさまざまなパフォーマンス データに基づいて、入力パイプラインのパフォーマンスが詳細に分析されます。大まかには、このツールにより、プログラムが入力バウンドかどうかがわかります。そうである場合は、このツールを使用してデバイスやホスト側の分析を確認し、ボトルネックとなっているパイプラインのステージをデバッグすることもできます。

ユーザー インターフェースの概要

Input Pipeline Analyzer ツールにより、input_pipeline.json ファイル(これも capture_tpu_profile によって収集されます)からパフォーマンス分析結果が読み取られます。Input Pipeline Analyzer を開くには、[Tools] プルダウンから [input_pipeline_analyzer] を選択します。分析には、3 つのセクションが含まれます。

画像

  1. 概要。入力パイプライン全体の分析を示します。具体的には、アプリケーションが入力バウンドかどうか、およびその程度が表示されます。
  2. デバイス側の分析。デバイスのステップ時間や入力データの待機に費やされた時間など、詳細なデバイス側の分析結果が表示されます。
  3. ホスト側の分析。ホスト上での入力処理時間の内訳や各入力演算の詳細を示す表形式ビューなど、ホスト側での詳細な分析が表示されます。

アプリケーションが入力バウンドかどうかの見分け方

セクション 1 は、全体的な分析の概要です。このセクションでは、(ホストからの入力の待機に費やされたデバイス時間の割合という観点で)TPU プログラムが入力バウンドであるかどうか、およびその程度が報告されます。また、インストルメントされた標準の入力パイプラインを使用している場合は、ツールにより、どこで大部分の入力処理時間が費やされたかが報告されます。次に例を示します。

画像

デバイス側の分析

セクション 2 には、デバイス側の分析の詳細が表示されます。これにより、デバイスとホストで費やされる時間を対比して把握し、ホストからの入力データの待機に費やされるデバイス時間を把握できます。

画像

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

ホスト側の分析

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

  • ファイルからのオンデマンドのデータ読み取り。これは、キャッシュ、プリフェッチ、インターリーブなしで、ファイルからデータを読み取る際に費やされた時間です。
  • ファイルからの事前のデータ読み取り。キャッシュ、プリフェッチ、インターリーブなどです。
  • データの前処理。画像の解凍などです。
  • デバイスに転送するデータのエンキュー。通常、TensorFlow によって呼び出され、デバイスに転送する前に、データはインフィード キューに追加されます。

画像

実行時間の内訳に個々の入力演算の統計とそのカテゴリを表示するには、[Show Input Op statistics] ボタンをクリックします。次のようなテーブルが表示されます。

画像

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

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

Memory Viewer

Memory Viewer を使用すると、プログラムのピークメモリ使用量や、メモリ使用量がプログラムの存続期間にわたってどのように変化するかを可視化できます。

Memory Viewer の UI は次のようになります。

画像

  1. [Hosts] プルダウン。可視化する TPU と XLA モジュールを選択します。
  2. 概要セクション。ピークメモリ割り当てとパディングなしのサイズが表示されます。
  3. メモリ使用量の折れ線グラフ。メモリ使用量が、プログラムの存続期間にわたってどのように変化するかが表示されます。
  4. 下の 2 つのディスプレイ。ピーク使用量のプログラム ポイント(最上位にあるプロットの縦線により指定)におけるメモリ使用量の内訳が表示されます。
  5. 演算詳細カード。下のディスプレイで分割されたバッファの上にカーソルを合わせると、演算に関する詳細を示すカードが左側に表示されます。たとえば、カードには、メモリ割り当てサイズ、パディングされていないサイズ、形状、TensorFlow 演算名、割り当てタイプが表示されます。

概要セクション

このセクションの上部には、モジュール名と、合計バッファ割り当てサイズが最大に達したときのピークメモリ割り当てが表示されます。パディングが原因で追加メモリがどの程度消費されるかわかるように、パディングされていないピーク割り当てサイズも小さいフォントで表示されています。

メモリ使用量の折れ線グラフ

画像

一番上のディスプレイには、メモリ使用量が、プログラムの存続期間にわたってどのように変化するかが表示されます。プロットの上から下に描かれた線は、プログラムでメモリ使用率がピークになったポイントを示します。

プロット上の各ポイントは、コンパイラによってスケジュールされた、XLA の High Level Optimizer(HLO)プログラムにおける「プログラム ポイント」を表します。

このように「プログラム ポイントと対比した」最上位プロットにより、ピーク使用量の原因となる、またはピーク使用量に起因する急激な変化を感じ取ることができます。実際に重要なのはピーク使用量のみなので、事実上、ピーク使用量によりプログラムが使用可能なグローバル メモリ空間に収まるかどうかが判断されます。

下のディスプレイ

一番上のディスプレイの下には 2 つのディスプレイがあり、ピーク使用量のプログラム ポイント(最上位にあるプロットの縦線により指定)におけるメモリ使用量の内訳が表示されます。

[By Program Order] ディスプレイには、プログラムの実行中にアクティブだった順に、バッファが表示されます。したがって、最も長時間アクティブだったバッファに関心がある場合は、このディスプレイの左側を見てください。

[By Size] ディスプレイには、サイズの降順でバッファが表示されるため、ピークメモリ使用量のポイントに最も大きな影響を及ぼすバッファを確認できます。

バッファ詳細カードと存続期間

これらのディスプレイで分割されたバッファの上にカーソルを合わせると、バッファ割り当ての詳細を示すカードが左側に表示されます。通常、次のようなカードが表示されます。

画像

  • 名前。XLA 演算名が表示されます。
  • カテゴリ。演算カテゴリが表示されます。
  • サイズ。バッファ割り当て(パディングを含む)のサイズが表示されます。
  • パディングされていないサイズ。パディングなしのバッファ割り当てのサイズが表示されます。
  • 拡張。パディングされていないサイズと対比したパディングされたバッファサイズの相対的な大きさです。このメトリックは、パディングに使用される追加メモリの量を示します。
  • 形状。N 次元配列のランク、サイズ、データ型が記述されます。
  • Tf 演算名。この割り当てに関連付けられる TensorFlow 演算名が表示されます。
  • 割り当てタイプ。バッファ割り当てが分類されるカテゴリが、Parameter、Output、Thread-local、Temporary(fusion 内のバッファ割り当てなど)タイプとして表示されます。

画像

分割されたバッファの上にカーソルを合わせると、メモリ使用量の折れ線グラフ上のピークと対比した、バッファサイズの相対的な大きさを確認することもできます。この色付きの四角形は、バッファの存続期間を示します。左側の境界は、バッファが割り当てられたときのプログラム ポイントで、右側の境界は、バッファが解放されたときのプログラム ポイントです。

メモリ不足エラーのデバッグ

ヒント: プロファイルのコンパイルが失敗する場合は、Cloud TPU Profiler 1.7.0 を使用して、メモリ プロファイルをキャプチャできます。コンパイルが失敗したら、次のコマンドを実行してください。

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

Streaming Trace Viewer

上の Trace Viewer では、1 つのトレースについて 100 万個のイベントに制限されます。より多くのイベントを可視化できるように、Streaming Trace Viewer という新機能が追加されています。これにより、ブラウザでトレース イベントを動的に読み込むことができます。

ツールの使用方法

TensorFlow 1.9 以降でプロファイルをキャプチャすると、Google Cloud Storage バケットに保存されているトレース可能ファイルを参照できます。このファイルを表示するには、Google Remote Procedure Call(GRPC)を使用して、TensorBoard を TPU に接続する必要があります。GRPC チャネルは暗号化されていません。Google Cloud Console で、TPU の内部 IP アドレスを見つけます([TPU_IP])。

画像 画像 まず、Google Cloud Console で TPU ページに移動し、右側にある [内部 IP] 列を探します。TPU 名および関連付けられる内部 IP を探します。

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

ツールのプルダウン リストに、traceviewer@ が表示されます。ズームイン / ズームアウトすると、トレース イベントがブラウザに動的に読み込まれます。

画像

ポッド プロファイリングのサポート

Cloud TPU Profiler 1.7.0 と TensorBoard 1.9 では、ポッド全体のプロファイリングがサポートされるようになりました。このツールにより、すべての TPU について集約された overview_page と、入力パイプライン全体の分析が表示されます。[Hosts] プルダウン リストを選択すると、個々の TPU について Trace Viewer、Op Profile、Memory Viewer を表示できます。

このページは役立ちましたか?評価をお願いいたします。

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