Tensorflow GPU / multi-GPU如何分配内存



我有两个问题:

(1( 当只使用一个 GPU 时,Tensorflow 如何分配 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

注释中的另一个选项执行相同的操作,但添加了一个新的变量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而分配更多内存吗?output(list(是否连接到某些GPU设备?我有这类问题,因为当我使用两个 GPU 通过此实现训练 CNN 时,该程序使用比使用一个 GPU 时更多的 GPU 内存。我认为有些东西我错过或误解了。

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

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

所以这两个问题的答案:

(1( 否。

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

相关内容

  • 没有找到相关文章

最新更新