在Tensorflow的CIFAR教程中,提到了使用多GPU,并给出了以下警告:
“简单地使用模型参数的异步更新会导致训练性能不佳,因为单个模型副本可能会在一个陈旧的模型参数副本上进行训练。相反,完全同步更新的速度将与最慢的模型副本一样慢。”
这意味着什么?能否提供一个非常简单的例子来说明这个警告?
回答:
假设你有n个工作者。
异步意味着每个工作者只是读取参数,计算更新,然后写入更新后的参数,完全没有锁定机制。工作者可以自由地覆盖彼此的工作。假设工作者1由于某些原因速度较慢。工作者1在时间t读取参数,然后尝试在时间t+100写入更新后的参数。与此同时,工作者2到n在时间步t+1、t+2等已经完成了很多更新。当慢速的工人1最终进行写入时,它会覆盖其他工作者所做的所有进展。
完全同步意味着所有工作者都是协调的。每个工作者读取参数,计算梯度,然后等待其他工作者完成。然后,学习算法计算他们计算的所有梯度的平均值,并基于这个平均值进行更新。如果工作者1非常慢,需要100个时间步才能完成,但工作者2到n都在第2个时间步完成,那么大多数工作者将大部分时间都花在等待工作者1上,什么也不做。