tensorflow分布式任务最简单的例子





<>分布式TensorFlow简介




分布式TensorFlow集群由多个服务端进程和客户端进程组成. 服务端和客户端的代码可以在不同的机器上也可以在同一个机器上。为了简化代码,我们的代码将启动两个worker并且使用单独的客户端程序


版本要求

必须要求tensorflow版本在0.8或者以上版本





简单的服务端程序

把分布式TensorFlow运行起来却十分困难,主要原因是官方文档没有提供完整的例子,而且提供的代码片段只能在0.9中运行,因此很多人尝试修改那段代码还是跑不起来。

其实分布式TensorFlow使用非常简单, 只要用几行代码就可以实现服务端和客户端,最简单的服务端代码如下worker1.py。


$ python
>>> import tensorflow as tf
>>> worker1 = "192.168.100.42:2222"
>>> worker2 = "192.168.100.42:2223"
>>> worker_hosts = [worker1, worker2]
>>> cluster_spec = tf.train.ClusterSpec({ "worker": worker_hosts})
>>> server = tf.train.Server(cluster_spec, job_name="worker", task_index=0)
>>> server.join()

这里我们定义了两个worker,其中job名都是“worker”,官方文档中还定义了名为“ps”的job,实际上有没有都可以, 而worker可以是本地不同端口的两个进程或者多台服务器上的进程。

为了模拟分布式环境,我们编写worker2.py启动第二个worker,注意代码上稍有区别, 因为index变了不能与前面的冲突


$ python
>>> import tensorflow as tf
>>> worker1 = "192.168.100.42:2222"
>>> worker2 = "192.168.100.42:2223"
>>> worker_hosts = [worker1, worker2]
>>> cluster_spec = tf.train.ClusterSpec({ "worker": worker_hosts})
>>> server = tf.train.Server(cluster_spec, job_name="worker", task_index=1)
>>> server.join()

可以看到worker1和worker2分别监听本地的2222和2223端口,接下来可以单独写客户端应用,连接这两个targe即可。





简单的客户端程序

Client的代码我们写得稍微复杂些,就是构造写线性数据,其中斜率是2、截距是10,如果梯度下降算法正确的话最终w和b的输出应该也接近2和10。

代码如截图:




最终结果相当接近2和10