首页 文章

异步培训如何在分布式Tensorflow中工作?

提问于
浏览
19

我读过Distributed Tensorflow Doc,它提到在异步训练中,

图表的每个副本都有一个独立的训练循环,无需协调即可执行 .

据我所知,如果我们将参数服务器与数据并行架构结合使用,则意味着每个工作人员都会计算渐变并更新自己的权重,而无需关心分布式训练神经网络的其他工作人员更新 . 由于所有权重都在参数服务器(ps)上共享,我认为ps仍然必须以某种方式协调(或聚合)来自所有工作者的权重更新 . 我想知道聚合在异步训练中是如何工作的 . 或者更一般地说,异步培训在分布式Tensorflow中如何工作?

3 回答

  • 20

    在Distributed TensorFlow中异步训练时,特定工作人员执行以下操作:

    • worker reads 并行PS任务中的所有共享模型参数,并将它们复制到worker任务 . 这些读取与任何并发写入不协调,并且不获取锁定:特别是工作者可能会看到来自一个或多个其他工作者的部分更新(例如,可能已应用来自另一个工作者的更新的子集,或者元素的子集在变量中可能已经更新) .

    • worker computes 在本地渐变,基于一批输入数据及其在步骤1中读取的参数值 .

    • Worker sends 每个变量到适当的PS任务的渐变,并使用由优化算法确定的更新规则(例如SGD,具有Momentum,Adagrad,Adam等的SGD)将梯度移动到它们各自的变量 . 更新规则通常使用(近似)可交换操作,因此它们可以独立地应用于来自每个工作者的更新,并且每个变量的状态将是所接收的更新序列的运行聚合 .

    在异步训练中,同时应用来自worker的每个更新,并且如果在初始化相应的优化器(例如tf.train.GradientDescentOptimizer)时设置了可选的 use_locking=True 标志,则可以稍微协调更新 . 但请注意,此处的锁定仅为两个并发更新提供互斥,并且(如上所述)读取不获取锁定;锁定不会在整个更新集中提供原子性 .

    (相比之下,在同步训练中,像 tf.train.SyncReplicasOptimizer 这样的实用程序将确保所有工作人员为每个模型参数读取相同的最新值;并且同步步骤的所有更新在应用之前进行聚合为了做到这一点,工作人员通过屏障进行同步,屏障在发送梯度更新后进入,并在聚合更新应用于所有变量后离开 . )

  • 1

    在异步训练中, Worker 之间没有权重同步 . 权重存储在参数服务器上 . 每个工作人员彼此独立地加载和更改共享权重 . 这样,如果一个 Worker 比其他 Worker 更快地完成迭代,则继续下一次迭代而不等待 . 工作者只与共享参数服务器交互,不互相交互 .

    总的来说,它可以(取决于任务)显着加快计算速度 . 但是,结果有时比使用较慢的同步更新获得的结果更差 .

  • 2

    查看链接到的文档中的示例:

    with tf.device("/job:ps/task:0"):
      weights_1 = tf.Variable(...)
      biases_1 = tf.Variable(...)
    
    with tf.device("/job:ps/task:1"):
      weights_2 = tf.Variable(...)
      biases_2 = tf.Variable(...)
    
    with tf.device("/job:worker/task:7"):
      input, labels = ...
      layer_1 = tf.nn.relu(tf.matmul(input, weights_1) + biases_1)
      logits = tf.nn.relu(tf.matmul(layer_1, weights_2) + biases_2)
      # ...
      train_op = ...
    
    with tf.Session("grpc://worker7.example.com:2222") as sess:
      for _ in range(10000):
        sess.run(train_op)
    

    您可以看到培训分布在三台机器上,这三台机器共享相同重量的副本,但正如下面的示例所示:

    在上面的示例中,变量是在ps作业中的两个任务上创建的,模型的计算密集型部分是在worker作业中创建的 . TensorFlow将在作业之间插入适当的数据传输(从ps到worker用于正向传递,从worker到ps用于应用渐变) .

    换句话说,一个gpu用于计算正向传递,然后将结果传输到另外两台机器,而其他每台机器计算一部分权重的反向传播,然后将结果发送到其他机器,他们都可以适当地更新他们的重量 .

    GPU用于加速矩阵乘法和并行数学运算,这对于两个正向通道都是非常密集的和反向传播 . 所以分布式训练只是意味着你在许多GPU上分配这些操作,模型仍然在机器之间同步,但现在可以并行计算不同权重的反向传播,并且可以计算不同小批量的前向传递 . 与前一个小批量的backprop同时仍在计算中 . 分布式培训并不意味着您在每台机器上都拥有完全独立的模型和权重 .

相关问题