Несоответствие формы с keras multi_gpu_model, но отлично работает на одном GPU - PullRequest
0 голосов
/ 05 декабря 2018

Моя архитектура - это стандартный декодер seq-to-seq, использующий генератор keras, поэтому мне не нужно загружать TD в память сразу.Это прекрасно работает в той же виртуальной среде, где я получаю сообщение об ошибке (то есть с tenorflow-gpu), если я просто изменяю вызовы compile и fit для self.model, то есть все работает нормально на одном GPU.Но с несколькими графическими процессорами, некоторая часть этого корректируется или неправильно комбинируется, что приводит к несоответствию формы.Вот ошибка: [! [Введите описание изображения здесь] [1]] [1]

---- РЕДАКТИРОВАТЬ ---- Мне удалось воспроизвести эту ошибку довольно тривиально, используя следующий код водин файл, с последней версией keras + tenorflow-gpu + cuda9.2:

import tensorflow as tf
import numpy as np
from keras.utils import multi_gpu_model, Sequence
from keras.layers import Input, LSTM, Dense, TimeDistributed, Embedding
from keras.models import Model

BATCH_SIZE = 4

class trivial_Sequence(Sequence):

    def __init__(self, x_set, y_set, batch_size):
        self.x = np.zeros((batch_size*4, 64))
        self.y = np.zeros((batch_size*4, 64, 1))
        self.batch_size = batch_size

    def __len__(self):
        return int(np.ceil(len(self.x)/float(self.batch_size)))

    def __getitem__(self, idx):
        batch_x = self.x[idx*self.batch_size:(idx+1)*self.batch_size]
        batch_y = self.y[idx*self.batch_size:(idx+1)*self.batch_size]

        return batch_x, batch_y


def error_train():

    #instantiate components

    td = trivial_Sequence(None, None, BATCH_SIZE)
    input = Input(shape=(None,), dtype='int32')
    emb = Embedding(output_dim=10, input_dim = 64, input_length=None)
    encode = LSTM(10, return_sequences=True, return_state = True)
    project_up = Dense(units=20, activation='softmax')

    #build network

    temp = emb(input)
    temp, _, _ = encode(temp)
    output = TimeDistributed(project_up)(temp)

    model = Model(inputs = input, outputs = output)
    parallel_model = multi_gpu_model(model, gpus=4)

    parallel_model.compile(optimizer='rmsprop', loss='sparse_categorical_crossentropy',
                       metrics=['sparse_categorical_accuracy'])

    parallel_model.fit_generator(td, epochs=1, verbose=1)


#run it

error_train()
...