手把手教你搭建分布式集群,进入生产环境的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. poptest老李谈分布式与集群 2

    集群分类 Linux集群主要分成三大类( 高可用集群, 负载均衡集群,科学计算集群) 高可用集群( High Availability Cluster)负载均衡集群(Load Balance Clus ...

  3. poptest老李谈分布式与集群

    poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:908821478,咨询电话010-845052 ...

  4. 京东分布式MySQL集群方案介绍

    背景 数据库作为一个非常基础的系统,任何一家互联网公司都会使用,数据库产品也很多,有Oracle.SQL Server .MySQL.PostgeSQL.MariaDB等,像SQLServer/Ora ...

  5. 分布式MySQL集群方案的探索与思考

    转载:http://www.infoq.com/cn/articles/exploration-of-distributed-mysql-cluster-scheme?utm_campaign=rig ...

  6. EHCache分布式缓存集群环境配置

    EHCache分布式缓存集群环境配置 ehcache提供三种网络连接策略来实现集群,rmi,jgroup还有jms.同时ehcache可以可以实现多播的方式实现集群,也可以手动指定集群主机序列实现集群 ...

  7. java 分布式与集群的区别和联系(转)

    本文主要介绍了java分布式与集群的区别和联系,具有很好的参考价值,下面跟着小编一起来看下吧 一.先说区别: 一句话:分布式是并联工作的,集群是串联工作的. 1.分布式是指将不同的业务分布在不同的地方 ...

  8. Dubbo 入门-细说分布式与集群

    什么是Dubbo Dubbo是一款高性能.轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现. 什么是RPC RPC全称(Rem ...

  9. 分布式 PostgreSQL 集群(Citus)官方示例 - 时间序列数据

    在时间序列工作负载中,应用程序(例如一些实时应用程序查询最近的信息,同时归档旧信息. https://docs.citusdata.com/en/v10.2/sharding/data_modelin ...

随机推荐

  1. 禁用/移除WordPress页面的评论功能

    对于某些类型的WordPress站点,也许不需要在页面(page)提供评论功能,那么你可以通过下面的方法,很容易就禁用或移除WordPress页面的评论功能. 方法1:在页面编辑界面取消该页面的评论功 ...

  2. Axure之添加点击页面

    添加悬停字体变色的效果 页面载入时的频道预设(我做错了,英文版本不知道那个是页面载入时的事件) 我的博客不够完善,看不到全部的图片.我后续会修改我的网站的

  3. sklearn之特征提取(文本特征)

    1.引言 关于文本的提取有很多方法,本文主要探索下sklearn官方的文本特征提取功能. 2.文本特征提取 文本分析是机器学习算法的主要应用领域. 然而,原始数据,符号文字序列不能直接传递给算法,因为 ...

  4. 导入pymysql模块出错:No module named 'pymysql'

    前提: 使用的版本为:Python 3.6.4 pymysql已经被成功安装了,并通过命令行的方式验证已成功安装. 但在pycharm中运行工程时候时候报错:No module named 'pymy ...

  5. linux下监测进程是否存在

    因为有的统计脚本需要执行很久,而有不能总去人工的检查进程是否在跑,所以就用shell脚本来循环监测进程是否存在 尝试了网上说的$?表示上一条命令返回值总是达不到预期的结果,后来直接改成用一个变量记录返 ...

  6. 【JZOJ5081】【GDSOI2017第三轮模拟】Travel Plan 背包问题+双指针+树的dfs序

    题面 100 注意到ban的只会是一个子树,所以我们把原树转化为dfs序列. 然后题目就转化为,询问一段ban的区间,之后的背包问题. 比赛的时候,我想到这里,于是就开始想区间合并,于是搞了线段树合并 ...

  7. Redis-cli 命令不能用

    bash: redis-cli: command not found... 环境: Linux7.X 在运行redis-cli命令的时候提示错误: 解决方案: 1. wget http://downl ...

  8. SDUT-3378_数据结构实验之查找六:顺序查找

    数据结构实验之查找六:顺序查找 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 在一个给定的无序序列里,查找与给定关键字 ...

  9. TP5动态路由配置好了但是报错was not found on this server的原因以及解决方法

    问题:The requested URL /xxxx.html was not found on this server 原因:apache的重写未开启,开启重写后,问题解决, 方法如下: apach ...

  10. 微信端的user-Agent

    在iPhone下,返回 Mozilla/5.0 (iPhone; CPU iPhone OS 5_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Ge ...