2017-11-30 6 views
1

이 문제는 오래 동안 존재하는 것으로 보이며 많은 사용자가이 문제에 직면 해 있습니다.tensorflow 0 일괄 처리 크기에 GPU가 충돌 함 CUDNN_STATUS_BAD_PARAM

stream_executor/쿠다/cuda_dnn.cc : 444] BatchDescriptor 변환 할 수 {개수 : 0 feature_map_count 64 공간적 7 264 value_min : 0.000000 value_max : 0.000000 레이아웃 : BatchDepthYX} t O cudnn 텐서 설명 : CUDNN_STATUS_BAD_PARAM

메시지가 너무 신비 스럽기 때문에 코드에서 무슨 일이 일어 났는지 알지 못하지만 코드는 CPU 텐서 흐름에서 잘 작동합니다.

우리는 tf.cond를 사용하여이 문제를 해결할 수 있다고 들었지만 tensorflow-gpu에 익숙하지 않아 누군가 나를 도와 줄 수 있습니까? 내 코드는 Keras를 사용하고 입력과 같이 생성기를 사용합니다. 이는 메모리 부족 문제를 피하기위한 것입니다. 생성기는 일부 일괄 처리 크기로 데이터를 내보내는 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

수신 된 일괄 처리 크기를 모델링 할 때 문제가 발생합니다. 나를 위해 나는 1000 예를 가지고 있기 때문에 오류가 있었고 나는 32와 동일한 배치 크기를 가진 다중 GPU (2 GPU)에서 그것을 실행했다. 그리고 나의 그래프에서 나는 배치 크기를 미니 배치 크기로 나눠 각 GPU가 16을 취하도록했다. 31 단계 (31 * 32)에서 나는 992 개의 예제를 마쳤습니다. 따라서 8 개의 예제 만 남았습니다. GPU 1로 갈 것이고 GPU2는 제로 배치 크기로 끝날 것입니다. 그래서 위의 에러를 받았습니다.

아직도 해결할 수 없으며 적절한 해결책을 찾고 있습니다. 코드에서 언제 배치 크기가 0인지를 발견하는 데 도움이되기를 바랍니다.

+0

원하는 크기로 마지막 배치를 채우거나 마지막 배치에 예제를 놓아서 해결할 수 있습니다. 나를 위해, 나는 패딩 것들을 했어. –