与分布式张量流相关的可伸缩性问题

时间:2017-02-02 16:07:36

标签: tensorflow distributed

我正在运行一些实验来测试分布式张量流的可扩展性。我的目标是检查与使用单个gpu相比,在2个节点(总共8gpus)上使用4gpus的速度是多少。

我选择ResNet作为网络结构,并从官方模型zoos(github.com/tensorflow/models/tree/master/resnet)修改ResNet示例代码,以便进行分布式培训。 在实验中,ResNet 56层用于CIFAR10数据集的培训,设置遵循原始论文。

我首先想要确保的是使用Synchronous SGD(SyncReplicasOptimizer),8 gpus可以获得与 epoch-to-accuracy 数字相同的1gpu曲线。我在两个实验中使用了相同的有效批量大小(即batch size = 1gpu's batch size/the-number-of-worker)。

请查看实验数据

enter image description here

  

tf-0:单个gpu版本

     

tf-1:分布式版本(2ps,8个工作者)

     

x轴:#epoch(每个意味着一次完成整个训练数据)

     

y轴:CIFAR-10 测试数据的准确性

单个gpu( tf-0 )结果类似于原始论文和许多其他人复制的结果(例如http://torch.ch/blog/2016/02/04/resnets.htmlhttps://github.com/ppwwyyxx/tensorpack/tree/master/examples/ResNet或更多这里的示例https://github.com/KaimingHe/deep-residual-networks#third-party-re-implementations)。

然而,您可以观察到 tf-1 (8gpus曲线)具有非常不同的模式,这不是我所期望的。我对Synchronous SGD的理解是优化器累积#workers渐变然后应用于变量。因此,如果设置了相同的有效批量大小,则该过程应与单个gpu完全相同。

有趣的是,当我在分布式版本中设置#worker = 2时,曲线( tf-2 )变得接近单个gpu版本。但是4gpus( tf-3 )接近 tf-1

enter image description here

  

tf-2:分布式版本(2ps,2工作人员)

     

tf-3:分布式版本(1ps,4个工作者)

以下是一些细节设置(基本上遵循原始论文):

  

批量大小= 128,num_residual_units = 9,relu_leakiness = 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版本代码here

可以找到分布式版本的代码here

当#workers增加时,有没有人知道为什么它会逐渐变得更糟?感谢。

更新图

根据提交ecdee38a(我认为v0.12.1包含此提交),tensorflow似乎使用平均而不是总结每个工作人员计算的渐变。所以我在4gpus案例中尝试了4x学习率的那个。但结果却更糟。

experiments of modified learning rate

  

1xlr:1x学习率(0.1 / 0.01 / 0.001)

     

4xlr:4x学习率(0.4 / 0.04 / 0.004)

0 个答案:

没有答案