Copyright 2018 The TensorFlow Authors.
このガイドでは、Tensor Processing Units(TPU) と TPU Pod(専用の高速ネットワークインターフェースで接続された TPU デバイスのコレクション)で tf.keras を使用して基本的なトレーニングとカスタムトレーニングループを行う方法を実演します。
TPU は、Google がカスタム開発した特定用途向け集積回路(ASIC)で、機械学習ワークロードを高速化するために使用できます。Google Colab、TPU Research Cloud、Cloud TPU から入手できます。
セットアップ
この Colab ノートブックをダウンロードする前に、Runtime > Change runtime type > Hardware accelerator > TPU でノートブックの設定を確認し、ハードウェアアクセラレータが TPU であることを確認してください。
TensorFlow データセットを含むいくつかの必要なライブラリをインポートします。
TPU の初期化
TPU は通常 Cloud TPU ワーカーであり、これはユーザーの Python プログラムを実行するローカルプロセスとは異なります。そのため、リモートクラスタに接続して TPU を初期化するための初期化作業が必要となります。tf.distribute.cluster_resolver.TPUClusterResolver の tpu 引数は、Colab だけの特別なアドレスであることに注意してください。Google Compute Engine(GCE)で実行している場合は、ご利用の CloudTPU の名前を渡す必要があります。
注意: TPU の初期化コードはプログラムのはじめにある必要があります。
手動でデバイスを配置する
TPU が初期されたら、計算を単一の TPU デバイスに配置するために、手動によるデバイスの配置を使用できます。
分散ストラテジー
モデルは通常、複数の TPU で並行して実行されます。複数の TPU(または、複数の GPU や複数のマシン)を使用してモデルを分散させるために、TensorFlow では、tf.distribute.Strategy API が用意されています。分散ストラテジーを置き換えると、指定された任意の(TPU)デバイスでモデルが実行するようになります。詳細については、分散ストラテジーガイドをご覧ください。
tf.distribute.TPUStrategy は同期分散型トレーニングを実装します。TPU は複数の TPU コアに、効率的な all-reduce の独自の実装とほかの集合演算を提供しており、TPUStrategy で使用されています。
これを実演するために、tf.distribute.TPUStrategy オブジェクトを作成します。
計算を複製してすべての TPU コアで実行できるようにするには、計算を strategy.run API に渡します。次の例では、すべてのコアが同じ入力 (a, b) を受け入れて、各コアで独立して行列の乗算を実行しています。出力は、すべてのレプリカからの値となります。
TPU での分類
基本的な概念を説明したので、より具体的な例を考察しましょう。このセクションでは、分散ストラテジー tf.distribute.TPUStrategy を使用して Cloud TPU で Keras モデルをトレーニングする方法を説明します。
Keras モデルを定義する
MNIST データセットで画像の分類を行う Sequential Keras モデル の定義から始めましょう。CPU または GPU でトレーニングする場合に使用するものと変わりません。Keras モデルの作成は Strategy.scope 内で行う必要があることに注意してください。そうすることで、変数が各 TPU デバイスに作成されるようになります。コードの他の部分は、Strategy スコープ内にある必要はありません。
このモデルは L2 正則化の項を各レイヤーの重みに配置するため、以下のカスタムトレーニングループで Model.losses からそれらを取得する方法を示すことができます。
データセットを読み込む
Cloud TPU を使用する際は、tf.data.Dataset API を効率的に使用できることが非常に重要となります。データセットのパフォーマンスについての詳細は、入力パイプラインのパフォーマンスガイドを参照してください。
TPU ノードを使用している場合は、TensorFlow Dataset によって読み取られたすべてのデータファイルを Google Cloud Storage(GCS)バケットに保存する必要があります。TPU VM を使用している場合は、希望する場所にデータを保存できます。TPU ノードと TPU VM の詳細については、TPU システム アーキテクチャのドキュメントを参照してください。
ほとんどの使用事例では、データを TFRecord 形式に変換し、tf.data.TFRecordDataset を使って読み取ることをお勧めします。このやり方については、「TFRecord および tf.Example のチュートリアル」を参照してください。これは絶対要件ではないため、ほかのデータセットリーダー (tf.data.FixedLengthRecordDataset または tf.data.TextLineDataset) を使用することもできます。
小さなデータセットは、tf.data.Dataset.cache を使ってすべてをメモリに読み込むことができます。
データ形式にかかわらず、100 MB 程度の大きなファイルを使用することをお勧めします。このネットワーク化された設定においては、ファイルを開くタスクのオーバーヘッドが著しく高くなるため、特に重要なことです。
以下のコードに示される通り、Tensorflow データセットの tfds.load モジュールを使用して、MNIST トレーニングとテストデータのコピーを取得する必要があります。try_gcs は、パブリック GCS バケットで提供されているコピーを使用するように指定されています。これを指定しない場合、TPU はダウンロードされたデータにアクセスできません。
Keras の高位 API を使用してモデルをトレーニングする
Keras の Model.fit と Model.fit API を使用してモデルをトレーニングできます。ここでは、TPU 固有のステップはないため、複数の GPU と MirroredStrategy(TPUStrategy ではなく)を使用している場合と同じようにコードを記述します。詳細については、「Keras を使用した分散トレーニング」チュートリアルを参照してください。
Python のオーバーヘッドを緩和し、TPU のパフォーマンスを最大化するには、引数 steps_per_execution を Keras Model.compile に渡します。この例では、スループットが約 50% 増加します。
カスタムトレーニングループを使用してモデルをトレーニングする
tf.function と tf.distribute API を直接使用しても、モデルを作成してトレーニングすることができます。strategy.experimental_distribute_datasets_from_function API は、データセット関数を指定して tf.data.Dataset を分散させるために使用されます。以下の例では、 Dataset に渡されるバッチサイズは、グローバルバッチサイズではなく、レプリカごとのバッチサイズであることに注意してください。詳細については、「tf.distribute.Strategy によるカスタムトレーニング」チュートリアルをご覧ください。
最初に、モデル、データセット、および tf.function を作成します。
次に、トレーニングループを実行します。
tf.function 内の複数のステップでパフォーマンスを改善する
tf.function 内で複数のステップを実行することで、パフォーマンスを改善できます。これは、tf.function 内の tf.range で Strategy.run 呼び出しをラッピングすることで実現されます。AutoGraph は、TPU ワーカーの tf.while_loop に変換します。tf.function の詳細については、tf.function ガイドを参照してください。
パフォーマンスは改善されますが、tf.function 内の単一のステップに比べれば、この方法にはトレードオフがあります。tf.function で複数のステップを実行すると柔軟性に劣り、ステップ内での Eager execution や任意の Python コードを実行できません。
次のステップ
Cloud TPU とその使用方法の詳細については、次を参照してください。
Google Cloud TPU: Google Cloud TPU ホームページ。
Google Cloud TPU ドキュメント: 以下を含む Google Cloud TPU ドキュメント:
Cloud TPU の基礎: Cloud TPU の操作の概要。
Cloud TPU クイックスタート: TensorFlow やその他の主要な機械学習フレームワークを使用して Cloud TPU VM を操作するためのクイックスタート。
Google Cloud TPU Colab ノートブック: エンドツーエンドのトレーニング例
Google Cloud TPU パフォーマンスガイド: アプリケーションに合った Cloud TPU 構成パラメータの調整により、Cloud TPU パフォーマンスをさらに改善します。
TensorFlow での分散型トレーニング:
tf.distribute.TPUStrategyなどの分散ストラテジーの使用方法とベストプラクティスを示す例TPU 埋め込み: TensorFlow には、
tf.tpu.experimental.embeddingによる TPU でのトレーニング埋め込みの特別なサポートが含まれています。さらに、TensorFlow Recommenders にはtfrs.layers.embedding.TPUEmbeddingがあります。埋め込みは、効率的で密な表現を提供し、特徴間の複雑な類似性と関係を捉えます。TensorFlow の TPU 固有の埋め込みサポートにより、単一の TPU デバイスのメモリよりも大きい埋め込みをトレーニングし、TPU で疎で不規則な入力を使用できます。TPU Research Cloud (TRC): TRC では、研究者は 1,000 を超える Cloud TPU デバイスのクラスタへのアクセスを申請できます。
TensorFlow.orgで表示
Google Colab で実行
GitHub でソースを表示
ノートブックをダウンロード