手把手教你搭建分布式集群,进入生产环境的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集群完整教程相关推荐

  1. 分布式TensorFlow集群local server使用详解

    通过local server理解分布式TensorFlow集群的应用与实现. ​​简介 TensorFlow从0.8版本开始,支持分布式集群,并且自带了local server方便测试. Local ...

  2. 深入理解:分布式和集群

    有同学问我分布式和集群到底是什么?都是多台服务器那不就是分布式吗?为啥还有集群呢?集群也是多台服务器为啥不叫分布式呢? 对于这些问题的混乱其实是没把分布式和集群理解到位. 首先,我们把架构分为单机和多 ...

  3. PHP面试分布式和集群的理解,集群与分布式,你们知道有什么区别吗?

    用一个例子介绍集群与分布式: 小餐馆原来只有一个厨师,切菜洗菜备料炒菜他都全干.后来餐馆的客人多了,厨房里一个厨师忙不过来,又请了个厨师,两个厨师都能炒一样的菜,这两个厨师的关 系是集群.为了让厨师专 ...

  4. 对分布式和集群的理解

    1.分布式可繁也可以简,最简单的分布式就是大家最常用的,在负载均衡服务器后加一堆web服务器,然后在上面搞一个缓存服务器来保存临时状态,后面共享一个数据库. 2.布式是相对中心化而来,强调的是任务在多 ...

  5. 保障IDC安全:分布式HIDS集群架构设计

    背景 近年来,互联网上安全事件频发,企业信息安全越来越受到重视,而IDC服务器安全又是纵深防御体系中的重要一环.保障IDC安全,常用的是基于主机型入侵检测系统Host-based Intrusion ...

  6. 分布式 和 集群的区别

    简单说,分布式是以缩短单个任务的执行时间来提升效率的,而集群则是通过提高单位时间内执行的任务数来提升效率. 例如: 如果一个任务由10个子任务组成,每个子任务单独执行需1小时,则在一台服务器上执行改任 ...

  7. 什么是分布式,分布式和集群的区别又是什么?

    1. 什么是分布式 ? 分布式系统一定是由多个节点组成的系统. 其中,节点指的是计算机服务器,而且这些节点一般不是孤立的,而是互通的. 这些连通的节点上部署了我们的节点,并且相互的操作会有协同. 分布 ...

  8. 分布式与集群的区别 .

    简单说,分布式是以缩短单个任务的执行时间来提升效率的,而集群则是通过提高单位时间内执行的任务数来提升效率. 例如: 如果一个任务由10个子任务组成,每个子任务单独执行需1小时,则在一台服务器上执行改任 ...

  9. 分布式与集群的区别是什么?

    分布式与集群的区别是什么? 关注者 1,561 被浏览 449,153 关注问题写回答 ​邀请回答 ​1 条评论 ​分享 ​举报 ​ 53 个回答 默认排序​ 大闲人柴毛毛 渴求Java开发!内推蚂蚁 ...

最新文章

  1. c++中的对象引用(object reference)与对象指针的区别
  2. Android NDK JNI C++ 13 pthread多线程
  3. windows 10 常用快捷键
  4. VC中GetLastError()获取错误信息的使用,以及错误代码的含义
  5. linux QT 结束当前进程_软件特攻队|为什么 Qt 成为 c++ 界面编程的第一选择?
  6. CA计划6.14亿美元收购安全测试公司Veracode
  7. java时间的整的表达式_Quartz中时间表达式的设置-----corn表达式
  8. python游戏开发框架_2018年Python主流框架有哪些?最流行的Python框架
  9. java培训韩顺平_java韩顺平视频教程
  10. 《Go程序设计语言》- 第10章:包和go工具
  11. 环保线绕电阻器的主要特性和应用分析
  12. C++银行管理系统设计分析及程序设计介绍
  13. 训练集、验证集、测试集以及交验验证的理解
  14. 桌面计算机图标变成文件夹,电脑桌面图标全部变成白色文件了怎么办
  15. 逻辑机房(LDC)是什么
  16. PHP+TP框架实现微信公众号开发之发送模板消息
  17. LeetCode/LintCode 题解丨一周爆刷字符串:简化路径
  18. java毕业设计——基于JSP+mysql的BBS论坛系统设计与实现(毕业论文+程序源码)——论坛系统
  19. 涨知识!细数银行卡三要素 API 的 N 种验证方法
  20. BMS(电池管理系统)第四课 ——核心!!!SOC算法开发

热门文章

  1. Linux shell 学习笔记(9)— 循环语句(for、while)以及更改字段分隔符
  2. 【微服务架构】SpringCloud之断路器(hystrix)
  3. react非常适合入门者学习使用的后台管理框架
  4. 汇编语言关于8086CPU多种寻址方式总结
  5. LeetCode简单题之比赛中的配对次数
  6. 智能驾驶开发的几个问题
  7. python 字符串格式化是打印不同类型更简单一些
  8. Handler 实现的一个延时操作
  9. Java 修饰符的总结
  10. ubuntu之路——day8.1 深度学习优化算法之mini-batch梯度下降法