一、简介

使用单台机器或者单个GPU/CPU来进行模型训练,训练速度会受资源的影响,因为毕竟单个的设备的计算能力和存储能力具有一定的上限的,针对这个问题,TensorFlow支持分布式模型运算,支持多机器、多GPU、多CPU各种模型的组合运行方案的设计。(默认情况下,TensorFlow程序会将程序运行在第一个GPU上<如果有GPU,并且安装的TensorFlow支持GPU运行>)

TensorFlow的分布式支持单机多GPU、单机GPU+CPU、多机GPU等结构,不过所有结构的构建方式基本类似。

除了TensorFlow外,Caffe、DeepLearning4j等也支持分布式训练,TensorFlow中的集群(Cluster)指的是一系列能够对TensorFlow中的图(graph)进行分布式计算的任务(task)。每个任务是同服务(server)相关联的。TensorFlow中的服务会包含一个用于创建session的主节点和至少一个用于图运算的工作节点。另外在TensorFlow中,一个集群可以被拆分为一个或者多个作业(job),每个作业可以包含至少一个任务。

cluster(集群)、job(作业)、task(任务)三者可以简单的看成是层次关系,task可以看成每台机器上的一个进程,多个task组成job;job又有:ps、worker两种,分别用于参数服务、计算服务,组成cluster。

二、构建步骤

TensorFlow分布式集群的构建主要通过代码实现,主要步骤如下:

1、创建集群(Cluster)

  • 创建一个tf.train.ClusterSpec用于对集群中的所有任务进行描述,该描述内容对于所有内容应该是相同的。
  • 创建tf.train.Se中参数传入构造函数,rver并将tf.train.ClusterSpec

2、使用tf.device API指定运算的设备,构建计算图,最后提交运算

备注:TensorFlow负责内部作业之间的数据传输

三、实现方式

TensorFlow中主要包含两个方面

第一:对不同数据大小进行计算的任务(work作业)

第二:用于不停更新共享参数的任务(ps作业)。这样任务都可以运行不同在机器上,在TensorFlow中,主要实现方式如下:

  • 图内的拷贝(In-Graph Replication)
  • 图间的拷贝(Between-Graph Replication)
  • 异步训练(Asynchronous Training)
  • 同步训练(Synchronous Training)

3.1)在In-Graph Replication

指定整个集群由一个客户端来构建图,并且这个客户端来提交图到集群中,worker只负责处理执行任务。In-Graph模式的好处在于解耦了TensorFlow集群和训练应用之间的关系,这样可以提前构建好参数服务器和计算服务器,而这些角色本身不需要额外的逻辑代码,只需要使用join等待即可,真正的训练逻辑全部位于客户端,具有足够高的灵活性。

备注:在小规模数据集的情况下,经常使用。在海量数据的训练过程中,不建议使用该方式,建议使用Between-Graph Replication模式。

3.2)在Between-Graph Replication

每个客户端会构建一个相似的图结构,该结构中的参数均通过ps作业进行声明并使用tf.train.replica_device_setter方法将参数映射到不同的任务作业中。

3.3)Synchronous Training

在同步训练中,每个graph的副本读取相同的parameter值,并行的计算,然后将计算完的结果放到一起处理。在TensorFlow中,如果是Betweengraph replication的情况下,可以通tf.train.SyncReplicasOptimizer来处理,如果是In-graph replication情况下,直接对结果进行处理即可(比如平均).

3.4)Asynchronous Training

在异步训练中,每个任务计算完后,就会直接使用计算出的结果更新parameter值。不同的任务之间不存在协调进度。

同步训练需要等待最慢的一个任务执行完后,才可用更新参数;异步训练中,可以每执行完一个任务,就更新一次参数。一般情况下,建议使用异步训练。

四、Demo演示

server-demo.py服务器代码:

import tensorflow as tf
# 1. 配置服务器相关信息
# 因为tensorflow底层代码中,默认就是使用ps和work分别表示两类不同的工作节点
# ps:变量/张量的初始化、存储相关节点
# work: 变量/张量的计算/运算的相关节点
ps_hosts = ['127.0.0.1:33331', '127.0.0.1:33332']
work_hosts = ['127.0.0.1:33333', '127.0.0.1:33334', '127.0.0.1:33335']
cluster = tf.train.ClusterSpec({'ps': ps_hosts, 'work': work_hosts})# 2. 定义一些运行参数(在运行该python文件的时候就可以指定这些参数了)
tf.app.flags.DEFINE_string('job_name', default_value='work', docstring="One of 'ps' or 'work'")
tf.app.flags.DEFINE_integer('task_index', default_value=0, docstring="Index of task within the job")
FLAGS = tf.app.flags.FLAGS# 2. 启动服务
def main(_):print(FLAGS.job_name)server = tf.train.Server(cluster,job_name=FLAGS.job_name,task_index=FLAGS.task_index)server.join()
if __name__ == '__main__':# 底层默认会调用main方法tf.app.run()

客户端代码:client-demo01

import tensorflow as tf
import numpy as np
# 1. 构建图
with tf.device('/job:ps/task:0'):# 2. 构造数据x = tf.constant(np.random.rand(100).astype(np.float32))# 3. 使用另外一个机器
with tf.device('/job:work/task:1'):y = x * 0.1 + 0.3# 4. 运行
with tf.Session(target='grpc://127.0.0.1:33335',config=tf.ConfigProto(log_device_placement=True,allow_soft_placement=True)) as sess:print(sess.run(y))

