同様の質問がhow to train multiple neural networks simultaneouslyに聞かれましたが、回答はCaffeに特有のものでした。具体的な質問は次のとおりです。複数のリカレントニューラルネットワークを1つのGPUで同時に訓練することは可能ですか?
私の友人は、TheanoとTensorFlowを使用して特定の問題のRNNを設計しました。それは、14の入力ノードと、それぞれ7つのノードを有する2つの隠れ層と、最後に出力ノードとを有する。私たちは、このようなRNNを訓練する必要がある約30,000人を持っています。私はMachine Learningにはほとんど触れていないソフトウェアエンジニアです。私がする必要があるのは、これらのRNNのトレーニングプロセスをスピードアップすることです。
CSの観点から見ると、私は1つのRNNのトレーニングをスピードアップするために何かができるとは思わない。このような小さなRNNをGPU上で実行することは意味をなさない。代わりに、RNNを一度に1000個ずつバッチしてGPUに送信することでスピードアップを達成できます。問題の性質はSIMDです。各RNNは同一ですが、異なるデータセットでトレーニングする必要があります。
誰かがTheanoまたはTensorFlowを使用してこれを行う方法を説明できますか?ここで
は、単一モデルのコードは次のとおりです。
import pandas as pd
df=pd.DataFrame(b,columns= ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T'])
ds=df.groupby(['A','Q','R']).apply(lambda h:h.sort('S')).values.tolist()
import math
stationary_id=0
sale_from_previous_day=[]
for i in xrange(0,len(ds)):
if ds[i][0]!= stationary_id:
stationary_id=ds[i][0]
sale_from_previous_day.append(0)
else:
if float(ds[i-1][19])==0:
sale_from_previous_day.append(0)
else:
sale_from_previous_day.append(math.log(1+float(ds[i-1][19]))/float(ds[i-1][19]))
import numpy as np
import tensorflow as tf
from tensorflow.python.ops import rnn_cell
# create a placeholder for input layer
input_layer = tf.placeholder(tf.float32, [1, 14])
# no. of neurons & layers
num_hidden = 7
num_layers = 2
# Construct Multilayer RNN
network = rnn_cell.BasicRNNCell(num_hidden)
network1 = rnn_cell.MultiRNNCell([network] * num_layers)
# The hidden state as a Variable initialized to zeroes
state1 = tf.Variable(tf.zeros([1, network1.state_size]))
# Connect the input layer and initial hidden state to the rnn cell
output1, state_output1 = network1(input_layer, state1)
# update the state
update_op1 = state1.assign(state_output1)
#hidden to output weights
output_W1 = tf.Variable(tf.truncated_normal([7, 1]))
#keep an outbias as well
output_b1 = tf.Variable(tf.zeros([1]))
#the outclass linear layer returns predicted output
final_output = tf.matmul(output1, output_W1) + output_b1
#Input for correct output (for training)
correct_output = tf.placeholder(tf.float32, [1, 1])
##Calculate the Sum-of-Squares Error
error = tf.pow(tf.sub(final_output, correct_output), 2)
#Adam's
train_step = tf.train.AdamOptimizer(0.0006).minimize(error)
##session
sess = tf.Session(config=tf.ConfigProto(inter_op_parallelism_threads=1,
intra_op_parallelism_threads=1))
#Initialize all Variables
sess.run(tf.initialize_all_variables())
for epoch in range(0,7):
er= 0
pon= 0
for i in range(len(ds)):
a,b=np.array([[ds[i][1],ds[i][2],ds[i][3],ds[i][4],ds[i][5],ds[i][6],ds[i][7],ds[i][8],ds[i][9],ds[i][10],ds[i][11],ds[i][12],ds[i][14],sale_from_previous_day[i]]]),np.array([[ds[i][19]]])
_, _, network_output = sess.run([update_op1,train_step,final_output],feed_dict = { input_layer: a,correct_output: b})
er+= 0.5*((b[0][0]) - (network_output[0][0]))**2
pon+= 1
print er/pon
print(int(round(time.time() * 1000))-m1)/1000.0
たとえばカフェのためだけ両方のネット上の入力レイヤーをマージし、名前の衝突を防ぐためにノードの名前を変更します。これはおそらく、TheanoとTensorFlowで行うのは簡単ではありません。これにより、同じミニバックをGPUに複写する必要がなくなります。しかし、あなたの場合、テクニックはあなたを助けないように、あなたは異なるトレーニングセットを持っています。 –
あなたの問題は小さく見えます(トレーニングセットの大きさは言わない)が、DLエンジンはGPUが提供する最後のすべての電力を使用する傾向があります(Linuxの場合は 'watch nvidia-smi'をチェックします)。各反復には数ミリ秒しかかからないかもしれないと心配しているようです。 GPUで1つのタスクが実行されている間に複数のスレッドを実行した場合、別のタスクがデータをコピーしたり、出力を集計したりする可能性があります。または、GPUをオフにして複数のCPUスレッドを実行するだけですか? –