解决方案尝试使用gpu_options.allow_growth = True
,查看在tf.Session
创建时消耗了多少默认内存。该内存将始终被分配,而不考虑值。
根据您的结果,它应该小于500MB。因此,如果您希望每个进程真正地拥有1GB的内存,请计算:
(1GB minus default memory)/total_memory
原因
当您创建一个 tf.Session
时,无论您的配置如何,Tensorflow 设备都会在 GPU 上创建。而这个 设备 需要一些最小内存。
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] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 15127 MB memory) -> physical GPU (device: 0, name: Tesla P100-PCIE-16GB, pci bus id: 0000:03:00.0, compute capability: 6.0)
其占用的内存只占了一小部分(根据我的过去经验,这个量会因gpu型号而异)。 注意:设置allow_growth
占用的内存几乎与设置per_process_gpu_memory=0.00001
相同,但后者无法正确创建会话。
在这种情况下,它是345MB:
![enter image description here](https://istack.dev59.com/47JIM.webp)
这就是你所遇到的偏移量。让我们看一下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](https://istack.dev59.com/tlDwD.webp)
1,971MB被分配,但是这恰好与默认内存(345MB)和预期内存(1,627MB)之和相同。