执行:

1、通过命令行,进入对应环境:进入server-demo.py所在文件夹,重复打开5个,分别输入(虽然最后结果只是在最后3335中显示,但是必须要全部运行,才能运算出结果):

  • python server-demo.py --job_name=ps --task_index=0
  • python server-demo.py --job_name=ps --task_index=1
  • python server-demo.py --job_name=work --task_index=0
  • python server-demo.py --job_name=work --task_index=1
  • python server-demo.py --job_name=work --task_index=2

2、运行客户端,最后结果如下:

TensorFlow 分布式相关推荐

  1. TensorFlow分布式(多GPU和多服务器)详解

    本文介绍有关 TensorFlow 分布式的两个实际用例,分别是数据并行(将数据分布到多个 GPU 上)和多服务器分配. 玩转分布式TensorFlow:多个GPU和一个CPU 展示一个数据并行的例子 ...

  2. 白话tensorflow分布式部署和开发

    2019独角兽企业重金招聘Python工程师标准>>> 白话tensorflow分布式部署和开发 博客分类: 深度学习 关于tensorflow的分布式训练和部署, 官方有个英文的文 ...

  3. tensowflow 训练 远程提交_一文说清楚Tensorflow分布式训练必备知识

    Note: 原文发表于我的知乎专栏:算法工程师的自我修养,欢迎关注! Methods that scale with computation are the future of AI. -Rich S ...

  4. tensorflow 启动多个session_Tensorflow源码解析7 -- TensorFlow分布式运行时

    1 概述 TensorFlow架构设计精巧,在后端运行时这一层,除了提供本地运行时外,还提供了分布式运行时.通过分布式训练,在多台机器上并行执行,大大提高了训练速度.前端用户通过session.run ...

  5. 深度学习(五十五)tensorflow分布式训练

    tensorflow分布式训练 博客:http://blog.csdn.net/hjimce 微博:黄锦池-hjimce   qq:1393852684 情况一.单机单卡 单机单卡是最普通的情况,当然 ...

  6. oracle job 每月前十天运行_Tensorflow源码解析7 -- TensorFlow分布式运行时

    1 概述 TensorFlow架构设计精巧,在后端运行时这一层,除了提供本地运行时外,还提供了分布式运行时.通过分布式训练,在多台机器上并行执行,大大提高了训练速度.前端用户通过session.run ...

  7. 阿里云高性能AI服务 -- 基于Docker和EGS一键创建高性能Tensorflow分布式训练

    一. 概述 Tensorflow是目前使用最为广泛的深度学习框架之一,但是目前搭建分布式多机多卡训练比较困难,而且Tensorflow原生的分布式的性能很差,特别在云计算虚拟化环境下并行的挑战更大. ...

  8. 阿里云深度学习实验室(DL-Lab) -- 基于Docker和EGS一键创建高性能Tensorflow分布式训练

    原文链接:点击打开链接 摘要: ## 一. 概述 Tensorflow是目前使用最为广泛的深度学习框架之一,但是目前搭建分布式多机多卡训练比较困难,而且Tensorflow原生的分布式的性能很差. 为 ...

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

    TF的实现分为了单机实现和分布式实现,在分布式实现中,需要实现的是对client,master,worker process不在同一台机器上时的支持.数据量很大的情况下,单机跑深度学习程序,过于耗时, ...

最新文章

  1. “我被机器解雇了!”Amazon 63岁员工因算法评分太低被自动开除
  2. 成功解决pandas\core\frame.py:2754: SettingWithCopyWarning: A value is trying to be set on a copy of a s
  3. abap 选择屏幕事件AT SELECTION-SCREEN
  4. php 构造函数 链接数据库,构造函数在php中的使用方法(附示例)-php教程
  5. 腾讯视频云黄斌:打造toB的产品与运营体系
  6. dump in AHN for CRM Opportunity doc history
  7. Java笔记11-软件开发流程设计原则
  8. python的基本语术_一起学python-彻底掌握专业术语“变量”的概念
  9. arcmap中使用python_ArcMap - 使用python更新列中的值
  10. PhoneClean(iOS设备清理)下载安装,软件介绍
  11. atitit.api设计 方法 指南 手册 v2 q929.docx
  12. 19_完成“我的订单”
  13. 团队博客-应用功能说明书
  14. 后天淘宝客cms系统源码
  15. Android 使用三种方式缓存加载 倒影图片
  16. 随机梯度下降与梯度下降的区别?
  17. 关于HTTP请求出现405状态码 Method not allowed的解决办法
  18. 论文中如何实现公式居中标号靠右?
  19. 算法中的大O是什么意思
  20. 百度地图、高德地图和腾讯地图定位不准确的解决方案

热门文章

  1. Install OpenCL on Debian, Ubuntu and Mint orderly
  2. 互联网,可预见的未来
  3. typedef 数组使用详解
  4. 在windows xp下编译出ffmpeg.exe
  5. ArcEngine调用FeatureToLine工具传参问题
  6. 基于 Token 的身份验证方法
  7. 《疯狂Java讲义》(二十九)---- JDBC
  8. java中String相等问题
  9. ExtAspNet学习-利用AppBox框架快速创建项目(五)—完成项目含源代码
  10. Silverlight 全屏显示