实战| 使用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的主要内容,如果未能解决你的问题,请参考以下文章