GPU 上缓慢的 TensorFlow 训练和评估

Slow tensorflow training and evaluation on GPU

所以我正在进行一些研究,并且有很多关于一个物体在一个房间里被两个人一起移动的速度和加速度数据。之前,我已经使用 LSTM 和 RNN 成功地训练了一个时间序列预测神经网络,以预测物体在未来某个时间步的速度。

训练此神经网络后,我将其扩充以使用预测以及之前的数据来预测未来的另一个时间步长,依此类推一定数量的时间步长。我附上了它的外观图,NN_explanation。本质上,我使用以前的数据(大小为 N 个时间步长,M 个输入)来预测一个步骤,然后将此预测添加到输入的末尾,并删除输入的第一个时间步长(以保持大小 N x M)然后为下一个时间步再次训练,直到我有 P 个未来预测来与测量数据进行比较。

这是我的变量

x = tf.placeholder(tf.float32,[None, n_steps, n_inputs])
y = tf.placeholder(tf.float32,[None, n_outputs])
W = {'hidden': tf.Variable(tf.random_normal([n_inputs, n_nodes])),
'output': tf.Variable(tf.random_normal([n_nodes,n_outputs]))}
bias = {'hidden': tf.Variable(tf.random_normal([n_nodes],mean= 1.0)),
'output': tf.Variable(tf.random_normal([n_outputs]))

这是我的模型

def model(x,y,W,bias):
x = tf.transpose(x,[1,0,2])
x = tf.reshape(x,[-1,n_inputs])
x = tf.nn.relu(tf.matmul(x,W['hidden']) + bias['hidden'])
x = tf.split(x,n_steps,0)
cells = []
for _ in xrange(n_layers):
    lstm_cell = rnn.BasicLSTMCell(n_nodes, forget_bias = 1.0, state_is_tuple = True)
    cells.append(lstm_cell)
lstm_cells = rnn.MultiRNNCell(cells,state_is_tuple = True)
outputs,states = rnn.static_rnn(lstm_cells, x, dtype = tf.float32)
output = outputs[-1]
return tf.matmul(output, W['output') + bias['output']

所以我有两个问题:

1] 当我训练这个神经网络时,我使用的是 TitanX GPU,它比我的 CPU 花费的时间更长。我在某处读到这可能是由于 LSTM 单元的性质。这是真的?如果是这样,有什么方法可以让这个网络的训练在我的 GPU 上更快,或者我只是坚持让它变慢。

2]训练完成后,我想运行用真实数据进行实时预测。不幸的是,即使使用 sess.run(prediction,feed_dict) 一次也需要 0.05 秒。如果我想获得不止一个未来预测步骤,假设 10 个未来预测步骤,运行 循环获得 10 个预测将花费 0.5 秒,这对我的应用程序来说是不现实的。评估需要这么长时间是有原因的吗?我已经尝试减少时间步数 (n_steps),以及要预测的未来步数,这似乎减少了预测所需的时间。但我觉得这应该只会影响训练时间,因为在评估时,NN 已经训练了所有内容,应该只是通过 GPU 填充数字。有什么想法吗?

关于问题1: 并非所有神经网络都受益于使用 GPU。 GPU 在有大量可以并行化的乘法运算时非常有用。因此,他们非常擅长 运行 卷积神经网络。然而,当涉及到 RNN 时,CPU 最有可能是你最好的选择。如果你有资源,你可以使用 Google Cloud ML-Engine 和 运行 它在 CPU 的集群上。

关于问题2: TensorFlow 在使用 sess.run() 时有很大的开销。但是,我认为在上一个版本中他们引入了一些将网络转换为可执行文件的功能。不过需要更好的意见。