Keras LSTM在CPU上比GPU更快?

时间:2017-02-01 04:40:00

标签: performance theano keras lstm

我正在Keras上测试LSTM网络,我在CPU上的训练速度要快得多(i2600k 16GB上的5秒/纪元),而不是GPU(Nvidia 1060 6GB上的35秒)。 GPU利用率大约为15%,在尝试其他LSTM网络(包括Keras示例)时,我从未看到它超过30%。当我运行其他类型的网络MLP和CNN时,GPU要快得多。我正在使用最新的theano 0.9.0dev4和keras 1.2.0

序列有50,000个时间步长,有3个输入(整数)。

如果输入是降序(3,2,1),则输出为0,如果是递增则为1,除非最后两个是也是上升,然后输出为0而不是1.

在250个时代之后,我获得了99.97%的准确率,但为什么GPU这么慢?我在模型中做错了吗?我尝试了各种批量设置,仍然遇到了同样的问题。

def generate_data():
    X=[]
    Y=[]
    for i in range(50000):
        start=random.randint(1,100)
        d=random.randrange(-1,2,2) #-1 or 1
        param=[(start),(start+d),(start+d+d)]
        X.append(np.array(param))
        if d<0:
            Y.append([1,0])

        elif len(Y)>2 and d>0 and Y[-1][1]==1 and Y[-2][1]==1:
            Y.append([1,0])
        elif d>0:
            Y.append([0,1])
    X=np.array(X)
    Y=np.array(Y)
    return X,Y
X,Y = generate_data()
X=np.asarray(X,'float32')
Y=np.asarray(Y,'float32')
X=np.reshape(X,(1,len(X),3))
Y=np.reshape(Y,(1,len(Y),2))

model=Sequential()
model.add(LSTM(20, input_shape=(50000,3), return_sequences=True))
model.add(Dense(2))
model.add(Activation('softmax'))

model.compile(loss='categorical_crossentropy', optimizer=RMSprop(), metrics=['accuracy'])
history = model.fit(X, Y,batch_size=100, nb_epoch=250, verbose=2)

有什么想法?谢谢!

1 个答案:

答案 0 :(得分:5)

使用Keras'CuDNNLSTM单元在Nvidia GPU上加速计算:https://keras.io/layers/recurrent/#cudnnlstm

只是将LSTM行更改为:

model.add(CuDNNLSTM(20, input_shape=(50000,3), return_sequences=True))