理解和实现分布式TensorFlow集群完整教程
分布式TensorFlow简介
前一篇《分布式TensorFlow集群local server使用详解》我们介绍了分布式TensorFlow的基本概念,现在我们可以动手搭建一个真正的分布式TensorFlow集群。
分布式TensorFlow集群由多个服务端进程和客户端进程组成,在某些场景下,服务端和客户端可以写到同一个Python文件并起在同一个进程,但为了简化代码让大家更好理解分布式架构,我们将启动两个worker并使用单独的客户端进程。

确认TensorFlow版本
首先我们需要安装和确认TensorFlow的版本,注意0.8版本以前的TensorFlow不支持分布式,使用以前版本需要重新合Patch和打包。
python -c "import tensorflow; print(tensorflow.__version__)"

使用TensorFlow容器
如果本地已安装Docker,通过容器使用TensorFlow环境更加简单,只需一行命令。
sudo docker run -it tensorflow/tensorflow bash
Docker除了实现资源隔离,还可以管理不同版本的环境,例如可以很容易试用最新的RC版本。
sudo docker run -it tensorflow/tensorflow:r0.9rc0 bash

实现TensorFlow服务端
很多开发者读过TensorFlow官方的Distributed Guide,想把分布式TensorFlow运行起来却十分困难,主要原因是官方文档没有提供完整的例子,而且提供的代码片段只能在0.9中运行,因此很多人尝试修改那段代码还是跑不起来。
其实分布式TensorFlow使用非常简单,我们并不需要一个通用的程序,只要用几行代码分别实现服务端和客户端即可,最简单的服务端代码如下worker1.py。
import tensorflow as tf
worker1 = "10.235.114.12:2222"
worker2 = "10.235.114.12: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变了不能与前面的冲突,为了避免端口被容器隔离我们可以使用原来的Docker容器。
import tensorflow as tf
worker1 = "10.235.114.12:2222"
worker2 = "10.235.114.12: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即可。
实现TensorFlow客户端
Client的代码我们写得稍微复杂些,就是构造写线性数据,其中斜率是2、截距是10,如果梯度下降算法正确的话最终w和b的输出应该也接近2和10。


如我们所料,最终结果相当接近2和10,同时指定了第一个worker的CPU来执行梯度下降的算法,通过cluster spec我们还可以定义更灵活的集群,客户端也可以通过"tf.device"来动态指定CPU和GPU计算资源。在生产环境下,官方推荐使用ps服务器存储Variables,而ps其实是和我们定义的worker一样,只是job名不同,架构可以参见官方文档的tasks图。

