2017-06-12 23 views
1

私は2つの質問を持っています:Tensorflow GPU /マルチGPUがメモリを割り当てる方法は?

(1)Tensorflowは1つのGPUだけを使用するとGPUメモリをどのように割り当てますか?私は(世界的にGPUを使用して)このような畳み込み2dの実装を持っている:

def _conv(self, name, x, filter_size, in_filters, out_filters, strides): 
    with tf.variable_scope(name): 
     n = filter_size * filter_size * out_filters 
     kernel = tf.get_variable(
      '', [filter_size, filter_size, in_filters, out_filters], tf.float32, 
      initializer=tf.random_normal_initializer(stddev=np.sqrt(2.0/n)), 
     ) 
     return tf.nn.conv2d(x, kernel, strides, padding='SAME') 
     # another option 
     # x = tf.nn.conv2d(x, kernel, strides, padding='SAME') 
     # return x 

コメント内の別のオプションは、同じ操作を行いますが、新しい変数xを追加しました。この場合、TFはより多くのGPUメモリを割り当てますか?

(2)複数のGPUを使用する場合。私はlistを使用して複数のGPUからの結果を収集したいと思います。実装は以下の通りです:

def _conv(self, name, input, filter_size, in_filters, out_filters, strides, trainable=True): 
    assert type(input) is list 
    assert len(input) == FLAGS.gpu_num 

    n = filter_size * filter_size * out_filters 
    output = [] 
    for i in range(len(input)): 
     with tf.device('/gpu:%d' % i): 
      with tf.variable_scope(name, reuse=i > 0): 
       kernel = tf.get_variable(
        '', [filter_size, filter_size, in_filters, out_filters], tf.float32, 
        initializer=tf.random_normal_initializer(stddev=np.sqrt(2.0/n)) 
       ) 
       output.append(tf.nn.conv2d(input[i], kernel, strides, padding='SAME')) 

    return output 

はTFためlistの使用のより多くのメモリを割り当てるのでしょうか? outputlist)がGPUデバイスに接続されていますか?私は、この実装でCNNをトレーニングするために2つのGPUを使用している場合、1つのGPUを使用する場合よりもはるかに多くのGPUメモリを使用するため、この種の質問があります。私は逃したか誤解したことがあると思う。

+0

[Tensorflow website here](https://www.tensorflow.org/tutorials/using_gpu#allowing_gpu_memory_growth)のGPUオプションページをご覧ください。私が理解しているように、Tensorflowはできるだけ多くのGPUメモリをつかみ、それ自体を管理します。これは、nvidia SMIを使ってすばやく監視しようとすると、少しイライラすることがあります。しかし、あなたはGPUの成長を許すことができます。これは、GPUが必要とするものだけを取り、より多くのものを取ることができることを意味します。あなたはTFもメモリのほんの一部を取ることができるように設定することができます。リンクされたページがあなたの質問に答えるかどうかを確認してください。 – JCooke

+0

ご意見ありがとうございますが、そのリンクは私の質問に答えていませんでした。 TFによって把握されたGPUメモリには、「必要な」メモリの一部と性能向上のための別の部分があります。 GPUメモリが不足している場合、TFは必要なメモリだけを割り当てます(多少複雑なことがありますので、メモリが不足しているという警告が表示されます)。私の質問で言及された記憶は、この必要な記憶を意味し、TFによって捕えられた記憶を意味しない。 – Seven

+0

ああそうだよ。だから、あなたは記憶がどのように獲得され、何のためにもっと興味がありますか?私はあなたに合理的な答えを与えるのに十分な資格はないと思います。うまくいけば、他の人があなたを助けることができます! – JCooke

答えて

0

このコードを使用して、各テンソルと接続されているデバイスを確認します。

for n in tf.get_default_graph().as_graph_def().node: 
    print n.name, n.device 

したがって、これら二つの質問に対しての答え:

(1)番

は(2)私はGPUの間ですぐにデータを収集したい、とのデータがあると考えられている場合グラジエントを計算すると、問題が発生します。計算勾配はメモリも消費するためです。 GPU間でデータにアクセスすると、追加のメモリが割り当てられます。

関連する問題