如何在TensorFlow中解决'用完gpu内存'问题

Fan*_*xin 27 tensorflow

我在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网络非常繁重.当您尝试为网络提供信息时,请勿使用整个数据.以低批量大小进行此喂料程序.

  • 我有一个相当大的网络(CNN + LSTM).我的输入数据大小,batch_size = 5,(5x396x396) - 这是一个3D卷.因此批量相当小.我正在运行带有8GB RAM的GTX 1070,但我的内存仍然不足.你知道有什么变通方法吗?任何概述解决方法的教程? (5认同)

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)


Agu*_*ina 9

张量流2

由于我们不再有会话,该解决方案不再可行。

默认情况下,TensorFlow 映射进程可见的所有 GPU(受 CUDA_VISIBLE_DEVICES 限制)的几乎所有 GPU 内存。
在某些情况下,希望进程仅分配可用内存的子集,或者仅根据进程的需要增加内存使用量。TensorFlow 提供了两种方法来控制这一点。其中之一是使用set_memory_growth tf.config.experimental.set_memory_growth

为了充分理解,我推荐这个链接:限制 GPU 内存增长


小智 5

来自TensorFlow 指南

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 内核重新启动)。