理解和实现分布式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 ...
- 深入理解:分布式和集群
有同学问我分布式和集群到底是什么?都是多台服务器那不就是分布式吗?为啥还有集群呢?集群也是多台服务器为啥不叫分布式呢? 对于这些问题的混乱其实是没把分布式和集群理解到位. 首先,我们把架构分为单机和多 ...
- PHP面试分布式和集群的理解,集群与分布式,你们知道有什么区别吗?
用一个例子介绍集群与分布式: 小餐馆原来只有一个厨师,切菜洗菜备料炒菜他都全干.后来餐馆的客人多了,厨房里一个厨师忙不过来,又请了个厨师,两个厨师都能炒一样的菜,这两个厨师的关 系是集群.为了让厨师专 ...
- 对分布式和集群的理解
1.分布式可繁也可以简,最简单的分布式就是大家最常用的,在负载均衡服务器后加一堆web服务器,然后在上面搞一个缓存服务器来保存临时状态,后面共享一个数据库. 2.布式是相对中心化而来,强调的是任务在多 ...
- 保障IDC安全:分布式HIDS集群架构设计
背景 近年来,互联网上安全事件频发,企业信息安全越来越受到重视,而IDC服务器安全又是纵深防御体系中的重要一环.保障IDC安全,常用的是基于主机型入侵检测系统Host-based Intrusion ...
- 分布式 和 集群的区别
简单说,分布式是以缩短单个任务的执行时间来提升效率的,而集群则是通过提高单位时间内执行的任务数来提升效率. 例如: 如果一个任务由10个子任务组成,每个子任务单独执行需1小时,则在一台服务器上执行改任 ...
- 什么是分布式,分布式和集群的区别又是什么?
1. 什么是分布式 ? 分布式系统一定是由多个节点组成的系统. 其中,节点指的是计算机服务器,而且这些节点一般不是孤立的,而是互通的. 这些连通的节点上部署了我们的节点,并且相互的操作会有协同. 分布 ...
- 分布式与集群的区别 .
简单说,分布式是以缩短单个任务的执行时间来提升效率的,而集群则是通过提高单位时间内执行的任务数来提升效率. 例如: 如果一个任务由10个子任务组成,每个子任务单独执行需1小时,则在一台服务器上执行改任 ...
- 分布式与集群的区别是什么?
分布式与集群的区别是什么? 关注者 1,561 被浏览 449,153 关注问题写回答 邀请回答 1 条评论 分享 举报 53 个回答 默认排序 大闲人柴毛毛 渴求Java开发!内推蚂蚁 ...
最新文章
- c++中的对象引用(object reference)与对象指针的区别
- Android NDK JNI C++ 13 pthread多线程
- windows 10 常用快捷键
- VC中GetLastError()获取错误信息的使用,以及错误代码的含义
- linux QT 结束当前进程_软件特攻队|为什么 Qt 成为 c++ 界面编程的第一选择?
- CA计划6.14亿美元收购安全测试公司Veracode
- java时间的整的表达式_Quartz中时间表达式的设置-----corn表达式
- python游戏开发框架_2018年Python主流框架有哪些?最流行的Python框架
- java培训韩顺平_java韩顺平视频教程
- 《Go程序设计语言》- 第10章:包和go工具
- 环保线绕电阻器的主要特性和应用分析
- C++银行管理系统设计分析及程序设计介绍
- 训练集、验证集、测试集以及交验验证的理解
- 桌面计算机图标变成文件夹,电脑桌面图标全部变成白色文件了怎么办
- 逻辑机房(LDC)是什么
- PHP+TP框架实现微信公众号开发之发送模板消息
- LeetCode/LintCode 题解丨一周爆刷字符串:简化路径
- java毕业设计——基于JSP+mysql的BBS论坛系统设计与实现(毕业论文+程序源码)——论坛系统
- 涨知识!细数银行卡三要素 API 的 N 种验证方法
- BMS(电池管理系统)第四课 ——核心!!!SOC算法开发