Path: blob/master/site/ja/tutorials/distribute/keras.ipynb
25118 views
Copyright 2019 The TensorFlow Authors.
Keras による分散型トレーニング
概要
tf.distribute.Strategy
API は、複数の処理ユニットに渡ってトレーニングを分散するための抽象化を提供します。ユーザーは既存のモデルとトレーニングコードを使用して、最小限の変更で分散型トレーニングを実行できるようになります。
このチュートリアルでは、tf.distribute.MirroredStrategy
を使用して、1 台のマシンの多数の GPU で同期トレーニングを行うグラフ内レプリケーションを実行します。ストラテジーは基本的にモデルのすべての変数を各プロセッサにコピーします。その後、all-reduce を使用して全プロセッサからの勾配を結合し、結合された値をモデルの全コピーに適用します。
tf.keras
API を使用して、モデルとそれをトレーニングするための Model.fit
をビルドします。(カスタムトレーニングループと MirroredStrategy
を使った分散型トレーニングについては、こちらのチュートリアルをご覧ください。)
MirroredStrategy
は単一のマシンの複数の GPU でモデルをトレーニングします。複数のワーカーの多数の GPU で同期トレーニングを行う場合は、tf.distribute.MultiWorkerMirroredStrategy
とKeras の Model.fit かカスタムトレーニングループを使用します。その他のオプションについては、分散型トレーニングガイドをご覧ください。
その他のさまざまなストラテジーについては、TensorFlow の分散型トレーニングガイドをご覧ください。
セットアップ
データセットをダウンロードする
TensorFlow Datasets から MNIST データセットを読み込みます。これは、tf.data
形式のデータセットを返します。
with_info
引数を True
に設定すると、データセット全体に対するメタデータが含まれます。ここでは info
に保存されます。このメタデータオブジェクトには、トレーニングとテストの例の数などが含まれます。
分散ストラテジーを定義する
MirroredStrategy
オブジェクトを作成します。これは分散を処理し、モデル内に構築するコンテキストマネージャ (MirroredStrategy.scope
) を提供します。
入力パイプラインをセットアップする
マルチ GPU でモデルをトレーニングする場合、バッチサイズを増加することにより追加の計算能力を効果的に利用することができます。一般的には、GPU メモリに収まる最大のバッチサイズを使用し、それに応じて学習率を調整します。
画像ピクセル値を [0, 255]
の範囲から [0, 1]
の範囲に正規化する関数を定義します(特徴量スケーリング)。
この scale
関数をトレーニングとテストのデータに適用してから、tf.data.Dataset
API を使用してトレーニングデータをシャッフル(Dataset.shuffle
)し、バッチ化(Dataset.batch
)します。パフォーマンスを改善するために、トレーニングデータのインメモリキャッシュも保持していることに注意してください(Dataset.cache
)。
モデルを作成してオプティマイザをインスタンス化する
Strategy.scope
のコンテキスト内で、Keras API を使ってモデルを作成し、コンパイルします。
この MNIST データセットを使ったトイサンプルでは、Adam オプティマイザのデフォルトの学習率である 0.001 を使用します。
より大規模なデータセットの場合、分散トレーニングの主なメリットはトレーニングステップごとにより多くの学習を行えることです。これは、各ステップがより多くのトレーニングデータを並行して処理するため、(モデルとデータセットの制限内で)より大きな学習率が可能となるためです。
コールバックを定義する
以下の Keras コールバックを定義します。
tf.keras.callbacks.TensorBoard
: グラフを視覚化できるように、TensorBoard 用のログを書き込みます。tf.keras.callbacks.ModelCheckpoint
: 各エポック後など、特定の頻度でモデルを保存します。tf.keras.callbacks.BackupAndRestore
: モデルと現在のエポック番号をバックアップすることで、フォールトトレランス機能を提供します。詳細は、Keras によるマルチワーカートレーニングチュートリアルのフォールトトレランスセクションをご覧ください。tf.keras.callbacks.LearningRateScheduler
: schedules the learning rate to change after, for example, every epoch/batch.
このノートブックでは例示目的で、PrintLR
というカスタムコールバックを追加して、学習率を表示します。
注意: ジョブの失敗から再開する際に、トレーニング状態をリストアするための主なメカニズムとして、ModelCheckpoint
の代わりに BackupAndRestore
コールバックを使用してください。BackupAndRestore
は eager モードのみをサポートするため、graph モードでは ModelCheckpoint
を使用することを検討してください。
トレーニングして評価する
次に、通常の方法でモデルをトレーニングします。モデル上で Keras Model.fit
を呼び出し、チュートリアルの最初に作成したデータセットを渡します。トレーニングを分散しているかに関わらず、このステップは同じです。
保存済みのチェックポイントを確認します。
モデルがどれほどうまく実行するかを確認するために、最新のチェックポイントを読み込み、テストデータで Model.evaluate
を呼び出します。
出力を視覚化するために、TensorBoard を起動して、ログを表示します。
モデルを保存する
Model.save
を使用して、モデルを .keras
zip アーカイブに保存します。モデルが保存されたら、Strategy.scope
の有無に関係なくそれを読み込めるようになります。
次に、Strategy.scope
を使用せずにモデルを読み込みます。
Strategy.scope
を使用してモデルを読み込みます。
追加リソース
さまざまな分散ストラテジーと Keras Model.fit
API を使用したその他の例をご覧ください。
TPU で BERT を使って GLUE タスクを解決するチュートリアルでは、GPU でのトレーニングには
tf.distribute.MirroredStrategy
を使用し、TPU ではtf.distribute.TPUStrategy
を使用しています。分散ストラテジーを使ってモデルを保存して読み込むチュートリアルでは、SavedModel API と
tf.distribute.Strategy
の使用方法が説明されています。TensorFlow 公式モデルは、複数の分散ストラテジーを実行できるように構成可能です。
TensorFlow 分散ストラテジーに関してさらに学習するには、以下をご覧ください。
tf.distribute.Strategy によるカスタムトレーニングチュートリアルでは、カスタムトレーニングループを使って単一ワーカートレーニングに
tf.distribute.MirroredStrategy
を使用する方法が説明されています。Keras によるマルチワーカートレーニングのチュートリアルでは、
MultiWorkerMirroredStrategy
とModel.fit
を使用する方法が説明されています。Keras によるカスタムトレーニングループと MultiWorkerMirroredStrategy のチュートリアルでは、Keras とカスタムトレーニングループで
MultiWorkerMirroredStrategy
を使用する方法が説明されています。TensorFlow での分散型トレーニングガイドでは、利用可能な分散ストラテジーの概要が説明されています。
tf.function を使ったパフォーマンスの改善ガイドでは、その他のストラテジーや、TensorFlow モデルのパフォーマンスを最適化するために使用できる TensorFlow Profiler といったツールに関する情報が提供されています。
注意: tf.distribute.Strategy
の開発は積極積に進められています。近日中にはより多くの例やチュートリアルを追加する予定ですので、ぜひお試しください。フィードバックをお待ちしております。GitHub の課題から、お気軽にお寄せください。