TensorFlow 分布式
一、简介
使用单台机器或者单个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 分布式相关推荐
- TensorFlow分布式(多GPU和多服务器)详解
本文介绍有关 TensorFlow 分布式的两个实际用例,分别是数据并行(将数据分布到多个 GPU 上)和多服务器分配. 玩转分布式TensorFlow:多个GPU和一个CPU 展示一个数据并行的例子 ...
- 白话tensorflow分布式部署和开发
2019独角兽企业重金招聘Python工程师标准>>> 白话tensorflow分布式部署和开发 博客分类: 深度学习 关于tensorflow的分布式训练和部署, 官方有个英文的文 ...
- tensowflow 训练 远程提交_一文说清楚Tensorflow分布式训练必备知识
Note: 原文发表于我的知乎专栏:算法工程师的自我修养,欢迎关注! Methods that scale with computation are the future of AI. -Rich S ...
- tensorflow 启动多个session_Tensorflow源码解析7 -- TensorFlow分布式运行时
1 概述 TensorFlow架构设计精巧,在后端运行时这一层,除了提供本地运行时外,还提供了分布式运行时.通过分布式训练,在多台机器上并行执行,大大提高了训练速度.前端用户通过session.run ...
- 深度学习(五十五)tensorflow分布式训练
tensorflow分布式训练 博客:http://blog.csdn.net/hjimce 微博:黄锦池-hjimce qq:1393852684 情况一.单机单卡 单机单卡是最普通的情况,当然 ...
- oracle job 每月前十天运行_Tensorflow源码解析7 -- TensorFlow分布式运行时
1 概述 TensorFlow架构设计精巧,在后端运行时这一层,除了提供本地运行时外,还提供了分布式运行时.通过分布式训练,在多台机器上并行执行,大大提高了训练速度.前端用户通过session.run ...
- 阿里云高性能AI服务 -- 基于Docker和EGS一键创建高性能Tensorflow分布式训练
一. 概述 Tensorflow是目前使用最为广泛的深度学习框架之一,但是目前搭建分布式多机多卡训练比较困难,而且Tensorflow原生的分布式的性能很差,特别在云计算虚拟化环境下并行的挑战更大. ...
- 阿里云深度学习实验室(DL-Lab) -- 基于Docker和EGS一键创建高性能Tensorflow分布式训练
原文链接:点击打开链接 摘要: ## 一. 概述 Tensorflow是目前使用最为广泛的深度学习框架之一,但是目前搭建分布式多机多卡训练比较困难,而且Tensorflow原生的分布式的性能很差. 为 ...
- TensorFlow分布式全套(原理,部署,实例)
TF的实现分为了单机实现和分布式实现,在分布式实现中,需要实现的是对client,master,worker process不在同一台机器上时的支持.数据量很大的情况下,单机跑深度学习程序,过于耗时, ...
最新文章
- “我被机器解雇了!”Amazon 63岁员工因算法评分太低被自动开除
- 成功解决pandas\core\frame.py:2754: SettingWithCopyWarning: A value is trying to be set on a copy of a s
- abap 选择屏幕事件AT SELECTION-SCREEN
- php 构造函数 链接数据库,构造函数在php中的使用方法(附示例)-php教程
- 腾讯视频云黄斌:打造toB的产品与运营体系
- dump in AHN for CRM Opportunity doc history
- Java笔记11-软件开发流程设计原则
- python的基本语术_一起学python-彻底掌握专业术语“变量”的概念
- arcmap中使用python_ArcMap - 使用python更新列中的值
- PhoneClean(iOS设备清理)下载安装,软件介绍
- atitit.api设计 方法 指南 手册 v2 q929.docx
- 19_完成“我的订单”
- 团队博客-应用功能说明书
- 后天淘宝客cms系统源码
- Android 使用三种方式缓存加载 倒影图片
- 随机梯度下降与梯度下降的区别?
- 关于HTTP请求出现405状态码 Method not allowed的解决办法
- 论文中如何实现公式居中标号靠右?
- 算法中的大O是什么意思
- 百度地图、高德地图和腾讯地图定位不准确的解决方案