【问题标题】:How Tensorflow GPU/multi-GPU allocates memory?Tensorflow GPU/多GPU如何分配内存?
【发布时间】:2017-11-13 18:01:08
【问题描述】:

我有两个问题:

(1) Tensorflow 在只使用一个 GPU 时如何分配 GPU 内存?我有一个这样的卷积 2d 实现(全局使用 GPU):

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

cmets 中的另一个选项执行相同的操作,但添加了一个新变量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 设备?我有这样的问题是因为当我使用两个 GPU 来通过这个实现训练 CNN 时,程序使用的 GPU 内存比使用一个 GPU 时要多得多。我认为我错过或误解了一些东西。

【问题讨论】:

  • 您是否查看过Tensorflow website here 上的 GPU 选项页面。据我了解,Tensorflow 倾向于尽可能多地获取 GPU 内存,然后自行管理。尝试使用 nvidia SMI 进行快速监控时,这可能会有点令人沮丧。但是,您可以允许 GPU 增长,这意味着它只需要它需要的东西,并且可以继续增加。您也可以将 TF 设置为只能占用一小部分内存。查看该链接页面是否回答了您的任何问题。
  • 感谢您的评论,但该链接没有回答我的问题。在 TF 抢夺的 GPU 内存中,有一部分是“必要”的内存,另一部分是为了性能提升。当 GPU 内存不足时,TF 只分配必要的内存(可能后面有更复杂的东西,这就是为什么我们看到一些内存不足的警告,但不是失败的原因)。我的问题中提到的内存是指这个必要的内存,而不是TF抢到的内存。
  • 啊,我明白了。所以你更感兴趣的是内存是如何获得的,是为了什么?恐怕我不够资格给你一个合理的答案。希望其他人可以帮助您!
  • 谢谢。我想使用两个 GPU 并从中收集中间结果以进行真正的标准化(另一个问题 here)。但是把输入输出改成list后,GPU内存使用就变得奇怪了。这就是为什么我想知道TF中内存是如何分配的。

标签: python tensorflow convolution multi-gpu


【解决方案1】:

使用此代码检查每个张量和连接的设备。

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

所以这两个问题的答案:

(1) 号

(2) 如果我想跨 GPU 收集即时数据,并且考虑这些数据来计算梯度,那么就会出现问题。因为计算梯度也会消耗内存。跨 GPU 访问数据时,将分配额外的内存。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-15
    • 2018-11-25
    • 1970-01-01
    • 2019-08-29
    • 1970-01-01
    • 2017-06-26
    相关资源
    最近更新 更多