如何限制Tensorflow GPU内存使用量?

时间:2019-04-05 09:11:55

标签: python tensorflow gpu

我在Nvidia GeForce RTX 2070上使用CUDA 10.0在Ubuntu 18.04中使用tensorflow-gpu 1.13.1(驱动程序版本:415.27)。

下面的代码用于管理张量流的内存使用。我大约有8Gb GPU内存,因此tensorflow分配的GPU内存不得超过1Gb。但是,当我使用nvidia-smi命令查看内存使用情况时,我发现尽管我使用GPUOptions限制了内存数量,但它使用了约1.5 Gb。

memory_config = tf.ConfigProto(gpu_options=tf.GPUOptions(per_process_gpu_memory_fraction=0.12))

memory_config.gpu_options.allow_growth = False

with tf.Session(graph=graph, config=memory_config) as sess:
    output_dict = sess.run(tensor_dict,
                           feed_dict={image_tensor: np.expand_dims(image, 0)})

为什么会这样?以及如何避免这种情况或至少计算每个会话的内存需求?我需要对每个进程进行严格的限制,因为我有多个具有不同会话的paralell实例,因此我需要确保不会出现资源争用

顺便说一句,我试图将memory_config.gpu_options.allow_growth设置为False,但是它什么都不影响。 Tensorflow仍然独立于此标志值以相同的方式分配内存。而且似乎也很奇怪

1 个答案:

答案 0 :(得分:1)

解决方案 尝试使用gpu_options.allow_growth = True来查看创建tf.Session会消耗多少默认内存。无论值如何,该内存将始终分配。

根据您的结果,它应该小于500MB。因此,如果您希望每个进程真正 每个拥有1GB内存,请计算:

(1GB minus default memory)/total_memory

原因

创建tf.Session时,无论配置如何,都会在GPU上创建Tensorflow设备。而此设备需要最少的内存。

import tensorflow as tf

conf = tf.ConfigProto()
conf.gpu_options.allow_growth=True
session = tf.Session(config=conf)

鉴于allow_growth=True,应该没有gpu分配。但是实际上,它会产生:

  

2019-04-05 18:44:43.460479:我tensorflow / core / common_runtime / gpu / gpu_device.cc:1053]创建了TensorFlow设备(/ job:localhost /副本:0 /任务:0 /设备:GPU: 0(具有15127 MB内存)->物理GPU(设备:0,名称:Tesla P100-PCIE-16GB,pci总线ID:0000:03:00.0,计算能力:6.0)

占用的内存很小(根据我过去的经验,该数量因gpu型号而异)。 注意:设置allow_growth与设置per_process_gpu_memory=0.00001占用几乎相同的内存,但是后者将无法正确创建会话。

在这种情况下,它是 345MB

enter image description here

这是您遇到的偏移量。让我们看一下per_process_gpu_memory的情况:

conf = tf.ConfigProto()
conf.gpu_options.per_process_gpu_memory_fraction=0.1
session = tf.Session(config=conf)

由于GPU具有 16,276MB 的内存,因此设置per_process_gpu_memory_fraction = 0.1 可能可能使您认为仅分配了1,627MB。但事实是:

enter image description here

1,971MB 已分配,但是与默认内存(345MB)和预期内存(1,627MB)的总和一致。