Python 如何限制tensorflow GPU内存使用?

Python 如何限制tensorflow GPU内存使用?,python,tensorflow,gpu,Python,Tensorflow,Gpu,我在Ubuntu18.04中使用了tensorflow gpu 1.13.1,在Nvidia GeForce RTX 2070(驱动程序版本:415.27)上使用了CUDA 10.0 下面的代码用于管理tensorflow内存使用情况。我有大约8Gb的GPU内存,所以tensorflow分配的GPU内存不能超过1Gb。但当我使用nvidiasmi命令查看内存使用情况时,我发现它使用了~1.5GB,尽管我使用gpu选项限制了内存量 memory\u config=tf.ConfigProto(gp

我在Ubuntu18.04中使用了tensorflow gpu 1.13.1,在Nvidia GeForce RTX 2070(驱动程序版本:415.27)上使用了CUDA 10.0

下面的代码用于管理tensorflow内存使用情况。我有大约8Gb的GPU内存,所以tensorflow分配的GPU内存不能超过1Gb。但当我使用
nvidiasmi
命令查看内存使用情况时,我发现它使用了~1.5GB,尽管我使用gpu选项限制了内存量

memory\u config=tf.ConfigProto(gpu选项=tf.gpu选项(每个进程\u gpu\u内存\u分数=0.12))
memory\u config.gpu\u options.allow\u growth=False
将tf.Session(graph=graph,config=memory\u config)作为sess:
输出dict=sess.run(张量dict,
feed_dict={image_tensor:np.expand_dims(image,0)})
为什么会这样?我如何避免这种情况,或者至少计算每个会话的内存需求?我需要对每个进程进行严格的限制,因为我有几个并行实例,具有不同的会话,所以我需要确保不会出现资源竞争

顺便说一句,我曾尝试将memory\u config.gpu\u options.allow\u growth设置为False,但它不会产生任何影响。Tensorflow仍然以相同的方式分配内存,与此标志值无关。这似乎也很奇怪

解决方案 尝试使用
gpu\u选项。允许\u 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,带15127MB内存)->物理gpu(设备:0,名称:特斯拉P100-PCIE-16GB,pci总线id:0000:03:00.0,计算能力:6.0)

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

在这种情况下,它是345MB

这就是您正在经历的偏移量。让我们来看一看<代码> PyPurraseGPUPythys<代码>:

conf = tf.ConfigProto()
conf.gpu_options.per_process_gpu_memory_fraction=0.1
session = tf.Session(config=conf)
由于gpu的内存16276MB,设置
per_process\u gpu\u memory\u fraction=0.1
可能会让您认为只会分配大约1627MB的内存。但事实是:


1971MB已分配,但与默认内存(345MB)和预期内存(1627MB)之和一致。

是否有不依赖于框架的驱动程序级解决方案?基本上说-默认情况下防止所有CUDA应用占用所有GPU内存?