2016-03-30 9 views
7

非常に大きな反復ネットワーク(2048x5など)を実行する予定です。テンソルフローで1つのGPUで1つのレイヤーを定義することは可能ですか?最高の効率を達成するためにモデルをどのように実装するべきですか?私は、GPU間またはGPU-CPU間のGPU通信のオーバーヘッドがあることを理解しています。テンソルフローで複数のGPUにまたがってネットワークを分割することはできますか?

+1

[ここ](https://www.tensorflow.org:あなたのtf.Sessionを作成するときにモデル内の操作のいずれかをGPU上で実行することができない場合は、O、tf.ConfigProtoに「ソフトな配置を」有効にします/versions/r0.7/how_tos/using_gpu/index.html#using_multiple_gpus)が指示です。 [here](https://www.tensorflow.org/versions/r0.7/tutorials/deep_cnn/index.html)がその一例です。データ並列は、機能並列よりはるかに簡単です。 – fluency03

+0

私はtf.device()の使用法を理解しています。しかし、別のGPUでレイヤーを定義した後も、最初のGPUにグラデーションが保存されています。さまざまなGPUで勾配計算を分割する具体的な例を挙げることはできますか? –

+2

モデルをビルドするときに 'colocate_gradients_with_ops = True'を' optimizer.minimize() 'メソッドに渡すこともできます。 – mrry

答えて

15

TensorFlowでは、大規模なモデルを複数のGPUに分割することは可能ですが、最適な方法で行うことは難しい研究課題です。合格し、自分のオプティマイザを構築するとき

with tf.device("/gpu:0"): 
    # Define first layer. 

with tf.device("/gpu:1"): 
    # Define second layer. 

# Define other layers, etc. 
  • with tf.device(...):ブロック内のコードの

    1. ラップ大規模な連続した領域、異なるGPUの名前を付ける:一般的には、次の操作を実行する必要があります。 optimizer.minimize()メソッドにオプションの引数colocate_gradients_with_ops=True

      loss = ... 
      optimizer = tf.train.AdaGradOptimizer(0.01) 
      train_op = optimizer.minimize(loss, colocate_gradients_with_ops=True) 
      
    2. あなたがトンが必要な場合があります(オプション)。

      config = tf.ConfigProto(allow_soft_placement=True) 
      sess = tf.Session(config=config) 
      
  • +0

    私は2つのGPUでネットワークを運用していますが、順方向と逆方向の両方の計算が2つのGPUに分散されています。しかし、数時間のトレーニングの後、私はGPUの使用率が本当に低いことがわかります。私は、キュー占有率(キュー内のバッチ数)が0であることがわかります。これは、キューが十分に速くいっぱいになっていないことを意味します。私はスレッドを使用してデータをキューに送ります。私は明示的にキューを定義する必要があります、CPUのエンキューとデキュー操作? –

    +0

    はい、モデルトレーニングの全体的なパフォーマンスを向上させるために、CPUへの入力パイプラインを固定しています(そうしないと、CPUで実行できる入力パイプラインの部分から干渉を受けます)。 – mrry

    +0

    「入力パイプラインをCPUに固定する」と、少し詳しくお聞かせください。 – herve

    関連する問題