web-dev-qa-db-ja.com

TensorFlow / cuDNNのNHWCと比較して、NCHWはどのくらい高速ですか?

公式のTensorFlowパフォーマンスガイド の状態:

CNNで使用されるほとんどのTensorFlow演算は、NHWCとNCHWの両方のデータ形式をサポートしています。 GPUでは、NCHWの方が高速です。しかし、CPUでは、NHWCの方が高速な場合があります。

たたみ込みの場合、TensorFlow/cuDNNのNHWCと比較してNCHWはどのくらい高速ですか?このためのリファレンスやベンチマークはありますか?

また、なぜそれが速いのですか?私が理解しているように( こちら を参照)、GPU上のNHWCのTensorFlowは常に内部でNCHWに転置し、NCHWのcuDNN変換カーネルを呼び出してから、転置して戻します。しかし、なぜそれを行うのですか? cuDNN変換カーネルはNHWCでも機能します。多分ある時点で彼らは比較を行い、NHWCのcuDNN変換カーネルは非常に遅くなりました。しかし、それは最新ですか?そして、違いはどのくらい大きかったのですか? NHWCが非常に遅いという技術的な理由は何ですか?または、この場合のcuDNNカーネルは最適化されていませんか?

9
Albert

TF1.1以降、NHWCを直接呼び出すこともできません。 TFはNCHWとの間の変換を行います。したがって、cuDNNでのNHWCの実装の効率に関係なく、TFユーザーの観点からは、NCHWの方が高速です。

https://github.com/tensorflow/tensorflow/issues/8286

もちろん、パフォーマンスの比率は問題によって異なりますが、私の感覚では、それは大きく、回避できれば(GPUで)NHWCを使用したくないと考えています(無駄になっているようです)メモリも)

4
MaxB

特にdata_format="channels_first"はTensorFlow全体でデフォルトを使用するよりもはるかに冗長に見えるため、および内部で処理する必要があるため、レイアウトを手動で最適化することにあまり意味がないと思います。

NCHWを使用すると、トレーニング時間を最大で数パーセント高速化できると予想します。また、XLA JITコンパイルが成熟するにつれて、このパフォーマンスの違いはなくなると予想します。

Kerasを使用すると、K.set_image_data_formatを使用して両方をかなり簡単に試すことができます。両方を試して、特定のモデルにどのような違いがあるかを確認してください。

これは、VGGモデルの小さなベンチマークです https://Gist.github.com/carlthome/51d62cbf5fc23098418eef93b11a5d78

1
Carl Thomé