Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python TensorFlow并行平均小批量梯度_Python_Tensorflow_Parallel Processing_Tensorflow Serving - Fatal编程技术网

Python TensorFlow并行平均小批量梯度

Python TensorFlow并行平均小批量梯度,python,tensorflow,parallel-processing,tensorflow-serving,Python,Tensorflow,Parallel Processing,Tensorflow Serving,我想用批量梯度下降法训练神经网络,但我想并行化这个过程。我想将批次划分为小批次,将梯度计算分布到各个流程中,然后将它们带回主流程,对它们进行平均,并将它们应用到培训中 作为一个简单的示例,以该脚本为例,该脚本在抛物线y=x^2的N个数据点上训练神经网络: import tensorflow as tf import numpy as np def add_layer(inputs, in_size, out_size, activation_function=None): Weight

我想用批量梯度下降法训练神经网络,但我想并行化这个过程。我想将批次划分为小批次,将梯度计算分布到各个流程中,然后将它们带回主流程,对它们进行平均,并将它们应用到培训中

作为一个简单的示例,以该脚本为例,该脚本在抛物线y=x^2的N个数据点上训练神经网络:

import tensorflow as tf
import numpy as np

def add_layer(inputs, in_size, out_size, activation_function=None):
    Weights = tf.Variable(tf.random_normal([in_size, out_size]))
    biases = tf.Variable(tf.random_normal([1, out_size]))
    Wx_plus_b = tf.matmul(inputs, Weights) + biases
    if activation_function is None:
        outputs = Wx_plus_b
    else:
        outputs = activation_function(Wx_plus_b)
    return outputs

# Make up some real data
N = 50
x_data = np.linspace(-2, 2, N)[:, np.newaxis]
noise = np.random.normal(0, 0.05, x_data.shape)
y_data = np.square(x_data) # - 0.5 + noise

# Define placeholder for x_data and y_data
xs = tf.placeholder(tf.float32, [None, 1])
ys = tf.placeholder(tf.float32, [None, 1])

""" Build the network"""
# Add hidden layer
l1 = add_layer(xs, 1, 5, activation_function=tf.tanh)
# Add output layer
prediction = add_layer(l1, 5, 1, activation_function=None)

# Define loss
loss = tf.reduce_mean(tf.reduce_sum(tf.square(ys-prediction), reduction_indices=[1]))

# Define optimizer
opt = tf.train.GradientDescentOptimizer(learning_rate=1e-2)
# Compute the gradients for a list of variables.
grads_and_vars = opt.compute_gradients(loss)
# Ask the optimizer to apply the gradients
train_opt = opt.apply_gradients(grads_and_vars)

# Initialize global variables
sess = tf.Session()
init = tf.global_variables_initializer()
sess.run(init)

for i in range(2000):
    # training
    sess.run(train_opt, feed_dict={xs: x_data, ys: y_data})
    if i % 50 == 0:
        prediction_value = sess.run(prediction, feed_dict={xs: x_data})
        print(sess.run(loss, feed_dict={xs: x_data, ys: y_data}))
我想并行化的部分是梯度的计算,然后我想把这些梯度带回到主过程中进行平均,然后应用到训练步骤中。我想将
x_data
中的N个数据点拆分为P个进程

我认为这就是所谓的“同步培训”,我在参考资料中看到过,但没有人解释过


如何以同步的方式并行化这个简单的示例?

您可能不会在同步培训中找到太多内容,因为它大多被放弃,转而支持异步培训

在同步梯度下降中,所有小批量都必须完成,同时应用它们各自的梯度来更新网络参数。在异步情况下,每次一个小批量的梯度可用时,都会更新网络参数。这些更新或多或少是随机进行的。这个方法似乎是无效的:例如,假设网络参数已经迭代了1342次,然后开始计算一些小批量的梯度。到计算完成时,网络参数可能已更新1349次,因为7个较旧的小批次报告了它们的梯度。因此,您将对不是在计算开始时指定的网络参数应用梯度校正

从我上面写的内容来看,异步下降似乎是错误的,但您必须理解,随机梯度下降是一个草率/不精确的过程,添加异步更新的额外草率并不是有害的。另一方面,在执行同步更新时,一些GPU经常处于空闲状态,因为它们必须等待所有其他GPU完成

我很快就在网上找到了一个合适的参考资料,但没有找到。我记得使用异步更新的诀窍被不同的小组多次发现。Jeff Dean有一篇老文章,但他们不分析同步与异步

tensorflow官方文档中有一个例子,但可能有更好的教程


我上面链接的网页也指向这一点。

为什么要这样做?并不是说这是个坏主意,我只是好奇在我的实际应用程序中,我有大约30000个例子要适合,使用一个在节点中有许多层的深层神经网络。我想,如果我能将小批量训练并行化,我就能让它令人尴尬地并行化。例如,在30个进程上运行,我可以达到1000个例子的拟合速度。这比仅仅让tensorflow处理并行化有什么好处?好处是它变得令人尴尬地并行,tensorflow不仅仅“处理并行化”。我想在大型计算机集群上跨CPU分发培训数据。我发现了一种使用TensorFlow扩展的方法:Horovod的主要优点是它使用MPI进行并行化。根据我的经验,与gRPC(默认情况下TensorFlow使用gRPC)相比,这在大型计算机集群上更容易实现。有一个使用MPI的TensorFlow扩展,使同步培训更易于处理:。我已经试过了,而且效果很好,虽然我的笔记本电脑的性能更差-需要使用更多的CPU内核。@Drew您应该将性能与async进行比较,但horovod和MPI似乎不适合于此。如果您在GPU上运行耗时数天的繁重计算,您可能需要寻找其他运行异步的方法。它最终可以为你节省一些时间。