是否可以使用单个GPU同时训练多个回归神经网络?

时间:2016-07-14 02:33:40

标签: tensorflow theano

此处how to train multiple neural networks simultaneously也提出了类似的问题,但答案仅针对Caffe。这是我的具体问题:

我的一位朋友使用Theano和TensorFlow为某个问题设计了一个RNN。它有14个输入节点,2个隐藏层,每个节点有7个节点,最后是一个输出节点。我们有大约30,000个这样的RNN需要接受培训。我是一名软件工程师,很少接触机器学习。我需要做的是加快这些RNN的培训过程。

从CS的角度来看问题,我认为没有任何办法可以加速单个RNN的培训。在GPU上运行如此小的RNN毫无意义。相反,我们可以通过批量配置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

1 个答案:

答案 0 :(得分:1)

我相信你想要做的就是让你的1000个独立模型看起来像一个模型用于培训目的。只要简单模型都具有相同的体系结构并且仅仅通过它们的参数(这是学习的,那么它们实际上只是通过训练样例序列而有所不同),就应该可以定义一个复合模型。层是简单模型层的1000个副本,并且定义层间连接,使得每个层中的每个单元仅连接到对应于相同简单模型的相邻层中的单元。 复合模型应该在GPU上更有效地执行。

然后,您还需要弄清楚如何配置输入层以与模型并行输入正确的输入,可能是通过连接1000个批次。

这有意义吗?也许如果您为简单模型发布TensorFlow源,则可能会为您提供有关如何构建此类复合模型的更具体建议。

(你也可能试图解决错误的问题,而不是训练30k单独的小型RNN,你应该用一些额外的配置输入训练一个更大的网络。)