Distributed TensorFlow


Todo list:

  1. Distributed TensorFlow简介
  2. Distributed TensorFlow的部署与运行
  3. 对3个台主机做多卡GPU和两台主机做多卡GPU的结果作对比

Distributed TensorFlow 意在使用等多主机的GPU加载模型,加速训练.

在分布式的tensorflow可以更快过运行更大的模型. Distributed tensorflow可以运行在分布式集群上,也可以运行在

在分布式的tensorflow是根据DisBelif进行的改进. 在DisBelief中有两个不同的进程,分别是Parameter Server(PS) 和 worker replices;

PS的职责是: 保存模型的状态(也是每次更新的参数值),并根据随后的梯度进行更新. 他的作用是将每个work中的图连接起来

worker的职责是: 计算权重的梯度

tensorflow借鉴了这种方式, 并且在程序代码的书写上更加人性化: DisBelief中的Work和PS是两种不同的代码执行的进程; 但是在tf中work和ps的代码是完全相同的,

Work Replication

Work Replication有两种方式一种是In-graph 另一种是Between-graph

In-graph:

将模型的计算图的不同部分放在不同的机器上执行

In-graph模式, 把计算已经从单机多GPU,扩展到了多机多GPU了, 但是数据分发还是在一个节点。 这样的好处是配置简单, 其他多机多GPU的计算节点, 暴露一个网络接口,等在那里接受任务就好了。 这些计算节点暴露出来的网络接口,使用起来就跟本机的一个GPU设备所调用的函数一样, 指定tf.device(“/job:worker/task:n”)即可. PS负责join操作,

Between-graph:

数据并行,每台机器使用完全相同的计算图; Between-graph模式下,训练的参数保存在参数服务器, 数据不用分发, 数据分片的保存在各个计算节点, 各个计算节点自己算自己的, 算完了之后, 把要更新的参数告诉参数服务器,参数服务器更新参数。这种模式的优点是不用训练数据的分发了, 尤其是在数据量在TB级的时候, 节省了大量的时间,所以大数据深度学习还是推荐使用Between-graph模式。

以上两种操作均支持 同步更新和异步更新.

在同步更新的时候, 每次梯度更新,要等所有分发出去的数据计算完成后,返回回来结果之后,把梯度累加算了均值之后,再更新参数。 这样的好处是loss的下降比较稳定, 但是这个的坏处也很明显, 处理的速度取决于最慢的那个分片计算的时间。

在异步更新的时候, 所有的计算节点,各自算自己的, 更新参数也是自己更新自己计算的结果, 这样的优点就是计算速度快, 计算资源能得到充分利用,但是缺点是loss的下降不稳定, 抖动大。

在数据量小的情况下, 各个节点的计算能力比较均衡的情况下, 推荐使用同步模式;数据量很大,各个机器的计算性能掺差不齐的情况下,推荐使用异步的方式。

如何部署分布式Tensorflow?

Demo:

环境简介:

ubuntu16.04 服务器 *3 , ip=[172.16.60.114,  172.16.60.107,  172.16.5:0.111]
Cuda8.0 , Cudnn6
Tensorflow 1.10.0
Anaconda3| python3.6

测试文件

代码详情参见:github: Leechen2014/tec4tensorflow

解析:

分布式使用方法

cluster = tf.train.ClusterSpec({'ps': 'ps的服务器的URL', 'worker': 'work服务的URL'})

server = tf.train.Server(cluster, job_name="自己其名字" task_index=FLAGS.task_index)

针对ps服务需要做:

server.join()

多卡的GPU 实现:

with tf.device(tf.train.replica_device_setter(cluster=cluster )) # 也可以在每台worker上写worker_device = '/job:worker/task%d/gpu:0' , 这种方式有点麻烦

运行方法:

# 在ps主机启动grcp服务, 运行的命令如下:
CUDA_VISIBLE_DEVICES='5,6' python TestDistributed.py --job_name=ps --task_index=0 # 在107上运行命令如下:
CUDA_VISIBLE_DEVICES='5,6' python TestDistributed.py --job_name=worker --task_index=0 # 在111上的运行命令如下:
CUDA_VISIBLE_DEVICES='5,6' python TestDistributed.py --job_name=worker --task_index=1

