TPU を推論に使用できますか?
はい。TPU はトレーニングと推論の両方に使用できます。たとえば、ResNet チュートリアルでは、トレーニング ループ中に定期的な評価を行います。モデル サービングの場合、注意すべき点がいくつかあります。特に、TPU ソフトウェア スタックは現在、レイテンシではなくスループットに最適化されています。入力の 1 つのバッチに対して推論を実行し、結果を待機すると、現在は少なくとも 10 ミリ秒のオーバーヘッドがあります。これは、低レイテンシでのサービングでは問題となる可能性があります。
このオーバーヘッドは、今後の TensorFlow リリースで大幅に削減される予定です。
TPU で利用できない組み込み TensorFlow 演算はありますか?
少数の組み込み TensorFlow 演算は、現在 TPU で利用できません。現在の回避策の詳細については、利用可能な TensorFlow 演算のガイドをご覧ください。
TPU のカスタム演算を記述するにはどうすればよいですか?
TPU で実行される TensorFlow 演算は、XLA HLO で実装されています。これは、少数の低レベルの関数を使用して高レベルのテンソル演算を定義するための言語です。XLA は TensorFlow のオープンソース リリースに含まれているので、HLO で演算を記述することが技術的に可能です。既存の実装の大部分は、tf2xla ディレクトリにあります。ただし、これは任意の C++ または Python コードではなく、TPU での限られたテンソル演算の実行のみが可能です。HLO で実装できる最も一般的なテンソル演算は、すでに記述されています。TensorFlow の今後のリリースでは、TPU のトレーニング / 推論中に標準的な CPU 演算を効率的に実行する機能がサポートされる予定です。
プレースホルダとフィード辞書を TPU で使用できますか?
この使用パターンは TPU で技術的に可能ですが、単一の TPU コアのみが使用され、過剰なオーバーヘッドが発生するため、使用しないことを強くおすすめします。代わりに、トレーニング パイプラインを作成するには、TPUEstimator API と Dataset API を使用します。TPUEstimator と Dataset を使用して簡単なトレーニング ループを作成する方法については、ResNet チュートリアルをご覧ください。
強化学習(RL)モデルを TPU でトレーニングできますか?
強化学習は幅広い技術をカバーしていますが、そのうちのいくつかは、現在は TPU のソフトウェア抽象化と互換性がありません。一部の強化学習構成では、トレーニング ループの一部として CPU を使用してブラックボックス「シミュレーション環境」を実行する必要があります。経験的に、これらは TPU に追いつくことができず、重大な非効率をもたらすことになります。TensorFlow の今後のリリースには、「オフポリシー」強化学習を簡単にするための抽象化が含まれる予定です。
TPU で単語埋め込みを使用できますか?
はい。TPU では tf.nn.embedding_lookup() がサポートされています。これは単に、TPU で実装されている tf.gather() のラッパーです。しかし、TPU では tf.nn.embedding_lookup_sparse() はサポートされていません。トレーニング中、tf.embedding_lookup() への入力 ID テンソルは静的形状である必要があることに注意してください(つまり、バッチサイズとシーケンス長はすべてのバッチで同じでなければなりません)。これは、TPU を使用する場合に、すべてのテンソルに対する、より一般的な制限です。
TPU で可変長シーケンスを使用できますか?
TensorFlow で可変長シーケンスを表すには、パディング、tf.while_loop()、推定されるテンソル次元、バケット化など、いくつかの方法があります。現在の TPU 実行エンジンでは、これらのサブセットのみがサポートされています。可変長シーケンスは、tf.while_loop()、tf.dynamic_rnn()、バケット化、パディング、シーケンスの連結を使用して実装する必要があります。
TPU で反復性ニューラル ネットワーク(RNN)をトレーニングできますか?
特定の構成では、tf.static_rnn() と tf.dynamic_rnn() は現在の TPU 実行エンジンと互換性があります。より一般的に言うと、TPU では tf.while_loop() と TensorArray の両方がサポートされており、これらは tf.dynamic_rnn() を実装するために使用されます。CuDNN などの特殊なツールキットは、GPU 固有のコードが含まれているため、TPU ではサポートされていません。TPU で tf.while_loop() を使用するには、TPU 実行エンジンがメモリ使用量を静的に決定できるように、ループ反復回数の上限を指定する必要があります。
TPU で敵対的生成ネットワーク(GAN)をトレーニングできますか?
GAN のトレーニングは、通常、ジェネレータのトレーニングと弁別子のトレーニングを頻繁に交互に切り替える必要があります。現在の TPU 実行エンジンでは、1 つの実行グラフのみがサポートされます。グラフを交互に切り替えるには完全な再コンパイルが必要で、これには 30 秒以上かかる場合があります。この制限は、今後の TensorFlow リリースで改善される予定です。
可能性のある 1 つの回避策は、ジェネレータと弁別子の両方の損失の合計を常に計算し、これらの損失に 2 つの入力テンソル g_w と d_w を乗算することです。ジェネレータをトレーニングするバッチでは、g_w=1.0 と d_w=0.0 を渡すことができ、弁別子をトレーニングするバッチについて、逆の場合も同じです。
TPU でマルチタスク学習モデルをトレーニングできますか?
タスクを集約損失関数を持つ 1 つの大きなグラフとして表すことができる場合、マルチタスク学習に特別なサポートは必要ありません。ただし、TPU 実行エンジンでは現在、1 つの実行グラフのみがサポートされています。したがって、変数を共有しているが構造が異なる複数の実行グラフをすばやく交互に切り替えることはできません。実行グラフを変更するには、グラフ コンパイル ステップの再実行が必要で、これには 30 秒以上かかる場合があります。
TPU では eager モードはサポートされますか?
いいえ。eager モードでは新しい動的実行エンジンが使用されますが、TPU では XLA が使用されます。XLA では実行グラフの静的コンパイルが実行されます。
TPU ではモデルの並列処理はサポートされますか?
モデルの並列処理(つまり、単一の TPU デバイスの複数のコアで、同一でない TPU プログラムを実行すること)は、TPU で現在はサポートされていませんが、今後の TensorFlow リリースでサポートされる予定です。
TPU の中間テンソルの実際の値を調べるにはどうすればよいですか(tf.Print や tfdbg と同様に)?
この機能は現在、TPU ではサポートされていません。TPU での開発向けの推奨パターンは、TPUEstimator フレームワークを使用してモデルを実装することです。このフレームワークでは、use_tpu フラグを使用して TPU と CPU / GPU 間で簡単に移行できます。標準の TensorFlow ツールを使用して CPU / GPU でモデルをデバッグし、モデルで本格的なトレーニングの準備ができたら TPU に切り替えることをおすすめします。
トレーニング スキームが、TPUEstimator API には複雑または専門的すぎます。使用できる低レイヤ(低水準)の API はありますか?
TPUEstimator は、Cloud TPU での TPU トレーニングの主要なフレームワークです。ただし、TPUEstimator によってオープンソースの TensorFlow の一部である tpu API がラップされているので、低レベルの tpu API を直接使用することは技術的には可能です(サポートはされていません)。トレーニング パイプラインで TPU と CPU の間の頻繁な通信が必要な場合や、実行グラフを頻繁に変更する必要がある場合、TPU で計算を効率的に実行できません。TensorFlow の今後のリリースでは、両方の機能が向上する予定です。