2017-02-07 25 views
6

GPUとCPUの速度が小さい(CPUは時には高速です)GPUとCPUの速度が似ている理由を正確に理解できません。より大きなサイズのネットワーク。質問の一番下のコードはi7-6700kの103.7sで実行されますが、tensorflow-gpuを使用するとコードは29.5秒で実行されます。Keras(Tensorflowバックエンド)は、特定のネットワークを訓練するときにCPUよりGPUの方が遅い

しかし、以下の例のように1000の代わりに100個の隠れたニューロンを持つネットワークをトレーニングすると、GPUを使用すると約20秒、CPUを使用する場合約15秒になります。

私は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を完全に飽和させるには、数万スレッドが必要です。各スレッドが1つのニューロンの計算を処理すると仮定すると、100個のニューロンを有するシステムはGPUを十分に活用しないであろう。逆に、ニューロンの数を10Kに増やす場合、GPUとCPUの相対的な優位性はさらに高まる可能性があります。 – njuffa

+0

おっと、答えにそれを完全に忘れてしまった。私はGTX 1070を持っています。それは意味をなさない –

+0

私は実際にGTX 1070 GPUで同じ動作に気づいた。私はCPU(i7-7700)とGPU上で私のモデル(使用しているものと似た寸法を持っている)を走らせることと違いは見られません。違いを評価するためにネットワークの容量を増やそうとする必要がある – mspadaccino

答えて

1

小さなネットワークの場合は、バッチローディングが原因である可能性があります。

Kerasは各反復の開始時にRAMからGPUに各ミニバックをロードしているため、小さなネットワークでボトルネックが発生します(前方/後方計算が非常に速い)。
fitの代わりにmodel.fit_generatorを試すと、ミニバッチをロードするCPUスレッドが並列に機能します。あなたはTensorflowバックエンドを使用している場合

残念ながら、私はKerasのためのGPUにデータセット全体をプリロードするのを認識しています方法はありません(my issueを参照)

、あなたは原因を確認するためにGoogleのタイムラインプロファイリングツールを使用することができます減速。参考までに、this issue

関連する問題