Сбой 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 завершится с нулевым размером пакета, поэтому я получил вашу ошибку выше.
Все еще не мог решить это и все еще ищет правильное решение. Я надеюсь, что это поможет вам узнать, когда в вашем коде вы получили нулевой размер пакета.