注意事项:

  1. 不需要建立SSH 免密码登录.
  2. 代码中由于是使用

    with tf.device(tf.train.replica_device_setter(cluster=XXX)

    的方式分配GPU的, 所以在指定task_index的时候,其编号顺序应该和启动顺序应该与

    flags.DEFINE_string('worker_hosts', '172.16.60.107:22221,172.16.50.111:22221','Comma-separated list of hostname:port pairs')

    保持一致.

运行结果:

# 114 是ps, 启动grpc服务
2018-09-12 16:07:55.938936: I tensorflow/core/common_runtime/gpu/gpu_device.cc:971] 0 1
2018-09-12 16:07:55.938944: I tensorflow/core/common_runtime/gpu/gpu_device.cc:984] 0: N Y
2018-09-12 16:07:55.938949: I tensorflow/core/common_runtime/gpu/gpu_device.cc:984] 1: Y N
2018-09-12 16:07:55.940175: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1097] Created TensorFlow device (/job:ps/replica:0/task:0/device:GPU:0 with 10403 MB memory) -> physical GPU (device: 0, name: GeForce GTX 1080 Ti, pci bus id: 0000:0d:00.0, compute capability: 6.1)
2018-09-12 16:07:56.080591: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1097] Created TensorFlow device (/job:ps/replica:0/task:0/device:GPU:1 with 10403 MB memory) -> physical GPU (device: 1, name: GeForce GTX 1080 Ti, pci bus id: 0000:0e:00.0, compute capability: 6.1)
2018-09-12 16:07:56.742461: I tensorflow/core/distributed_runtime/rpc/grpc_channel.cc:215] Initialize GrpcChannelCache for job ps -> {0 -> localhost:22221}
2018-09-12 16:07:56.742526: I tensorflow/core/distributed_runtime/rpc/grpc_channel.cc:215] Initialize GrpcChannelCache for job worker -> {0 -> 172.16.60.107:22221, 1 -> 172.16.50.111:22221}
2018-09-12 16:07:56.764061: I tensorflow/core/distributed_runtime/rpc/grpc_server_lib.cc:375] Started server with target: grpc://localhost:22221 ------------------------
# 107 是work0
1536739841.883745: Worker 0: traing step 7599 dome (global step:9986)
1536739841.897058: Worker 0: traing step 7600 dome (global step:9988)
1536739841.910197: Worker 0: traing step 7601 dome (global step:9990)
1536739841.923900: Worker 0: traing step 7602 dome (global step:9992)
1536739841.936971: Worker 0: traing step 7603 dome (global step:9994)
1536739841.950250: Worker 0: traing step 7604 dome (global step:9996)
1536739841.964122: Worker 0: traing step 7605 dome (global step:9998)
1536739841.978155: Worker 0: traing step 7606 dome (global step:10000)
Training ends @ 1536739841.978258
Training elapsed time:98.617033 s
After 10000 training step(s), validation cross entropy = 1141.94 ----------------------------
#111 是work1
1536739841.872289: Worker 1: traing step 2389 dome (global step:9985)
1536739841.885433: Worker 1: traing step 2390 dome (global step:9987)
1536739841.898431: Worker 1: traing step 2391 dome (global step:9989)
1536739841.911799: Worker 1: traing step 2392 dome (global step:9991)
1536739841.924894: Worker 1: traing step 2393 dome (global step:9993)
1536739841.938620: Worker 1: traing step 2394 dome (global step:9995)
1536739841.952448: Worker 1: traing step 2395 dome (global step:9997)
1536739841.966328: Worker 1: traing step 2396 dome (global step:9999)
1536739841.979593: Worker 1: traing step 2397 dome (global step:10001)
Training ends @ 1536739841.979693
Training elapsed time:41.149895 s
After 10000 training step(s), validation cross entropy = 1141.94
D0912 16:10:42.498070727 37760 dns_resolver.cc:280] Start resolving.

通过以上的运行结果可以发现, 114启动了gRcp服务, 但没有关闭, 关于这个问题,stack overflow中已经有人给出解决方法Shut down server in TensorFlow , 关于gRcp详情参见[^using-grpc-in-python]:using-grpc-in-python

