Сбой tenorflow GPU для пакета размером 0 CUDNN_STATUS_BAD_PARAM

Эта проблема, кажется, существует в течение длительного времени, и многие пользователи сталкиваются с проблемой.

stream_executor / cuda / cuda_dnn.cc: 444] не удалось преобразовать BatchDescriptor {count: 0 feature_map_count: 64 пространственный: 7 264 value_min: 0.000000 value_max: 0.000000 макет: BatchDepthYX} t дескриптор тензора cudnn: CUDNN_STATAM_BAD

Сообщение настолько загадочно, что я не знаю, что произошло в моем коде, однако мой код прекрасно работает с тензорным потоком ЦП.

Я слышал, что мы можем использовать tf.cond, чтобы обойти это, но я новичок в tenorflow-gpu, так что кто-то может мне помочь? Мой код использует Keras и использует генератор как ввод, это чтобы избежать проблем с нехваткой памяти. Генератор построен по циклу True 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)

1 ответ

Проблема в том, что ваша модель получила 0 партий. Для меня у меня была ошибка, потому что у меня есть пример 1000, и я запускаю его на нескольких GPus ( 2 GPU) с размером пакета, равным 32 . И на моем графике я разделил размер пакета на размер мини-пакета, чтобы каждый GPU взял 16 примеров. На шаге 31 ( 31 * 32) я закончу 992 примера, так что осталось только 8 примеров, он перейдет к GPU 1, а GPU2 завершится с нулевым размером пакета, поэтому я получил вашу ошибку выше.

Все еще не мог решить это и все еще ищет правильное решение. Я надеюсь, что это поможет вам узнать, когда в вашем коде вы получили нулевой размер пакета.

Другие вопросы по тегам