【问题标题】:Memory management when using GPU in TensorFlow在 TensorFlow 中使用 GPU 时的内存管理
【发布时间】:2017-02-17 21:47:31
【问题描述】:

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

由于权重存储在 CPU 中,它们应该在每次迭代时同步,而且 GPU 似乎没有得到充分利用(根据nvidia-smi,大约 60%)。在使用多个 GPU 的情况下,我知道权重应该存储在 CPU 内存中以在 GPU 之间同步。但是,为什么本教程即使在单个 GPU 中也将所有权重都存储在 CPU 中?有没有办法在 GPU 内存中存储和更新它们?

在推理的情况下,权重是否复制到 GPU 一次并重复使用?还是应该在每次使用时都复制?

图像数据呢?这些数据似乎驻留在 GPU 中(不确定)。这些数据何时传输到 GPU?当它们从磁盘加载?或者当 GPU 需要它们时?

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

编辑:如果有任何方法可以检查发送/接收节点在 CPU 和 GPU 之间的插入位置(如在 white paper 中),将会很有帮助。

【问题讨论】:

  • 您可以使用队列将数据提取到 GPU 中。它将在计算进行时被复制,并且有线程代码来保持它的完整。

标签: memory tensorflow gpu cpu


【解决方案1】:

这些教程旨在展示 API,因此并未针对性能进行优化。在 GPU 之间启用 p2p 通信时,单塔模型在 GPU 上保持变量更快,多塔模型也更快。要将变量固定到 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 队列运行器方法快得多。他们正在记录中。

【讨论】:

  • p2p 通信意味着类似于 GPUDirect 对吗?那么如何在 TensorFlow 中使用它呢?如果我的 GPU 支持,TF 会自动使用 GPUDirect 吗?
  • 它通常表示位于同一 PCI 根复合体上的 GPU。可用时自动使用,首次启动 GPU 时会看到打印的 p2p 矩阵
  • 时间轴中,每一行代表什么?我可以看到带有 /gpu:0/memcpy Compute] 或 /gpu:0/stream:XX Compute 或 /job:localhost/replica:0/task:0/cpu:0 Compute 或 /job:localhost/replica:0 的行/task:0/gpu:0 计算。一些流行和 localhost/gpu 行包含 conv2D、relu 或 add、mul 等层。然而他们的时间线却大不相同。
  • 实际上我不确定,我建议跟踪 generate_chrome_trace_format 的碎屑并发布您的发现 -- github.com/tensorflow/tensorflow/blob/…
猜你喜欢
  • 2018-02-17
  • 2018-05-31
  • 1970-01-01
  • 2018-11-25
  • 1970-01-01
  • 2017-11-14
  • 2019-08-29
  • 1970-01-01
相关资源
最近更新 更多