在TensorFlow中使用GPU时的内存管理

时间:2017-02-17 21:47:31

标签: memory tensorflow gpu cpu

我对在Tensorflow中使用GPU有一些疑问。我正在关注卷积神经网络教程here(tensorflow / models / image / cifar10 / cifar10_train.py)。如在教程中,所有参数(例如,权重)在CPU存储器中存储和更新,并且GPU仅用于计算梯度或推断。

由于权重存储在CPU中,它们应该在每次迭代时进行同步,并且GPU似乎未充分利用(根据Sub holiday() Dim cell As Range For Each c In Worksheets("Sheet1").Range("B:D").cells If c.Value = "holiday" Then Set curCell = Worksheets("Sheet1").cells(c.Row, 1) curCell.Value = "holiday" End If Next End Sub 约为60%)。在使用多个GPU的情况下,我知道权重应存储在CPU内存中以在GPU之间进行同步。但是,为什么本教程甚至在单个GPU中存储CPU中的所有权重?有没有办法在GPU内存中存储和更新它们?

在推断的情况下,权重是否会复制到GPU并重复使用?或者他们每次使用时都应该复制?

图像数据怎么样?似乎这些数据存在于GPU中(不确定)。这些数据什么时候传输到GPU?从磁盘加载它们?或者在GPU中需要它们时?

  • 如果从磁盘加载后立即将它们复制到GPU,如果图像数据的大小太大而无法放入GPU内存,会发生什么?在这种情况下,有什么方法可以单独复制数据(比如预取)?
  • 如果按需将它们复制到GPU,是否有任何方法可以在GPU实际使用它们之前预取它们以避免空闲时间?

编辑:如果有办法检查CPU和GPU之间插入send / recv节点的位置会有所帮助(如white paper中所示)。

1 个答案:

答案 0 :(得分: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操作系统,这些操作系统允许预取GPU并且比使用Python队列运行程序方法快得多。他们正在被记录下来。