实战| 使用Docker实现分布式TensorFlow

Posted AI星课堂

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实战| 使用Docker实现分布式TensorFlow相关的知识,希望对你有一定的参考价值。




基本概念


Cluster、Job、task概念:三者可以简单的看成是层次关系,task可以看成每台机器上的一个进程,多个task组成job;job又有:ps、worker两种,分别用于参数服务、计算服务,组成cluster

同步SGD:各个用于并行计算的电脑,计算完各自的batch 后,求取梯度值,把梯度值统一送到ps服务机器中,由ps服务机器求取梯度平均值,更新ps服务器上的参数。

异步SGD:ps服务器收到只要收到一台机器的梯度值,就直接进行参数更新,无需等待其它机器。这种迭代方法比较不稳定,收敛曲线震动比较厉害,因为当A机器计算完更新了ps中的参数,可能B机器还是在用上一次迭代的旧版参数值。




实现流程


1、在服务器上面启动一个容器

$  docker run -d -v /root/mycode:/tensorflow/mnist --name tensorflow tensorflow/tensorflow



3、打开三个终端,每个终端都依次执行下面两个命令

$ docker exec -it tensorflow /bin/bash

$ cd /tensorflow/mnist


4、分别在三个终端的容器执行下述三条命令的其中一条

$ python tf_mnist.py --job_name="ps" --task_index=0

$ python tf_mnist.py --job_name="worker" --task_index=0

$ python tf_mnist.py --job_name="worker" --task_index=1




代码下载与解析



tf_mnist.py代码的下载位置:

https://github.com/Gavin343/DistributedTensorFlow/blob/master/tf_mnist.py


分布式TensorFlow的实现一般大致分为5个步骤:

第一步:创建集群信息,每台服务器都有权利和义务应该知道集群中各个节点的信息

parameter_servers = ["localhost:2225"]

workers = [ "localhost:2226",  "localhost:2227"]

cluster = tf.train.ClusterSpec({"ps":parameter_servers, "worker":workers})


第二步:在知道集群的信息后,需要读取本节点所扮演的角色(ps or worker)以及相应的任务编号(task_index),根据这些信息创建server对象。(注释:TF没有专用的parameter server,都是使用server对象来实现通信的)。代码如下:

tf.app.flags.DEFINE_string("job_name", "", "Either 'ps' or 'worker'")

tf.app.flags.DEFINE_integer("task_index", 0, "Index of task within the job")

FLAGS = tf.app.flags.FLAGS

server = tf.train.Server(cluster, job_name=FLAGS.job_name, task_index=FLAGS.task_index)


第三步:如果是ps节点,建立server对象之间的通信。代码如下:

  server.join()


第四步:如果是worker节点,指定device,构建计算图。

with tf.name_scope("softmax"):

            # y is our prediction

            z2 = tf.add(tf.matmul(x,W1),b1)

            a2 = tf.nn.sigmoid(z2)

            z3 = tf.add(tf.matmul(a2,W2),b2)

            y  = tf.nn.softmax(z3)


第五步:对于worker节点,使用supervisor的会话执行计算图。

  sv = tf.train.Supervisor(is_chief=(FLAGS.task_index == 0),       global_step=global_step, init_op=init_op)


参考文献

【1】http://blog.csdn.net/guotong1988/article/details/53780424

【2】http://blog.csdn.net/hjimce/article/details/61197190

以上是关于实战| 使用Docker实现分布式TensorFlow的主要内容,如果未能解决你的问题,请参考以下文章

Marathon+Mesos+Docker实战

猿创征文 | 国产数据库实战使用docker部署PolarDB-X云原生分布式开源数据库

Docker实战之Redis-Cluster集群

Docker实战之Redis-Cluster集群

Docker实战之Redis-Cluster集群

Docker系列之CentOS7安装Docker