Optimization Tensorflow中的同步与异步计算

Optimization Tensorflow中的同步与异步计算,optimization,machine-learning,tensorflow,Optimization,Machine Learning,Tensorflow,在Tensorflow CIFAR教程中,它讨论了如何使用多个GPU,并给出了以下警告: 单纯地采用异步更新模型参数会导致次优的训练性能,因为单个模型副本可能在模型参数的过时副本上进行训练。相反,采用完全同步更新的速度将与最慢的模型副本一样慢 这是什么意思?有人能提供一个非常简单的例子来说明这个警告吗?假设您有n个工人 异步意味着每个工作程序只读取参数、计算更新和写入更新的参数,而没有任何锁定机制。工人们可以自由地改写彼此的工作。 假设worker 1由于某种原因速度较慢。Worker 1在时间

在Tensorflow CIFAR教程中,它讨论了如何使用多个GPU,并给出了以下警告:

单纯地采用异步更新模型参数会导致次优的训练性能,因为单个模型副本可能在模型参数的过时副本上进行训练。相反,采用完全同步更新的速度将与最慢的模型副本一样慢


这是什么意思?有人能提供一个非常简单的例子来说明这个警告吗?

假设您有n个工人

异步意味着每个工作程序只读取参数、计算更新和写入更新的参数,而没有任何锁定机制。工人们可以自由地改写彼此的工作。 假设worker 1由于某种原因速度较慢。Worker 1在时间t读取参数,然后在时间t+100尝试写入更新的参数。与此同时,worker 2-n在时间步长t+1、t+2等处都进行了大量更新。当较慢的worker 1最终写入时,它将覆盖其他worker所取得的所有进度


完全同步意味着所有工作人员都是协调的。每个工人读取参数,计算梯度,然后等待其他工人完成。然后,学习算法计算他们计算的所有梯度的平均值,并基于该平均值进行更新。如果worker 1非常慢,需要100个时间步才能完成,但是worker 2-n都在时间步2上完成,那么大多数worker将花费大部分时间坐着无所事事等待worker 1。

如何确保同步更新参数?如果我在某个设备上执行平均值,那么设备上下文是否足以确保函数等待提供所有因变量,或者是否有可能使用旧参数?如果在运行调用中提供依赖项,则保证在计算中使用该值。如果依赖项是一个未在运行调用中提供的变量,那么在计算时,它将只获取该变量中的任何值,这可能是不确定的。您可以添加控件依赖项以确保变量访问先等待其他计算完成。那么异步的好处是什么呢?在异步培训的情况下,如果某些工作人员的输出会被覆盖,为什么我们要费心运行这些工作程序?@Fake我们运行所有工作程序,因为我们无法提前知道哪些更新将被覆盖。