CPU 上的 Keras LSTM 比 GPU 快?
Keras LSTM on CPU faster than GPU?
我正在 Keras 上测试 LSTM 网络,我在 CPU(i2600k 16GB 上 5 seconds/epoch)上的训练速度比在 GPU 上(Nvidia 1060 6GB 上 35 秒)快得多。 GPU 利用率 运行 约为 15%,在尝试包括 Keras 示例在内的其他 LSTM 网络时,我从未见过它超过 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)
有什么想法吗?谢谢!
使用 Keras 的 CuDNNLSTM
单元在 Nvidia GPU 上加速计算:https://keras.io/layers/recurrent/#cudnnlstm
它只是将 LSTM
行更改为:
model.add(CuDNNLSTM(20, input_shape=(50000,3), return_sequences=True))
我正在 Keras 上测试 LSTM 网络,我在 CPU(i2600k 16GB 上 5 seconds/epoch)上的训练速度比在 GPU 上(Nvidia 1060 6GB 上 35 秒)快得多。 GPU 利用率 运行 约为 15%,在尝试包括 Keras 示例在内的其他 LSTM 网络时,我从未见过它超过 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)
有什么想法吗?谢谢!
使用 Keras 的 CuDNNLSTM
单元在 Nvidia GPU 上加速计算:https://keras.io/layers/recurrent/#cudnnlstm
它只是将 LSTM
行更改为:
model.add(CuDNNLSTM(20, input_shape=(50000,3), return_sequences=True))