2016-07-14 2 views
0

同様の質問が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 
+0

たとえばカフェのためだけ両方のネット上の入力レイヤーをマージし、名前の衝突を防ぐためにノードの名前を変更します。これはおそらく、TheanoとTensorFlowで行うのは簡単ではありません。これにより、同じミニバックをGPUに複写する必要がなくなります。しかし、あなたの場合、テクニックはあなたを助けないように、あなたは異なるトレーニングセットを持っています。 –

+0

あなたの問題は小さく見えます(トレーニングセットの大きさは言わない)が、DLエンジンはGPUが提供する最後のすべての電力を使用する傾向があります(Linuxの場合は 'watch nvidia-smi'をチェックします)。各反復には数ミリ秒しかかからないかもしれないと心配しているようです。 GPUで1つのタスクが実行されている間に複数のスレッドを実行した場合、別のタスクがデータをコピーしたり、出力を集計したりする可能性があります。または、GPUをオフにして複数のCPUスレッドを実行するだけですか? –

答えて

1

私は何がやりたいことは、あなたの1000の別々のモデルが訓練目的のために1つのモデルのように見せることであると考えています。単純なモデルはすべて同じアーキテクチャーを持ち、パラメーターによってのみ異なる(実際には学習のシーケンスによってのみ異なるので、実際には異なる)、複合モデルを定義することが可能でなければなりませんレイヤは単純モデルレイヤの1000コピーであり、レイヤ間接続性は、各レイヤの各セルが同じシンプルモデルに対応する隣接レイヤのセルにのみ接続されるように定義されています。 複合モデルは、GPUでより効率的に実行する必要があります。

次に、正確な入力をモデルに並列に入力するように入力レイヤーを構成する方法を理解する必要があります。おそらく1000ワイドのバッチを連結します。

これは意味がありますか?おそらく、単純なモデルのTensorFlowソースを投稿すると、そのような複合モデルを構築する方法についてより具体的な助言を与えることができます。

(それはあなたが間違った問題を解決しようとしている、と代わりにトレーニング30kを別々の小さなのRNNのあなたには、いくつかの追加設定 - 入力で1つのいくらか大きなネットワークを訓練する必要があることも可能です。)

+0

ポストを単一のモデルのコードで更新しました。私は、小さなRNN、そしてそれらの多くが必要だと思います。ありがとうございました! – user1274878

+0

これに関するサンプルファイルはありますか?これは本当に興味深いでしょう。また、どのように多くのそのようなネットワークが1つのGPUで同時に訓練できるか知るために。 – silgon

関連する問題