为什么我的模型没有那么大,但会出现 OOM 错误?

数据挖掘 张量流 显卡
2021-10-04 03:04:15

我是基于 GPU 的训练和深度学习模型的新手。我在我的 2 个 Nvidia GTX 1080 GPU 上的 TensorFlow 中运行 cDCGAN(条件 DCGAN)。我的数据集由大约 320,000 张大小为 64*64 的图像和 2,350 个类别标签组成。如果我将批量大小设置为 32 或更大,则会收到如下所示的 OOM 错误。所以我现在使用 10 个批量大小。

tensorflow.python.framework.errors_impl.ResourceExhaustedError: OOM when allocating tensor with shape[32,64,64,2351] and type float on /job:localhost/replica:0/task:0/device:GPU:0 by allocator GPU_0_bfc
         [[Node: discriminator/concat = ConcatV2[N=2, T=DT_FLOAT, Tidx=DT_INT32, _device="/job:localhost/replica:0/task:0/device:GPU:0"](_arg_Placeholder_0_0/_41, _arg_Placeholder_3_0_3/_43, discriminator/concat/axis)]]
Caused by op 'discriminator/concat', defined at:
  File "cdcgan.py", line 221, in <module>
    D_real, D_real_logits = discriminator(x, y_fill, isTrain)
  File "cdcgan.py", line 48, in discriminator
    cat1 = tf.concat([x, y_fill], 3)

训练非常慢,我知道这取决于批量大小(如果我错了,请纠正我)。如果我这样做help -n 1 nvidia-smi,我会得到以下输出:

在此处输入图像描述

主要GPU:0使用,因为 Volatile GPU-Util 给我大约 0%-65%,而GPU:1最大总是 0%-3%。性能GPU:0总是在 P2 中,而GPU:1主要是 P8 或有时是 P2。我有以下问题。

  1. 为什么我的数据集和模型没有那么大,但在大批量时却出现 OOM 错误?

  2. 如何在 TensorFlow 中平等地利用两个 GPU 以提高性能?(从上面的错误来看,GPU:0 似乎立即满了,而 GPU:1 没有被充分利用。这只是我的理解)。

型号详情如下:

发电机:

我有 4 层(完全连接,UpSampling2d-conv2d,UpSampling2d-conv2d,conv2d)。
W1 的形状为 [X+Y, 16 16 128] 即 (2450, 32768), w2 [3, 3, 128, 64], w3 [3, 3, 64, 32], w4 [[3, 3, 32, 1]] 分别

鉴别器

它有五层(conv2d、conv2d、conv2d、conv2d、全连接)。
w1 [5, 5, X+Y, 64] 即 (5, 5, 2351, 64), w2 [3, 3, 64, 64], w3 [3, 3, 64, 128], w4 [2, 2 , 128, 256], [16 16 256, 1]。

会话配置 我也通过提前分配内存

gpu_options = tf.GPUOptions(allow_growth=True)
session = tf.InteractiveSession(config=tf.ConfigProto(gpu_options=gpu_options))
2个回答
  1. 为什么我的数据集和模型没有那么大,但在大批量时却出现 OOM 错误?

是的,批量大小可能是原因。

此外,另一个原因是您根本不使用第二个 GPU(否则,两个 GPU 将拆分批处理 - 计算 - 您可以使用更大的批处理)。

  1. 如何在 Tensorflow 中平等地利用两个 GPU 以提高性能?(从上面的错误来看,GPU:0 似乎立即满了,而 GPU:1 没有被充分利用。这只是我的理解)

默认情况下,Tensorflow 占用所有可用的 GPU(这就是您使用 nvidia-smi 看到的方式 - 您有一个进程 34589 占用了两个 GPU),但是,除非您在代码中指定实际使用多个 GPU,否则它将仅使用一个默认。

这是关于如何使用多 GPU 的官方 TF 文档:https ://www.tensorflow.org/guide/using_gpu#using_multiple_gpus https://www.tensorflow.org/guide/gpu#using_multiple_gpus

这里有一些关于多 GPU 使用的教程以及更多示例:https ://jhui.github.io/2017/03/07/TensorFlow-GPU/

Blockquote 1) 为什么我的数据集和模型没有那么大,但在大批量时却出现 OOM 错误?
是的,批量大小可能是原因。
此外,另一个原因是您根本不使用第二个 GPU(否则,两个 GPU 将拆分批处理 - 计算 - 您可以使用更大的批处理)。

不,如果您使用图像,批次的大小不是您 OOM 错误的原因 64×64 和一批 32 GPU上的内存成本是:

32323(如果是彩色图像的大小)32(批次大小)32(float32 的位)位 3MB

问题肯定是由于你的神经网络的大小。GAN 在训练生成器时需要在 gpu 上加载判别器和生成器。

您应该计算鉴别器和生成器的大小并添加它们以查看您的 GPU 是否可以加载它