最后总结
希望通过这个完整的使用教程,大家都能亲自实现分布式TensorFlow集群,并且编写灵活的服务端和客户端应用。
而在搭建过程中,大家可能发现TensorFlow只是一个深度学习的Library,我们需要实现和部署服务端、客户端应用,而在集群定义中存在一个较严重的问题,就是cluster spec需要在进程启动时指定,无法实现动态的扩容或缩容,这个问题社区希望通过引入Kubernetes集群管理工具来解决。还有一个问题就是我们的服务端应用启动时只能bind localhost,我们也在Github建了对应Issue,如果大家都这些问题感兴趣,也请继续关注我和我们后续的文章。
理解和实现分布式TensorFlow集群完整教程的更多相关文章
- 分布式TensorFlow集群local server使用详解
通过local server理解分布式TensorFlow集群的应用与实现. 简介 TensorFlow从0.8版本开始,支持分布式集群,并且自带了local server方便测试. Local ...
- poptest老李谈分布式与集群 2
集群分类 Linux集群主要分成三大类( 高可用集群, 负载均衡集群,科学计算集群) 高可用集群( High Availability Cluster)负载均衡集群(Load Balance Clus ...
- poptest老李谈分布式与集群
poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:908821478,咨询电话010-845052 ...
- 京东分布式MySQL集群方案介绍
背景 数据库作为一个非常基础的系统,任何一家互联网公司都会使用,数据库产品也很多,有Oracle.SQL Server .MySQL.PostgeSQL.MariaDB等,像SQLServer/Ora ...
- 分布式MySQL集群方案的探索与思考
转载:http://www.infoq.com/cn/articles/exploration-of-distributed-mysql-cluster-scheme?utm_campaign=rig ...
- EHCache分布式缓存集群环境配置
EHCache分布式缓存集群环境配置 ehcache提供三种网络连接策略来实现集群,rmi,jgroup还有jms.同时ehcache可以可以实现多播的方式实现集群,也可以手动指定集群主机序列实现集群 ...
- java 分布式与集群的区别和联系(转)
本文主要介绍了java分布式与集群的区别和联系,具有很好的参考价值,下面跟着小编一起来看下吧 一.先说区别: 一句话:分布式是并联工作的,集群是串联工作的. 1.分布式是指将不同的业务分布在不同的地方 ...
- Dubbo 入门-细说分布式与集群
什么是Dubbo Dubbo是一款高性能.轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现. 什么是RPC RPC全称(Rem ...
- 分布式 PostgreSQL 集群(Citus)官方示例 - 时间序列数据
在时间序列工作负载中,应用程序(例如一些实时应用程序查询最近的信息,同时归档旧信息. https://docs.citusdata.com/en/v10.2/sharding/data_modelin ...
随机推荐
- Laravel 5.2 使用 JWT 完成多用户认证 | Laravel China 社区 - 高品质的 Laravel 开发者社区 - Powered by PHPHub
Json Web Token# JWT代表Json Web Token.JWT能有效地进行身份验证并连接前后端. 降地耦合性,取代session,进一步实现前后端分离 减少服务器的压力 可以很简单的实 ...
- 如何把pdf文档转化为word
在工作中常常遇到大量的pdf文档,再加工进行处理文件,特别的不方便,需要转换为WORD. 尝试如下: 使用wps自带的工具转换,提示需要是会员才能进行.否则只能进行5页以下的转换. 再想是不是又有个这 ...
- 推荐一个 Laravel admin 后台管理插件
如何优雅的写代码,我想是每位程序员的心声.自从15年初第一次接触 Laravel 4.2 开始,我就迷上使用 Laravel 框架了.我一直都想找个时间好好写写有关 Laravel 的使用文章,由浅入 ...
- SpringMVC截图版
Lib目录 java目录 HelloController文件代码 AnotationController文件代码 DataController文件代码 ValueController文件代码 File ...
- JavaScript:利用递归实现对象深拷贝
先来普及一下深拷贝和浅拷贝的区别浅拷贝:就是简单的复制,用等号即可完成 let a = {a: 1} let b = a 这就完成了一个浅拷贝但是当修改对象b的时候,我们发现对象a的值也被改变了 b. ...
- 使用cnpm真的会有诡异的Bug
前端网页居然会出现堆栈溢出,然后网页崩溃,退出的问题. 出现这个Bug的时候,我非常的怀疑我自己的一些操作能力,比如,git的操作. 毕竟我是本地代码然后拉取远程分支,还会暂存自己的代码,然后暂存区代 ...
- 【风马一族_php】NO5_php基础知识_数组
原文来自:http://www.cnblogs.com/sows/p/6032570.html (博客园的)风马一族 侵犯版本,后果自负 回顾 匿名函数 定义: 变量 = function [参数列表 ...
- jq处理JSON数据, jq Manual (development version)
jq 允许你直接在命令行下对 JSON 进行操作,包括分片.过滤.转换等等.让我们通过几个例子来说明 jq 的功能:一.输出格式化,漂亮的打印效果如果我们用文本编辑器打开 JSON,有时候可能看起来会 ...
- 自学FPAG笔记之 " top_down “
top_town设计:在FPGA中top_down(自顶向上)是十分重要的一种编程方法,优点:使用top_down方法去写代码会使得程序看起来十分简洁,缺点:top_down写的文件会特别多. 例子: ...
- JVM学习篇章(二)
上节我们已经介绍了jvm和监控的一下方法,下面举例说明一下: 瓶颈问题定位: 内存泄漏原因定位: 1.常见的内存泄漏 2.定位的方法