Path: blob/master/site/ja/guide/core/distribution.ipynb
25118 views
Copyright 2022 The TensorFlow Authors.
Core API と DTensor による分散型トレーニング
はじめに
このノートブックでは、TensorFlow Core 低レベル API と DTensor を使用して、データ並列分散型トレーニングの例を実演します。TensorFlow Core と意図する使用例の詳細については、Core API の概要を参照してください。DTensor の詳細については、DTensor の概要ガイドと DTensor を使用した分散型トレーニングチュートリアルを参照してください。
この例では、多層パーセプトロンのチュートリアルと同じモデルとオプティマイザを使用しています。最初にこのチュートリアルを参照して、Core API を使用したエンドツーエンドの機械学習ワークフローの作成に精通してください。
注意: DTensor は、まだ実験的な TensorFlow API です。機能はテストに使用できますが、テスト環境でのみ使用することを意図しています。
DTensor を使用したデータ並列トレーニングの概要
分散をサポートする MLP を構築する前に、データ並列トレーニングのための DTensor の基礎を見てみましょう。
DTensor を使用すると、デバイス間で分散型トレーニングを実行して、効率、信頼性、およびスケーラビリティを向上させることができます。DTensor は、Single program, multiple data(SPMD)と呼ばれるテクニックにより、シャーディングディレクティブに従ってプログラムとテンソルを分散します。DTensor
対応レイヤの変数は dtensor.DVariable
として作成され、DTensor
対応レイヤオブジェクトのコンストラクタは通常のレイヤーパラメータに加えて追加の Layout
入力をとります。
データ並列トレーニングの主なアイデアは次のとおりです。
モデル変数は、N 個のデバイスにそれぞれ複製されます。
グローバルバッチは、N 個のレプリカごとのバッチに分割されます。
それぞれのレプリカごとのバッチは、レプリカデバイスでトレーニングされます。
勾配は、すべてのレプリカでデータの重み付けが集団的に実行される前に減らされます。
データ並列トレーニングは、デバイスの数に関してほぼ線形の速度を提供します
セットアップ
DTensor は、TensorFlow 2.9.0 リリースに含まれています。
この実験のために 8 つの仮想 CPU を構成します。DTensor は、GPU または TPU デバイスでも使用できます。このノートブックでは仮想デバイスを使用しているので、分散型トレーニングによる速度の向上はほぼ見られません。
MNIST データセット
データセットは TensorFlow データセットから入手できます。データをトレーニングセットとテストセットに分割します。時間を節約するために、トレーニングとテストには 5000 のサンプルのみを使用します。
データを前処理する
データを 2 次元に再形成し、単位間隔 [0,1] に収まるように再スケーリングすることにより、データを前処理します。
MLP を構築する
DTensor 対応レイヤーを使用して MLP モデルを構築します。
高密度レイヤー
まず、DTensor をサポートする高密度レイヤーモジュールを作成することから始めます。dtensor.call_with_layout
関数を使用して、DTensor 入力を受け取り、DTensor 出力を生成する関数を呼び出すことができます。これは、TensorFlow がサポートする関数で DTensor 変数 dtensor.DVariable
を初期化するのに役立ちます。
MLP Sequential モデル
次に、高密度レイヤーを順番に実行する MLP モジュールを作成します。
DTensor で「データ並列」トレーニングを実行することは、tf.distribute.MirroredStrategy
と同等です。これを行うために、各デバイスはデータバッチのシャードで同じモデルを実行します。そのため、次が必要になります。
単一の
"batch"
次元を持つdtensor.Mesh
メッシュ全体でそれらを複製するすべての重みの
dtensor.Layout
(各軸にdtensor.UNSHARDED
を使用する)バッチ次元をメッシュ全体に分割するデータの
dtensor.Layout
単一のバッチ次元で構成される DTensor メッシュを作成します。各デバイスは、グローバルバッチからシャードを受け取るレプリカになります。このメッシュを使用して、次のアーキテクチャで MLP モードをインスタンス化します。
フォワードパス:ReLU(784×700)×ReLU(700×500)×Softmax(500×10)
トレーニング指標
クロスエントロピー損失関数と精度指標をトレーニングに使用します。
オプティマイザ
オプティマイザを使用すると、標準の勾配降下法に比べて収束が大幅に速くなる可能性があります。Adam オプティマイザは以下に実装されており、DTensor と互換性があるように構成されています。DTensor で Keras オプティマイザを使用するには、実験的な tf.keras.dtensor.experimental.optimizers
モジュールを参照してください。
データパッキング
まず、データをデバイスに転送するためのヘルパー関数を作成します。この関数は dtensor.pack
を使用して、レプリカ用のグローバルバッチのシャードをレプリカをバッキングしているデバイスに送信(送信のみ)する必要があります。簡単にするために、単一クライアントのアプリケーションを想定します。
次に、このヘルパー関数を使用してトレーニングデータバッチをバッチ(最初の)軸に沿って分割された DTensor にパックする関数を記述します。これにより、DTensor がトレーニング データを「バッチ」メッシュ次元に均等に分散することが保証されます。DTensor では、バッチサイズは常にグローバルバッチサイズを参照することに注意してください。したがって、バッチサイズは、バッチメッシュ次元のサイズで均等に分割できるように選択する必要があります。tf.data
の統合を簡素化する追加の DTensor API が計画されています。
トレーニング
データのバッチを指定して単一のトレーニングステップを実行する追跡可能な関数を記述します。この関数は特別な DTensor アノテーションを必要としません。また、テストステップを実行し、適切なパフォーマンス指標を返す関数を作成します。
バッチサイズを 128、エポックを 3 として、モデルをトレーニングします。
パフォーマンス評価
まず、トレーニング中のモデルの損失と精度を視覚化するプロット関数を作成します。
モデルの保存
tf.saved_model
と DTensor の統合はまだ開発中です。TensorFlow 2.9.0 の時点で、tf.saved_model は完全に複製された変数を持つ DTensor モデルのみを受け入れます。回避策として、チェックポイントをリロードすることで、DTensor モデルを完全に複製されたモデルに変換できます。ただし、モデルを保存すると、すべての DTensor アノテーションが失われ、保存されたシグネチャは通常の Tensor でのみ使用できます。統合されたら、このチュートリアルのデモは更新されます。
結論
このノートブックでは、DTensor と TensorFlow Core API を使用した分散トレーニングの概要を説明しました。以下に役立つヒントをいくつか紹介します。
TensorFlow Core API を使用すると、分散型トレーニングをサポートする高度に構成可能な機械学習ワークフローを構築できます。
DTensor の概念ガイドと DTensor を使用した分散型トレーニング チュートリアルには、DTensor とその統合に関する最新情報が含まれています。
TensorFlow Core API のその他の使用例については、チュートリアルを参照してください。データの読み込みと準備についてさらに学習するには、画像データの読み込みまたは CSV データの読み込みに関するチュートリアルを参照してください。