2017-02-17 51 views
1

我對在Tensorflow中使用GPU有些疑惑。我正在遵循卷積神經網絡教程here(tensorflow/models/image/cifar10/cifar10_train.py)。與本教程中一樣,所有參數(例如權重)均在CPU內存中存儲和更新,而GPU僅用於計算梯度或推理。在TensorFlow中使用GPU時的內存管理

由於權重存儲在CPU中,它們應該在每次迭代中同步,看起來GPU未充分利用(根據nvidia-smi,大約60%)。在使用多個GPU的情況下,我知道權重應該存儲在CPU內存中以在GPU之間同步。但是,爲什麼本教程即使在單GPU中也將所有權重存儲在CPU中?有什麼方法可以在GPU內存中存儲和更新它們嗎?

在推斷的情況下,權重是否複製到GPU一次並重用它們?還是應該在每次使用時複製它們?

圖像數據如何?看起來這些數據駐留在GPU中(不確定)。這些數據何時轉移到GPU?從磁盤加載它們時?或者當GPU需要它們時?

  • 如果將它們從磁盤加載後立即複製到GPU,如果圖像數據的大小太大而無法放入GPU內存,會發生什麼情況?在這種情況下,有任何方法可以分別複製數據(如預取)?
  • 如果將它們按需複製到GPU,在GPU實際使用它們以避免空閒時間之前是否有任何方法來預取它們?

編輯:這將是有益的,如果有任何的方法來檢查,其中發送/ recv的節點被CPU和GPU之間插入(如在white paper)。

+0

您可以使用隊列將數據提取到GPU中。它將在計算進行時被複制,並且有線程代碼保持它已滿。 – drpng

回答

1

這些教程旨在展示API,因此它們不會優化性能。對於單塔模型,在GPU上保持變化速度更快,而在GPU之間啓用p2p通信時,對於多塔模型也更快。要將變量固定到GPU,請使用與其他操作相同的tf.device('/gpu:0')方法。

你可以看到GPU之間所有的內存拷貝如果啓用分區圖,即做這樣的事情:

metadata = tf.RunMetadata() 
sess.run(x, options=tf.RunOptions(trace_level=tf.RunOptions.FULL_TRACE, 
            output_partition_graphs=True), 
     run_metadata=metadata) 

timeline = Timeline(metadata.step_stats) 
with open("dynamic_stitch_gpu_profile.json", "w") as f: 
    f.write(timeline.generate_chrome_trace_format()) 
with open("dynamic_stitch_gpu_profile.pbtxt", "w") as f: 
    f.write(str(metadata)) 

詳見本期使用這種技術的一個例子追查副本: https://github.com/tensorflow/tensorflow/issues/7251#issuecomment-277385212

對於預取到GPU,請參閱本issue

有新stage_op OPS已添加,使預取到GPU,並DRAM比使用Python隊列跑步者方法快得多。他們正在進行記錄。

+0

p2p通信的含義與GPUDirect類似嗎?那麼我如何在TensorFlow中使用它?如果我的GPU支持,TF是否自動使用GPUDirect? – enc

+0

它通常意味着在同一個PCI根聯合體上的GPU。它在可用時自動使用,當您第一次啓動GPU時,您會看到打印出的p2p矩陣。 –

+0

在時間軸中,每行代表什麼意思?我可以看到具有/ gpu:0/memcpy Compute的行或/ gpu:0/stream:XX計算或/ job:localhost/replica:0 /任務:0/cpu:0計算或/ job:localhost/replica:0 /任務:0/gpu:0計算。某些流行和localhost/gpu行包含諸如conv2D,relu或add,mul等圖層。然而,他們的時間表非常不同。 – enc