2017-02-07 127 views
6

我很难理解GPU和CPU速度与小尺寸网络(CPU有时更快)相似的原因,而GPU更快更大尺寸的网络。问题底部的代码在i7-6700k上以103.7s运行,但是当使用tensorflow-gpu时,代码运行时间为29.5秒。然而,当我训练一个拥有100个隐藏神经元的网络时,而不是像下面的例子那样使用1000,我使用GPU时约20秒,使用CPU约15秒。在训练某些网络时,Keras(Tensorflow后端)在GPU上比在CPU上慢CPU

我读过CPU-> GPU传输需要很长时间的另一个堆栈溢出答案,我假设这是参考在GPU上加载数据示例。

有人可以解释为什么会出现这种情况,并且可能引用了一些可以使速度最大化的代码更改?

import numpy as np 
import tensorflow as tf 
import keras 
from keras.models import Sequential 
from keras.utils import np_utils 
from keras.layers.core import Dense, Activation, Flatten, Dropout 
from sklearn.preprocessing import normalize 

## Importing the MNIST dataset using Keras 
from keras.datasets import mnist 
(X_train, y_train), (X_test, y_test) = mnist.load_data() 

# reshape for vector input 
N, x, y = X_train.shape 
X_train = normalize(np.reshape(X_train, (N, x * y))) 

N, x, y = X_test.shape 
X_test = normalize(np.reshape(X_test, (N, x * y))) 

# one-hot encoding 
y_train = np_utils.to_categorical(y_train) 
y_test = np_utils.to_categorical(y_test) 

model = Sequential() 
model.add(Dense(output_dim=750, input_dim=784)) 
model.add(Activation('relu')) 
model.add(Dropout(0.2)) 

model.add(Dense(150)) 
model.add(Activation('relu')) 
model.add(Dropout(0.2)) 

model.add(Dense(50)) 
model.add(Activation('relu')) 
model.add(Dropout(0.2)) 

model.add(Dense(50)) 
model.add(Activation('relu')) 
model.add(Dropout(0.2)) 

model.add(Dense(10)) 
model.add(Activation('softmax')) 

model.compile(loss='categorical_crossentropy', optimizer='Nadam', metrics=['accuracy']) 

fit = model.fit(X_train, y_train, batch_size=128, nb_epoch=10, verbose=0) 

## Printing the accuracy of our model, according to the loss function specified in model.compile above 
score = model.evaluate(X_test, y_test, verbose=0) 
print('Test score:', score[0]) 
print('Test accuracy:', score[1]) 
+1

您使用的是什么GPU?请注意,要完全饱和顶级GPU,需要数以万计的线程。假设每个线程处理一个神经元的计算,一个具有100个神经元的系统将没有充分利用GPU。相反,如果要将神经元数量增加到10K,那么GPU相对于CPU的相对优势可能会进一步增加。 – njuffa

+0

哎呀,完全忘记了在答案中包含这一点。我有一个GTX 1070.我明白了。这是有道理的 –

+0

我实际上注意到我的GTX 1070 GPU上的相同行为。我没有看到在CPU(i7-7700)和GPU上运行我的模型(与您使用的尺寸类似)。需要尝试增加网络评估差异的能力 – mspadaccino

回答

1

万一小网络批量加载可能是罪魁祸首。在每次迭代开始时,Keras将RAM中的每个minibatch加载到GPU,从而在小型网络(前向/后向计算非常快)中形成一个瓶颈。
您可以尝试使用model.fit_generator而不是普通的fit,以便加载微型版的CPU线程并行工作。

不幸的是,有没有办法,我知道的预加载在GPU的Keras整个数据集(见my issue

如果您使用Tensorflow后端,您可以使用谷歌时间轴分析工具,看看是什么原因导致减速。有关参考,请参阅this issue