Path: blob/master/site/ja/guide/migrate/migration_debugging.ipynb
25118 views
Copyright 2021 The TensorFlow Authors.
TF2 に移行されたトレーニングパイプラインをデバッグする
このノートブックでは、TensorFlow 2(TF2)に移行されたトレーニングパイプラインをデバッグする方法を説明します。内容は以下のとおりです。
トレーニングパイプラインをデバッグするための推奨される手順とコードサンプル
デバッグ用ツール
その他の関連リソース
比較用の TensorFlow 1(TF1.x)コードとトレーニング済みモデルがあり、同等の検証精度を達成する TF2 モデルを構築することを前提とします。
このノートブックは、トレーニングや推論の速度やメモリ使用量に関するデバッグパフォーマンスの問題は取り上げません。
デバッグワークフロー
以下は、TF2 トレーニングパイプラインをデバッグするための一般的なワークフローです。これらの手順を順番に実行する必要はありません。中間ステップでモデルをテストし、デバッグ範囲を絞り込む二分探索アプローチを使用することもできます。
コンパイルエラーとランタイムエラーを修正する
シングルフォワードパスの検証(別のガイド)
a. 単一の CPU デバイスの場合
変数が 1 回だけ作成されることを確認する
変数の数、名前、形状が一致していることを確認する
すべての変数をリセットし、すべてのランダム性を無効にして数値の等価性をチェックする
乱数生成の調整、推論における数値的等価性をチェックする
(オプション)チェックポイントが正しく読み込まれ、TF1.x/TF2 モデルが同一の出力を生成することを確認する
b. 単一の GPU/TPU デバイスの場合
c. マルチデバイスストラテジー
数ステップのモデルトレーニングの数値的等価性の検証(コードサンプルは以下で入手可能)
a. 単一の CPU デバイスでの小規模な固定データを使用した単一のトレーニングステップの検証。具体的には、次のコンポーネントの数値的等価性を確認する
損失計算
指標
学習率
勾配の計算と更新
b. 3 つ以上のステップをトレーニングした後に統計をチェックして、モメンタムなどのオプティマイザの動作を検証する。単一の CPU デバイスで固定データを使用する。
c. 単一の GPU/TPU デバイス
d. マルチデバイスストラテジーを使用(以下の MultiProcessRunner のイントロを参照)
実際のデータセットでのエンドツーエンドの収束テスト
a. TensorBoard でトレーニングの動作を確認する
単純なオプティマイザを使用する(SGD と単純な分布戦略。 最初に
tf.distribute.OneDeviceStrategy
を使用する)。トレーニング指標
評価指標
固有のランダム性に対する妥当な許容範囲を把握する
b. 高度なオプティマイザ/学習率スケジューラ/分散ストラテジーとの同等性をチェックする
c. 混合精度使用時の同等性をチェックする
追加の乗積ベンチマーク
セットアップ
1 つのフォワードパスの検証
チェックポイントの読み込みを含む 1 つのフォワードパスの検証については、別の colab で説明しています。
数ステップのモデルトレーニングの数値的等価性検証
モデル構成を設定し、偽のデータセットを準備します。
TF1.x モデルを定義します。
次の v1.keras.utils.DeterministicRandomTestTool
クラスは、コンテキストマネージャ scope()
を提供し、 TF1 グラフ/セッションと Eager execution の両方でステートフルなランダム演算が同じシードを使用できるようになります。
このツールには、次の 2 つのテストモードがあります。
constant
は、呼び出された回数に関係なく、1 つの演算ごとに同じシードを使用します。num_random_ops
は、以前に観測されたステートフルなランダム演算の数を演算シードとして使用します。
これは、変数の作成と初期化に使用されるステートフルなランダム演算と、計算で使用されるステートフルなランダム演算(ドロップアウトレイヤーなど)の両方に適用されます。
TF1.x モデルを Graph モードで実行します。数値的等価性を比較するために、最初の 3 つのトレーニングステップの統計を収集します。
TF2 モデルを定義します。
TF2 モデルを eager モードで実行します。数値的等価性を比較するために、最初の 3 つのトレーニングステップの統計を収集します。
最初のいくつかのトレーニングステップの数値的等価性を比較します。
また、正当性と数値的等価性を検証するノートブックで、数値的等価性に関する追加のアドバイスを確認することもできます。
単体テスト
移行コードのデバッグに役立ついくつかの種類の単体テストがあります。
1 つのフォワードパスの検証
数ステップのモデルトレーニングの数値的等価性検証
ベンチマーク推論性能
トレーニング済みのモデルが固定された単純なデータポイントに対して正しい予測を行う
@parameterized.parameters
を使用して、さまざまな構成でモデルをテストできます。詳細(コードサンプル付き)はこちらを参照してください。
セッション API と Eager execution を同じテストケースで実行できます。以下のコードスニペットは、その方法を示しています。
デバッグツール
tf.print
tf.print と print/logging.info の比較
構成可能な引数を使用すると、
tf.print
は出力されたテンソルの各次元の最初と最後のいくつかの要素を再帰的に表示できます。詳細については、API ドキュメントを参照してください。Eager execution では、
print
とtf.print
の両方がテンソルの値を出力します。ただし、print
にはデバイスからホストへのコピーが含まれる場合があり、コードが遅くなる可能性があります。tf.function
内での使用を含む Graph モードでは、tf.print
を使用して実際のテンソル値を出力する必要があります。tf.print
はグラフ内の演算にコンパイルされますが、print
とlogging.info
はトレース時にしかログに記録されません(多くの場合、これは希望されないことだと思います)。tf.print
は、tf.RaggedTensor
やtf.sparse.SparseTensor
などの複合テンソルの出力もサポートしています。また、コールバックを使用して、指標と変数を監視することもできます。logs dict と self.model 属性でカスタムコールバックを使用する方法を確認してください。
tf.print と tf.function 内の print の比較
tf.distribute.Strategy
tf.print
を含むtf.function
がワーカーで実行される場合(たとえば、TPUStrategy
またはParameterServerStrategy
を使用する場合)、出力された値を見つけるには、ワーカー/パラメータサーバーログを確認する必要があります。print
またはlogging.info
の場合、ParameterServerStrategy
を使用するとログがコーディネータに出力され、TPU を使用する場合は、ログは worker0 の STDOUT に出力されます。
tf.keras.Model
Sequential API モデルと Functional API モデルを使用する場合、モデル入力やいくつかのレイヤーの後の中間特徴などの値を出力する場合は、次のオプションがあります。
入力を
tf.print
するカスタムレイヤーを作成します。調査する中間出力をモデル出力に含めます。
tf.keras.layers.Lambda
レイヤーには(逆)シリアル化の制限があります。チェックポイントの読み込みの問題を回避するには、カスタムサブクラス化されたレイヤーを記述します。詳しくは、API ドキュメントを参照してください。実際の値にアクセスできない場合、
tf.keras.callbacks.LambdaCallback
で中間出力をtf.print
することはできませんが、シンボリック Keras テンソルオブジェクトにのみアクセスできます。
オプション 1: カスタムレイヤーを作成します。
オプション 2: 調査する中間出力をモデル出力に含めます。
このような場合、Model.fit
を使用するには、いくつかのカスタマイズが必要になる場合があることに注意してください。
pdb
端末と Colab の両方で pdb を使用して、デバッグ用の中間値を調べることができます。
TensorBoard でグラフを可視化する
TensorBoard を使用すると TensorFlow のグラフを調べられます。TensorBoard は、要約を視覚化する優れたツールで colab でもサポートされています。これを使用して、トレーニングプロセスを通じて TF1.x モデルと移行された TF2 モデルの間で学習率、モデルの重み、勾配スケーリング、トレーニング/検証指標、および、モデルの中間出力を比較し、値が期待どおりになっているかどうかを確認できます。
TensorFlow Profiler
TensorFlow Profiler は、GPU/TPU での実行タイムラインを視覚化するのに役立ちます。基本的な使い方については、この Colab デモを参照してください。
MultiProcessRunner
MultiProcessRunner は、MultiWorkerMirroredStrategy と ParameterServerStrategy でデバッグする際に便利なツールです。使用法については、この具体的な例を参照してください。
特にこれら 2 つのストラテジーのケースでは、1) フローをカバーする単体テストを用意し、2) 単体テストでこれを使用して失敗を再現してみることをお勧めします。これは、修正を試みるたびに実際の分散ジョブが起動されることを避けるためです。