我对参数服务器和执行的梯度聚合有一些疑问。我的主要资料是《深入学习深度学习》一书[1]。我假设是BSP模型,即我们在每个微型批处理之后进行同步。我不确定这是属于数据科学领域还是AI StackExchange社区,所以我在这里默认设置了...
[1]上的图12.7.1建议采用以下方法: 假设批次大小为32。如果我们有一个GPU和128个训练数据点,则每个时期有4个迷你批次。每次迷你批处理后,我们都会更新模型(即有4次更新)。因此,我们必须计算四个梯度(每个小批量一个)。
对于多GPU情况,假设有两个GPU和128个训练数据点。我们为每个GPU注入一个小批量,让它们计算梯度,求和并用总和更新模型。因此,从BSP的角度来看,涉及两个步骤而不是四个步骤。
我的问题如下:
我对参数服务器工作方式的描述正确吗?特别是,我不确定是否每个GPU是否保持相同的批处理大小32,还是必须将批处理大小除以GPU的数量。
为什么我们对梯度求和而不是对它们求平均值?这让我更加困惑,因为在PyTorch [2]的DistributedDataParallel文档中,有以下语句:
当模型在M个具有批次= N的节点上训练时,与在单个节点上具有批次= M * N训练的相同模型相比,梯度将小M倍(因为不同节点之间的梯度>平均)。与本地培训对象相比,要获得在数学上等效的培训过程时,应该考虑到这一点。
这里有两点令人困惑:
2.1。它指出梯度是平均的,这与D2L书中指出的对梯度求和的结果不符。
2.2。到目前为止,我一直认为,在小批量梯度下降过程中,损失函数(优化目标)会平均小批量数据点的误差。因此,如果M个节点以批处理大小N运行小批量梯度下降,并且取其梯度的平均值,则我们应该收到一个数量级相同的数字,就好像1个节点以批大小为N M,因为单个节点将n m个数据点的误差函数平均为损失函数,而对于M个节点,我们仅取平均值的平均值。
我不确定PyTorch的DistributedDataParallel类是否可以视为参数服务器(特别是因为它们甚至都提供了有关如何在PyTorch [3]中构建参数服务器的指南),但是它映射到了这本书作为参数服务器。
为解决我的困惑提供的任何帮助均深表感谢。非常感谢!
亲切的问候, 马克西米利安
[1] https://d2l.ai/chapter_computational-performance/parameterserver.html
[2] https://pytorch.org/docs/stable/generated/torch.nn.parallel.DistributedDataParallel.html
[3] https://pytorch.org/tutorials/intermediate/rpc_param_server_tutorial.html