我在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仍然独立于此标志值以相同的方式分配内存。而且似乎也很奇怪
答案 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 :
这是您遇到的偏移量。让我们看一下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。但事实是:
1,971MB 已分配,但是与默认内存(345MB)和预期内存(1,627MB)的总和一致。