【问题标题】:Tensorflow cnn trianing ResourceExhaustedError: OOM when allocating tensor with shape []Tensorflow cnn trianing ResourceExhaustedError: OOM 分配具有形状 [] 的张量时
【发布时间】:2020-01-13 19:32:41
【问题描述】:

我正在尝试使用带有 GPU (GeForce 940 M) 的 tensorflow 2.0 训练深度残差网络(ResNet34,总共有 21,302,722 个参数)。顺序模型定义如下:

model = keras.models.Sequential()
model.add(DefaultConv2D(64, kernel_size=7, strides=2,
                        input_shape=[224, 224, 3]))
model.add(keras.layers.BatchNormalization())
model.add(keras.layers.Activation("relu"))
model.add(keras.layers.MaxPool2D(pool_size=3, strides=2, padding="SAME"))

prev_filters = 64
for filters in [64] * 3 + [128] * 4 + [256] * 6 + [512] * 3:
    strides = 1 if filters == prev_filters else 2
    model.add(ResidualUnit(filters, strides=strides))
    prev_filters = filters

model.add(keras.layers.GlobalAvgPool2D())
model.add(keras.layers.Flatten())
model.add(keras.layers.Dense(2, activation="softmax"))
model.summary()

这个模型是经过训练的:

history = model.fit(xtrain, ytrain, epochs=10, validation_data=[xtest, ytest])

xtrain 的形状为(2000, 224, 224, 3)xtest 的形状为(1000, 224, 224, 3)

然后我收到OOM错误信息:

ResourceExhaustedError: OOM when allocating tensor with shape[256,256,3,3] and type float on /job:localhost/replica:0/task:0/device:GPU:0 by allocator GPU_0_bfc
     [[{{node residual_unit_28/conv2d_64/Conv2D}}]]
Hint: If you want to see a list of allocated tensors when OOM happens, add report_tensor_allocations_upon_oom to RunOptions for current allocation info.

     [[GroupCrossDeviceControlEdges_0/training/Nadam/Nadam/Const/_287]]
Hint: If you want to see a list of allocated tensors when OOM happens, add report_tensor_allocations_upon_oom to RunOptions for current allocation info.
 [Op:__inference_keras_scratch_graph_30479]

这个错误是我的电脑内存(它有 16 GB RAM)还是一些不正确的配置引起的?

【问题讨论】:

    标签: tensorflow deep-learning gpu


    【解决方案1】:

    GPU 内存和计算机内存 (RAM) 不同。当您使用 GPU 进行训练时,它需要将层和输入加载到 GPU 内存中。您的 GPU 内存参数太多。我查看了你的 GPU,它只有 2 GB 的内存,不足以进行任何形式的严肃图像网络训练。如果您想使用 GPU 进行训练,我建议您减少网络中的单元数量、降低批量大小或整体使用更小的模型。

    【讨论】:

    • 感谢您的回复!如何知道我的计算机是否可以管理简化的网络?我正在考虑减少层数,并使用更少的过滤器。
    • 好吧,一种方法就是尝试一下。您还可以通过查看参数的数量来“粗略地”计算它是否适合。每个参数都是一个浮点数,对于每个参数,您需要存储它以及它的梯度。这里的关键字是粗略的。您也可以使用 CPU 进行训练,这将花费更长的时间,但您将不再受内存限制。我从 GPU 猜测您正在使用笔记本电脑,如果您想训练 resnet 之类的东西,我的真正建议是尝试 Google Cloud、Amazon AWS 等在线服务。如果您是学生,他们会给您免费学分使用他们的 GPU。
    • 我不知道你有什么样的 CPU,但对于相对老旧且功率不足的 GPU,与 CPU 相比,你获得的加速量可能不值得模型尺寸的下降。真的取决于你的目标/用例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-28
    • 1970-01-01
    相关资源
    最近更新 更多