[英]How to restrict tensorflow GPU memory usage?
我在Ubuntu 18.04中使用了tensorflow-gpu 1.13.1,在Nvidia GeForce RTX 2070上使用了CUDA 10.0(驱动程序版本:415.27)。
下面的代码用于管理张量流内存使用情况。 我有大约8Gb的GPU内存,因此tensorflow不能分配超过1Gb的GPU内存。 但是当我使用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)})
为什么会这样? 我如何避免这种情况或者至少计算每次会话的内存需求? 我需要为每个进程制定强大的限制,因为我有几个不同会话的并行实例,所以我需要确定,没有资源竞争
顺便说一下,我试过将memory_config.gpu_options.allow_growth设置为False,但它没有任何影响。 Tensorflow仍然以与此标志值无关的方式分配内存。 它也似乎很奇怪
解决方法尝试使用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:I tensorflow / core / common_runtime / gpu / gpu_device.cc:1053]创建TensorFlow设备(/ job:localhost / replica:0 / task:0 / device:GPU:0 with 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)的总和相吻合。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.