我在TensorFlow中运行了MNIST演示,其中包含2个转换层和一个完整的连接层,我得到了一条消息"用尽了分配2.59GiB的内存",但它显示总内存为4.69GiB,可用内存为3.22 GiB,它怎么能用2.59GiB停止?而对于更大的网络,我该如何管理gpu内存?我只关心如何充分利用gpu内存并想知道它是如何发生的,而不是如何预先分配内存
nic*_*oss 27
在GTX 970上训练一个小型CNN时,我遇到了内存不足错误.通过一些侥幸,我发现告诉TensorFlow根据需要(而不是预先)在GPU上分配内存解决了我的所有问题.这可以使用以下Python代码完成:
config = tf.ConfigProto()
config.gpu_options.allow_growth = True
sess = tf.Session(config=config)
Run Code Online (Sandbox Code Playgroud)
以前,TensorFlow会预先分配~90%的GPU内存.由于某些未知原因,即使模型完全适合GPU内存,这也会导致内存不足错误.通过使用上面的代码,我不再有OOM错误.
注意:如果模型太大而无法放入GPU内存,这可能无济于事!
mrp*_*x13 14
这不是那个.首先,您可以通过监视您的gpu来查看它运行时获得的内存量.例如,如果你有一个nvidia gpu你可以用watch -n 1 nvidia-smi命令检查.但在大多数情况下,如果你没有设置gpu内存的最大分数,它几乎分配了整个可用内存.你的问题是你的gpu缺乏足够的内存.cnn网络非常繁重.当您尝试为网络提供信息时,请勿使用整个数据.以低批量大小进行此喂料程序.
Nan*_*esh 10
默认情况下,TensorFlow几乎映射了进程可见的所有GPU(受CUDA_VISIBLE_DEVICES影响)的所有GPU内存.这样做是为了通过减少内存碎片来更有效地使用设备上相对宝贵的GPU内存资源.
TensorFlow在Session上提供了两个Config选项来控制它.
第一个是allow_growth选项,它尝试根据运行时分配仅分配尽可能多的GPU内存:
config = tf.ConfigProto()
config.gpu_options.allow_growth = True
session = tf.Session(config=config)
Run Code Online (Sandbox Code Playgroud)
第二种方法是per_process_gpu_memory_fraction选项,它确定应分配每个可见GPU的总内存量的分数.例如,您可以通过以下方式告诉TensorFlow仅分配每个GPU总内存的40%:
config = tf.ConfigProto()
config.gpu_options.per_process_gpu_memory_fraction = 0.4
session = tf.Session(config=config)
Run Code Online (Sandbox Code Playgroud)
张量流2
由于我们不再有会话,该解决方案不再可行。
默认情况下,TensorFlow 映射进程可见的所有 GPU(受 CUDA_VISIBLE_DEVICES 限制)的几乎所有 GPU 内存。
在某些情况下,希望进程仅分配可用内存的子集,或者仅根据进程的需要增加内存使用量。TensorFlow 提供了两种方法来控制这一点。其中之一是使用set_memory_growth tf.config.experimental.set_memory_growth
为了充分理解,我推荐这个链接:限制 GPU 内存增长
小智 5
gpus = tf.config.experimental.list_physical_devices('GPU')
if gpus:
# Restrict TensorFlow to only allocate 1GB of memory on the first GPU
try:
tf.config.experimental.set_virtual_device_configuration(gpus[0],
[tf.config.experimental.VirtualDeviceConfiguration(memory_limit=1024)])
logical_gpus = tf.config.experimental.list_logical_devices('GPU')
print(len(gpus), "Physical GPUs,", len(logical_gpus), "Logical GPUs")
except RuntimeError as e:
# Virtual devices must be set before GPUs have been initialized
print(e)
Run Code Online (Sandbox Code Playgroud)
调整memory_limit=*value*到适合您的 GPU 的合理值。例如,从 Nvidia docker 容器和远程屏幕会话访问 1070ti 时,不会memory_limit=7168再出现任何错误。只需确保 GPU 上的会话偶尔被清除(例如 Jupyter 内核重新启动)。