出现错误“资源耗尽:分配形状为 [1800,1024,28,28] 的张量并在 /job:localhost/... 上键入 float 时出现 OOM”

问题描述 投票:0回答:3

在开始训练我的对象检测 Tensorflow 2.5 GPU 模型时,我收到资源耗尽错误。我使用 18 个训练图像和 3 个测试图像。我使用的预训练模型是 Tensorflow Zoo 2.2 中的 Faster R-CNN ResNet101 V1 640x640 模型。 我使用具有 8 GB 专用内存的 Nvidia RTX 2070 来训练我的模型。

令我困惑的是,当训练集如此之小时,为什么训练过程会占用 GPU 如此多的内存。这是我遇到的错误的 GPU 内存摘要:

Limit:                      6269894656
InUse:                      6103403264
MaxInUse:                   6154866944
NumAllocs:                        4276
MaxAllocSize:               5786902272
Reserved:                            0
PeakReserved:                        0
LargestFreeBlock:                    0

我还将训练数据的批量大小减少到 6,将测试数据的批量大小减少到 1。

tensorflow out-of-memory tensorflow2.0 object-detection object-detection-api
3个回答
5
投票

我在所有在 GPU 上运行的笔记本中使用下面的代码,以防止出现此类错误:

    import tensorflow as tf

    gpus = tf.config.list_physical_devices('GPU')
    if gpus:
      try:
        # Currently, memory growth needs to be the same across GPUs
        for gpu in gpus:
          tf.config.experimental.set_memory_growth(gpu, True)
        logical_gpus = tf.config.list_logical_devices('GPU')
        print(len(gpus), "Physical GPUs,", len(logical_gpus), "Logical GPUs")
      except RuntimeError as e:
        # Memory growth must be set before GPUs have been initialized
        print(e)

默认情况下,TensorFlow 映射进程可见的所有 GPU(受 CUDA_VISIBLE_DEVICES 限制)的几乎所有 GPU 内存。

有关将 GPU 与张量流结合使用的更多信息,请参见此处

也许可以解决错误

希望对你有帮助


3
投票

训练期间的最大内存使用量受到多种因素的影响,减少批量大小通常是解决内存限制的方法。 Alexandre Leobons Souza 的建议也可能会有所帮助,因为它可以让 Tensorflow 在分配内存方面更加灵活,但如果您继续看到 OOM 错误,那么我建议进一步减小批处理大小。或者,您可以尝试限制模型中的可训练变量,这也会导致训练期间内存使用量降低。

您提到,“我感到困惑的是,当训练集如此小时,为什么训练过程会占用 GPU 如此多的内存。”。需要记住的是,在训练期间,您的训练数据将用于向前传递模型,然后您将在向后传递中计算每个可训练变量的梯度。即使您的训练数据很小,中间计算(包括梯度)也需要内存。这些计算根据批量大小和模型大小线性缩放。通过减少批量大小或减少可训练变量的数量,训练将需要更少的内存。

另一个建议,如果训练数据中输入张量的大小发生变化(即,如果地面真值边界框的数量从 1 变为 2 并且您没有填充输入张量),这可能会导致 Tensorflow 回溯训练期间的计算图,您将看到警告。我不确定这种情况下对内存的影响,但怀疑每次回溯实际上都需要内存中的重复模型。如果是这种情况,您可以尝试使用

@tf.function(experimental_relax_shapes=True)


0
投票

第一次看到它时感到沮丧,尝试了@Leobons 的建议,但没有解决问题。 在那之后 我只需重新启动内核即可 BOOMMMM...它可以按预期正常工作

© www.soinside.com 2019 - 2024. All rights reserved.