获取错误 "Resource exhausted: OOM when allocating tensor with shape[1800,1024,28,28] and type float on /job:localhost/..."
Getting error "Resource exhausted: OOM when allocating tensor with shape[1800,1024,28,28] and type float on /job:localhost/..."
我在开始训练我的对象检测 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。
我在我 运行 在 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)
By default, TensorFlow maps nearly all of the GPU memory of all GPUs (subject to CUDA_VISIBLE_DEVICES) visible to the process.
More information about using gpu with tensorflow here
也许它会解决错误
希望对你有所帮助
训练期间的最大内存使用量受多种因素的影响,减少批量大小通常是解决内存限制的方法。 Alexandre Leobons Souza 的建议也可能有所帮助,因为它可以让 Tensorflow 在分配内存时更加灵活,但如果您继续看到 OOM 错误,那么我建议进一步减少批处理大小。或者,您可以尝试限制模型中的可训练变量,这也会导致训练期间的内存使用率降低。
您提到,“令我感到困惑的是,为什么训练过程在训练集如此小的情况下会占用我的 GPU 如此多的内存。”。需要记住的是,在训练期间,您的训练数据将用于前向传递模型,然后您将在向后传递中计算每个可训练变量的梯度。即使您的训练数据很小,中间计算(包括梯度)也需要内存。这些计算会根据您的批量大小和模型大小线性扩展。通过减少批量大小或减少可训练变量的数量,训练将需要更少的内存。
另一个建议,如果你的输入张量的大小在你的训练数据中发生变化(即如果地面实况边界框的数量从 1 变为 2 而你没有填充输入张量),这可能会导致Tensorflow 在训练期间回溯计算图,您将看到警告。我不确定在这种情况下对内存的影响,但怀疑每次回溯实际上都需要内存中的重复模型。如果是这种情况,您可以尝试使用 @tf.function(experimental_relax_shapes=True)
.
我在开始训练我的对象检测 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。
我在我 运行 在 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)
By default, TensorFlow maps nearly all of the GPU memory of all GPUs (subject to CUDA_VISIBLE_DEVICES) visible to the process.
More information about using gpu with tensorflow here
也许它会解决错误
希望对你有所帮助
训练期间的最大内存使用量受多种因素的影响,减少批量大小通常是解决内存限制的方法。 Alexandre Leobons Souza 的建议也可能有所帮助,因为它可以让 Tensorflow 在分配内存时更加灵活,但如果您继续看到 OOM 错误,那么我建议进一步减少批处理大小。或者,您可以尝试限制模型中的可训练变量,这也会导致训练期间的内存使用率降低。
您提到,“令我感到困惑的是,为什么训练过程在训练集如此小的情况下会占用我的 GPU 如此多的内存。”。需要记住的是,在训练期间,您的训练数据将用于前向传递模型,然后您将在向后传递中计算每个可训练变量的梯度。即使您的训练数据很小,中间计算(包括梯度)也需要内存。这些计算会根据您的批量大小和模型大小线性扩展。通过减少批量大小或减少可训练变量的数量,训练将需要更少的内存。
另一个建议,如果你的输入张量的大小在你的训练数据中发生变化(即如果地面实况边界框的数量从 1 变为 2 而你没有填充输入张量),这可能会导致Tensorflow 在训练期间回溯计算图,您将看到警告。我不确定在这种情况下对内存的影响,但怀疑每次回溯实际上都需要内存中的重复模型。如果是这种情况,您可以尝试使用 @tf.function(experimental_relax_shapes=True)
.