Tensorflow GPU/multi-GPU 如何分配内存?
How Tensorflow GPU/multi-GPU allocates memory?
我有两个问题:
(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
评论中的另一个选项执行相同的操作,但添加了一个新变量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 访问数据时,将分配额外的内存。
我有两个问题:
(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
评论中的另一个选项执行相同的操作,但添加了一个新变量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 访问数据时,将分配额外的内存。