与分布式tensorflow相关的可伸缩性问题
我正在运行一些实验来测试分布式tensorflow的可伸缩性。我的目标是检查与使用单个gpu相比,在2个节点(总共8GPU)上使用4GPU的加速效果如何 我选择ResNet作为网络结构,并将官方模型zoos(github.com/tensorflow/models/tree/master/ResNet)中的ResNet示例代码修改为可以进行分布式培训的代码。 在实验中,使用ResNet 56层在CIFAR10数据集上进行训练,设置与原论文相同 我想确保的第一件事是,通过使用同步SGD(SyncReplicateSOptimizer),8GPU可以获得与1gpu相似的曲线,即历元到精度的曲线 请核对实验数据 tf-0:单gpu版本 tf-1:分布式版本(2人,8人) x轴:#历元(每个历元表示一次遍历整个训练数据) y轴:CIFAR-10测试数据的准确性 单个gpu(tf-0)的结果与原始文件和许多其他人复制的文件类似(例如,这里有更多示例) 但是,您可以观察到tf-1(8gpus曲线)具有非常不同的模式,这不是我所期望的。我对同步SGD的理解是,优化器累积与分布式tensorflow相关的可伸缩性问题,tensorflow,distributed,Tensorflow,Distributed,我正在运行一些实验来测试分布式tensorflow的可伸缩性。我的目标是检查与使用单个gpu相比,在2个节点(总共8GPU)上使用4GPU的加速效果如何 我选择ResNet作为网络结构,并将官方模型zoos(github.com/tensorflow/models/tree/master/ResNet)中的ResNet示例代码修改为可以进行分布式培训的代码。 在实验中,使用ResNet 56层在CIFAR10数据集上进行训练,设置与原论文相同 我想确保的第一件事是,通过使用同步SGD(SyncR
#workers
梯度,然后应用于变量。因此,如果设置了相同的有效批量大小,则该过程应与单个gpu完全相同
有趣的是,当我在分布式版本中设置#worker=2时,曲线(tf-2)变得接近单个gpu版本。但是4gpus(tf-3)更接近tf-1
tf-2:分布式版本(2人,2人)
tf-3:分布式版本(1人,4人)
以下是一些详细设置(基本上遵循原始文件):
批量大小=128,剩余数量=9,泄漏率=0
学习速率调度器:1-80历元为0.1,81-120历元为0.01,120-160历元为0.001
环境:
Tensorflow版本:0.12.1
CUDA和cuDNN的安装版本:CUDA 7.5、cuDNN 5.1
可以找到单个gpu版本代码
可以找到分布式版本的代码
有人知道为什么当工人增加时情况会逐渐恶化吗?谢谢
更新的数字 根据commit ecdee38a(我认为v0.12.1包括该commit),tensorflow似乎使用了平均值而不是每个工人计算的求和梯度。因此,我在4gpus案例中尝试了学习率为4倍的一个。但结果更糟 1xlr:1x学习率(0.1/0.01/0.001) 4xlr:4x学习率(0.4/0.04/0.004)
请注意,ecdee38a将梯度聚合从相加更改为平均值,因此需要将k个工人的学习率乘以k才能得到相同的结果。您能否先调试玩具示例(即,为标量x最小化x^2)以确保事情按预期进行?谢谢您的回复。是的,早些时候我意识到了这个可能的问题,所以我运行了一个学习率更高的(乘以#worker)。但我得到了更糟糕的结果。请查看我更新的帖子的数字。感谢您的建议,我稍后将尝试一些玩具示例。sync_副本优化器应该相当于使用单机tensorflow进行更大的批量