【问题标题】:tensorflow GPU crashes for 0 batch size CUDNN_STATUS_BAD_PARAMtensorflow GPU 崩溃为 0 批量大小 CUDNN_STATUS_BAD_PARAM
【发布时间】:2018-05-13 23:00:41
【问题描述】:

这个问题似乎存在很长时间了,很多用户都面临这个问题。

stream_executor/cuda/cuda_dnn.cc:444] 无法转换 BatchDescriptor {count: 0 feature_map_count: 64 spatial: 7 264 value_min: 0.000000 value_max: 0.000000 layout: BatchDepthYX} t o cudnn 张量描述符:CUDNN_STATUS_BAD_PARAM

消息太神秘了,我不知道我的代码中发生了什么,但是,我的代码在 CPU tensorflow 上运行良好。

我听说我们可以使用 tf.cond 来解决这个问题,但我是 tensorflow-gpu 的新手,所以有人可以帮助我吗?我的代码使用 Keras 并采用生成器之类的输入,这是为了避免任何内存不足的问题。生成器是由一个 while True 循环构建的,该循环按一定的批量大小吐出数据。

def resnet_model(bin_multiple):
    #input and reshape
    inputs = Input(shape=input_shape)
    reshape = Reshape(input_shape_channels)(inputs)
    #normal convnet layer (have to do one initially to get 64 channels)
    conv = Conv2D(64,(1,bin_multiple*note_range),padding="same",activation='relu')(reshape)
    pool = MaxPooling2D(pool_size=(1,2))(conv)
    for i in range(int(np.log2(bin_multiple))-1):
        print( i)
        #residual block
        bn = BatchNormalization()(pool)
        re = Activation('relu')(bn)
        freq_range = int((bin_multiple/(2**(i+1)))*note_range)
        print(freq_range)
        conv = Conv2D(64,(1,freq_range),padding="same",activation='relu')(re)
        #add and downsample
        ad = add([pool,conv])
        pool = MaxPooling2D(pool_size=(1,2))(ad)
    flattened = Flatten()(pool)
    fc = Dense(1024, activation='relu')(flattened)
    do = Dropout(0.5)(fc)
    fc = Dense(512, activation='relu')(do)
    do = Dropout(0.5)(fc)
    outputs = Dense(note_range, activation='sigmoid')(do)
    model = Model(inputs=inputs, outputs=outputs)
    return model

model = resnet_model(bin_multiple)
init_lr = float(args['init_lr'])
    model.compile(loss='binary_crossentropy',
              optimizer=SGD(lr=init_lr,momentum=0.9), metrics=['accuracy', 'mae', 'categorical_accuracy'])
model.summary()
history = model.fit_generator(trainGen.next(),trainGen.steps(), epochs=epochs,     
verbose=1,validation_data=valGen.next(),validation_steps=valGen.steps(),callbacks=callbacks, workers=8, use_multiprocessing=True)

【问题讨论】:

    标签: tensorflow deep-learning gpu tensorflow-gpu


    【解决方案1】:

    问题是当您的模型收到 0 批量大小时。对我来说,我遇到了错误,因为我有 1000 个示例,并且我在批量大小等于 32 的多个 GPU(2 GPU)上运行它。在我的图表中,我将批量大小划分为小批量大小,以便每个 GPU 取 16 个示例。在第 31 步 ( 31 * 32) 我将完成 992 个示例,因此只剩下 8 个示例,它将转到 GPU 1,而 GPU2 将以零批量大小结束,这就是我收到上述错误的原因。

    仍然无法解决,仍在寻找合适的解决方案。 我希望这可以帮助您发现在您的代码中何时收到零批量大小。

    【讨论】:

    • 您可以通过将最后一批填充到您想要的大小来解决它,或者删除最后一批中的示例。对我来说,我做了填充的事情
    • 这个答案听起来像我需要的。你能解释一下你是如何管理你的批量大小的吗?在我的情况下,我没有设置任何批量大小,只是每个时期的步数。我猜优化器会处理这个问题。我正在使用 keras,所以这可能会有所作为。
    • 我仍然对我自己的批量大小问题有些困惑,但我得到了它的工作。这绝对让我走上了正确的轨道。不过现在我的办公室温度高了 5 度。
    • 我也使用过 keras,只需检查生成器的 batch_size,如果它小于您指定的批处理大小,那么您可以填充大小以获得完整的 batch_size。跨度>
    猜你喜欢
    • 2022-08-21
    • 1970-01-01
    • 1970-01-01
    • 2020-05-31
    • 1970-01-01
    • 2020-08-23
    • 2019-11-01
    • 2021-04-11
    • 2018-02-21
    相关资源
    最近更新 更多