2015-12-18 56 views
2

在Tensorflow CIFAR教程它谈论使用多GPU和异步计算给出了这样的警告:同步VS在Tensorflow

“天真采用的模型参数异步更新导致次优的训练表现,因为个别型号副本可能在模型参数的陈旧副本上进行训练,相反,采用完全同步更新将会像最慢的模型副本一样慢。“

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

回答

6

假设你有n名工人。

异步意味着每个工作者只是读取参数,计算更新并写入更新的参数,根本没有任何锁定机制。工人可以自由地覆盖彼此的工作。 假设工人1出于某种原因速度较慢。工人1在时间t读取参数,然后尝试在时间t + 100写入更新的参数。与此同时,工人2-n在步骤t + 1,t + 2等所有时间都进行了大量更新。当慢速工人1最终完成写作时,它会覆盖其他工人所取得的所有进展。

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

+0

怎样才能我确保同步更新参数?如果我在某个设备上执行平均值,设备上下文是否足以确保函数等待提供所有因变量,还是有可能使用旧参数? – jstaker7

+0

如果在运行调用中提供依赖关系,则该值将保证用于计算。如果依赖项是Run调用中未提供的变量,那么在计算发生时,它只取该变量中的任何值,这可能是非确定性的。您可以添加控件依赖关系,以确保您的变量访问等待其他计算首先完成。 –

+0

那么异步意味着什么呢? –