备注:

  1. ps和worker可以在同一个host中共存, 这个很好理解,就像hadoop中master和slaver是可以共存的一样. 为了避免出现端口冲突, 在同一个主机上ps的端口和worker端口应该不一样
  2. ps 可以有多个, 书写方式可以参照work
  3. 再次强调,由于使用的是 with tf.device(tf.train.replica_device_setter(cluster=XXX) 所以, Worker的启动顺序如果和lags.DEFINE_string('worker_hosts', '172.16.60.107:22221,172.16.50.111:22221','Comma-separated list of hostname:port pairs') 中书写的顺序不同, 将会导致其产生OS Error

将ps也做成worker进程的方式是:

将第20行: flags.DEFINE_string('worker_hosts', '172.16.60.107:22221,172.16.50.111:22221', 'Comma-separated list of hostname:port pairs')

添加114的ip和端口号, 修改为: flags.DEFINE_string('worker_hosts', '172.16.60.107:22221,172.16.50.111:22221,172.16.60.114:22222', 'Comma-separated list of hostname:port pairs')

从新运行即可,注意运行顺序

运行结果:

##############114 ps##################################
h strength 1 edge matrix:
2018-09-12 16:38:41.432822: I tensorflow/core/common_runtime/gpu/gpu_device.cc:971] 0 1
2018-09-12 16:38:41.432830: I tensorflow/core/common_runtime/gpu/gpu_device.cc:984] 0: N Y
2018-09-12 16:38:41.432835: I tensorflow/core/common_runtime/gpu/gpu_device.cc:984] 1: Y N
2018-09-12 16:38:41.433475: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1097] Created TensorFlow device (/job:ps/replica:0/task:0/device:GPU:0 with 10403 MB memory) -> physical GPU (device: 0, name: GeForce GTX 1080 Ti, pci bus id: 0000:0d:00.0, compute capability: 6.1)
2018-09-12 16:38:41.949217: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1097] Created TensorFlow device (/job:ps/replica:0/task:0/device:GPU:1 with 10403 MB memory) -> physical GPU (device: 1, name: GeForce GTX 1080 Ti, pci bus id: 0000:0e:00.0, compute capability: 6.1)
2018-09-12 16:38:42.086615: I tensorflow/core/distributed_runtime/rpc/grpc_channel.cc:215] Initialize GrpcChannelCache for job ps -> {0 -> localhost:22221}
2018-09-12 16:38:42.086674: I tensorflow/core/distributed_runtime/rpc/grpc_channel.cc:215] Initialize GrpcChannelCache for job worker -> {0 -> 172.16.60.107:22221, 1 -> 172.16.50.111:22221, 2 -> 172.16.60.114:22222}
2018-09-12 16:38:42.094741: I tensorflow/core/distributed_runtime/rpc/grpc_server_lib.cc:375] Started server with target: grpc://localhost:22221 ###############107 worker 0##########################
#CUDA_VISIBLE_DEVICES='5,6' python TestDistributed.py --job_name=worker --task_index=0
1536741807.352432: Worker 0: traing step 3305 dome (global step:9997)
1536741807.388893: Worker 0: traing step 3306 dome (global step:10000)
Training ends @ 1536741807.388980
Training elapsed time:80.524482 s
After 10000 training step(s), validation cross entropy = 1127 ####################111 worker 1###################################
#CUDA_VISIBLE_DEVICES='5,6' python TestDistributed.py --job_name=worker --task_index=1
1536741807.370341: Worker 1: traing step 3222 dome (global step:9998)
1536741807.398533: Worker 1: traing step 3223 dome (global step:10002)
Training ends @ 1536741807.398634
Training elapsed time:79.786702 s
After 10000 training step(s), validation cross entropy = 1127 #################114 worker2 #############
#CUDA_VISIBLE_DEVICES='0,1' python TestDistributed.py --job_name=worker --task_index=2
1536741807.346162: Worker 2: traing step 3474 dome (global step:9996)
1536741807.359073: Worker 2: traing step 3475 dome (global step:10000)
Training ends @ 1536741807.359174
Training elapsed time:79.858818 s
After 10000 training step(s), validation cross entropy = 1127

结果对比

根据日志可以做出初步对比:

使用两个worker平均耗时69.975s; loss=1141.94, 所需要的时间是 三个worker,平均时间:80.806s;loss=1127

参考文献

Distributed TensorFlow

TensorFlow分布式全套(原理,部署,实例)

白话tensorflow分布式部署和开发

分布式注意事项

学习笔记TF061:分布式TensorFlow,分布式原理、最佳实践

