【问题标题】:Keras LSTM on CPU faster than GPU?CPU 上的 Keras LSTM 比 GPU 更快?
【发布时间】:2017-02-01 04:39:59
【问题描述】:

我正在 Keras 上测试 LSTM 网络,我在 CPU 上的训练速度(在 i2600k 16GB 上为 5 秒/epoch)比在 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 个 epoch 之后,我得到了 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)

有什么想法吗?谢谢!

【问题讨论】:

  • 你是使用 Theano 作为后端还是 Tensorflow?
  • 检查this issue 3 yrs ago,同时确保更新到最新的开发版本。已经有多次加班加速。

标签: performance theano keras lstm


【解决方案1】:

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

只是将LSTM 行更改为:

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

【讨论】:

  • 不幸的是没有recurrent_dropout。
猜你喜欢
  • 2019-02-28
  • 1970-01-01
  • 2018-06-18
  • 2019-12-11
  • 2020-12-06
  • 2022-06-29
  • 1970-01-01
  • 2019-11-06
  • 2018-10-22
相关资源
最近更新 更多