2016-03-03 13 views
8

TensorFlowを使用してネットワークをトレーニングする場合、マルチGPUシステムの「ベストプラクティス」とは何かを知りたいと思います。TensorFlow:マルチGPU構成(パフォーマンス)

例えば、私のネットワークの一つは次のようになります。

      input 
          | 
         (...) <-- convolutional layers 
          | 
         _________ 
    fully-connected |  | fully-connected 
    output stream 1 -> |  | <- output stream 2 

んTensorFlowは、効率的に複数のGPUを割り当てますか?または、特定の操作にGPU TensorFlowが使用する必要のあるものを指定する必要がありますか?

私はこれまでにベンチマークしていませんでしたが、今日はいくつかのGPU実験を開始しました。しかし、現時点では私は、畳み込み層に使用するデバイスを指定していないが、私は完全に接続された層のためにそれを指定しなかった:

# flattened information of the last convolutional layer 
h_pooln_flat = tf.reshape(...) 

with tf.device("/gpu:0"): 
    # stream 1 stuff 

with tf.device("/gpu:1"): 
    # stream 2 stuff 

は、これは良いアイデアですか?あるいは、TensorFlowにリソース割り当てを開いたままにする必要がありますか?

畳み込みレイヤーの1つの「ストリーム」は、並行して計算できないと思いますか?だから、どのデバイスが畳み込み、プール、...部分をしていてもかまいません。

最高のパフォーマンスを得るためのヒントを教えてください。

は現在、私は2つのGPUとSLURMのクラスタの1つのノード上で訓練していますが、潜在的に、私はより多くのノード、SO 4、6あるいは8のGPUを上の訓練ができます。しかし、2つ以上のGPUでオーバーヘッドが増えると思いますか?


EDIT(マルチGPUのパフォーマンスが低下する):私はかなり驚いていますいくつかのテストの後 ...私はTensorFlowは、デバイス固有のステートメントを割り当て、削除するかを決定させた場合、ネットワークがかなりに高速列車。これは私には本当に驚きでした...合計で2つのGPUがある場合、1つのGPUで各出力ストリームを持つより効果的なのは何ですか?さらに、Tensorflowは1つのGPUしか使用していないようです(出力によると思われます)。


EDIT2(NaN値):私は、ストリーム2のためのストリーム1およびgpu:1ためgpu:0の私の手動設定がTensorFlowを使用するかを決定させる(とに応じて以下だけ遅くはないことを経験したいくつかのより多くのテストの後パイプで連結されたスクリプトの出力TensorFlowはちょうど GPU)を使用しても)私の「ストリーム2のためのストリーム1およびgpu:1ためgpu:0」 - 溶液がちょうどNaN値を生成し、なぜ、時には私の(私は知りません。 initの直後または直後のように。非常に奇妙な。

TensorFlowは、複数のGPUに入力データのスレッドロックまたは手動コピーが必要ですか?

+1

私はあなたの質問に答えることはできませんが、Tensorflowのドキュメントでは、プロセッサ(GPUとCPU)の割り当ては、ユーザー定義の配置制約を割り当てた後、貪欲な方法で行われることに言及しています。ホワイトペーパーは次のとおりです。http://download.tensorflow.org/paper/whitepaper2015.pdfセクション3.2と4.3を参照してください。私はベストプラクティスに関しても何か答えを見たいと思っています。 – nfmcclure

+0

すべてのデータ転送が完了し、NaNを防ぐために入力データをロックする必要はありません。しかし、あなたの最適化が –

+0

のように分かれば、NaNを得ることもできます。しかし、私のネットワークでNaNの問題は1つのGPUで得られませんでした。 5つの実験のうち5つの実験では、通常は1つのGPUに収束しますが、3つのうち5つのマルチGPUでNaN値が得られます。さらに:なぜマルチGPUを遅くするべきですか? GPU間のデータ転送のため、スピードは2倍ではあるが速度は遅くなるとは思わなかったのですか? – daniel451

答えて

5

デバイスのデフォルトの配置のためのロジックがsimple_placer.cc

である私はロジックで何かが欠けてもよいが、this lineから、それは、GPU上のすべてのGPUのOPSを置くようだ:0

あなたが見ることができます実装から、配置戦略ではデータ転送や計算コストが考慮されないため、手動配置は自動配置よりも優れていることがよくあります。たとえば、何らかの入力パイプラインを実行している場合、デフォルトの配置では通常、GPUにデータ処理操作がいくつか配置され、全体的に処理が遅くなります。

あなたの実装が遅い限り...おそらくgpu0-> gpu1コピーがどこかで起こっていますか?

マルチGPUの動作を設定することは非常にオープンな領域です。見つけたものをお知らせください!