Distributed TensorFlow的更多相关文章

  1. Why do people integrate Spark with TensorFlow even if there is a distributed TensorFlow framework?

    https://www.quora.com/Why-do-people-integrate-Spark-with-TensorFlow-even-if-there-is-a-distributed-T ...

  2. TensorFlow for distributed

    TensorFlow for distributed 本目录包括了运行时分布式TensorFlow的实现,其底层使用了gRPC 作为进程内通信的支持库. Quick start 首先,需要构建一个Te ...

  3. Tensorflow学习笔记4:分布式Tensorflow

    简介 Tensorflow API提供了Cluster.Server以及Supervisor来支持模型的分布式训练. 关于Tensorflow的分布式训练介绍可以参考Distributed Tenso ...

  4. TensorFlow 中文资源全集,官方网站,安装教程,入门教程,实战项目,学习路径。

    Awesome-TensorFlow-Chinese TensorFlow 中文资源全集,学习路径推荐: 官方网站,初步了解. 安装教程,安装之后跑起来. 入门教程,简单的模型学习和运行. 实战项目, ...

  5. TensorFlow资源整理

    什么是TensorFlow? TensorFlow 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库.节点(Nodes)在图中表示数学操作,图中的线(edges)则表示 ...

  6. 大数据下基于Tensorflow框架的深度学习示例教程

    近几年,信息时代的快速发展产生了海量数据,诞生了无数前沿的大数据技术与应用.在当今大数据时代的产业界,商业决策日益基于数据的分析作出.当数据膨胀到一定规模时,基于机器学习对海量复杂数据的分析更能产生较 ...

  7. 【转载】史上最全:TensorFlow 好玩的技术、应用和你不知道的黑科技

    [导读]TensorFlow 在 2015 年年底一出现就受到了极大的关注,经过一年多的发展,已经成为了在机器学习.深度学习项目中最受欢迎的框架之一.自发布以来,TensorFlow 不断在完善并增加 ...

  8. Tensorflow[目录结构]

    1 - Tensorflow源码目录结构 基于2018年5月28日github的tensorflow源码,即1.8版本 第一层: tensorflow: 核心代码目录. third_party:第三方 ...

  9. 『TensorFlow Internals』笔记_源码结构

    零.资料集合 知乎专栏:Bob学步 知乎提问:如何高效的学习 TensorFlow 代码?. 大佬刘光聪(Github,简书) 开源书:TensorFlow Internals,强烈推荐(本博客参考书 ...

随机推荐

  1. 分布式文件系统之FastDFS

    环境引入: 在一个大型的教育官网,会拥有大量优质的视频教程,并且免费提供给用户去下载,文件太多如果高效存储?用户访问量大如何保证下载速度?分布式文件系统是解决这些问题的有效方法之一 一.什么是文件系统 ...

  2. mfix中更改time dependent VTK filename的最大时间步数的容量

    默认是0000四位,有可能保存文件多了以后不够用,可以在源码中修改,修改以后效果: 源码位置: 把 I4. 改成 I5.

  3. AS添加依赖库提示Manifest merger failed解决办法

    今天在学习<Android权威编程指南>时 在project structure中添加recyclerview时提示错误 按照提示添加tools:replace标签还是报错 然后切换至bu ...

  4. web服务的简单介绍及apache服务的安装

    一,web服务的作用:  是指驻留于因特网上某种类型计算机的程序,可以向浏览器等Web客户端提供文档.可以放置网站文件,让全世界浏览:   可以放置数据让全世界下载.目前最主流的三个Web服务器是Ap ...

  5. C++模(mú )板秘籍

    秘籍?想看我的秘籍?在硬盘上呢.就不给你看!

  6. D-Link DIR-645 信息泄露漏洞

    D-Link DIR-645 getcfg.php 文件由于过滤不严格导致信息泄露漏洞. $SERVICE_COUNT = cut_count($_POST["SERVICES"] ...

  7. Linux-文件目录类命令

    l 文件目录类 pwd 指令 基本语法 pwd (功能描述:显示当前工作目录的绝对路径) 应用实例 案例:显示当前工作目录的绝对路径 ls指令 基本语法 ls [选项] [目录或是文件] 常用选项 - ...

  8. Java代码在本地运行没有问题。上传到阿里云服务器后。出现了中文乱码解决

    java -Dfile.encoding=UTF-8 -jar project.jar

  9. Linux下模拟多线程的并发并发shell脚本

    分享一个在Linux下模拟多线程的并发脚本,使用这个脚本可以同时批量在定义数量的服务器上执行相关命令,比起普通for/while循环只能顺序一条一条执行的效率高非常多,在管理大批服务器时非常的实用.  ...

  10. [转]用Excel制作甘特图并管理项目

    对于比较简单的项目管理,或绘制甘特图,选用电子表格工具——比如价格高也最强大的Excel.开源的OpenOffice.免费的WPS——可能比项目管理软件更方便. 1. XL-Easy Gantt 模板 ...