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、运行客户端,最后结果如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/454199.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第五周测试

---恢复内容开始--- 一 视频知识 1 linux系统下如何区分内核态与用户态 在内核态&#xff1a;cs:eip可以是任意的地址&#xff0c;4G的内存地址空间 在用户态&#xff1a;cs:eip只能访问0x00000000—0xbfffffff的地址空间 2 系统调用的三层皮&#xff1a;xyz、system_call和sys…

网页制作小技巧:dl dt dd标签用法

< DOCTYPE html PUBLIC -WCDTD XHTML StrictEN httpwwwworgTRxhtmlDTDxhtml-strictdtd> 一般我们在做列表的时候通常只会用到ul和li,至于DL一般都很少用到&#xff0c;它也属于列表类的标签&#xff0c;下面说一下大概的用法&#xff1a; <dl>标记定义了一个定义列…

latex公式对齐_Word 写公式最方便的方法

自从用上了word 2016之后&#xff0c;发现他的公式编辑器真香!真香!!他有了latex的优雅&#xff0c;又有了Mathtype的可视化效果&#xff0c;甚至更好哈&#xff0c;当编辑大量公式时也不会因为插件问题卡掉当前的努力。学起来也不复杂&#xff0c;反正是word. 强烈推荐。我们最…

路要怎么走?关于程序员成长的一点思考

程序员的我们&#xff0c;是否想过今后的路该怎么走、如何发展、技术怎样提高?其实这也是我一直在思考的问题。下面就此问题&#xff0c;分享下我的看法。因为我阅历有限&#xff0c;有什么说的不对的&#xff0c;大家见谅&#xff0c;千万不要喷…… 一、程序员应该打好基础 …

TensorFlow 常见API

数据类型转换相关API Tensor Shape获取以及设置相关API Tensor合并、分割相关API Error相关类API 常量类型的Tensor对象相关API 序列和随机Tensor对象相关API Session相关API 逻辑运算符相关API 比较运算符相关API 调试相关API 图像处理-编码解码相关API 图像处理-调整大小相关…

python封装继承多态_浅谈JavaScript的面向对象和它的封装、继承、多态

写在前面既然是浅谈&#xff0c;就不会从原理上深度分析&#xff0c;只是帮助我们更好地理解...面向对象与面向过程面向对象和面向过程是两种不同的编程思想&#xff0c;刚开始接触编程的时候&#xff0c;我们大都是从面向过程起步的&#xff0c;毕竟像我一样&#xff0c;大家接…

将万亿以下的阿拉伯数字转为中文金额

package test.practice.month3; public class Test005 { //可以不用swich case将123456789转为一二三四五六七八九 //直接用char[] chars {一,二,三,四,五,六,七,八,九}; public static void main(String[] args) { System.out.println(getCMoney(102030405067L)); } private …

8.2 命令历史

2019独角兽企业重金招聘Python工程师标准>>> 命令历史 history //查看之前的命令.bash_history //存放之前敲过的命令&#xff0c;在 /root/ 目录下最大1000条 //默认参数值是1000条变量HISTSIZE/etc/profile中修改 //在其中可编辑HISTSIZE参数HISTTIMEFORMAT"…

使用GCC生成无格式二进制文件(plain binary files)

使用C语言生成一个二进制文件 使用自己喜欢的文本编辑器写一个test.c&#xff1a; int main() { } 再使用如下命令编译&#xff1a; gcc –c test.c ld –o test –Ttext 0x0 –e main test.o objcopy –R .note –R .comment –S –O binary test test.bin 最后生成的二进…

TensorFlow 实例一:线性回归模型

代码 # -- encoding:utf-8 -- """ Create by ibf on 2018/5/6 """import numpy as np import tensorflow as tf# 1. 构造一个数据 np.random.seed(28) N 100 x np.linspace(0, 6, N) np.random.normal(loc0.0, scale2, sizeN) y 14 * x - …

python后端数据发送到前端_Python Django 前后端数据交互 之 后端向前端发送数据...

Django 从后台往前台传递数据时有多种方法可以实现。最简单的后台是这样的&#xff1a;from django.shortcuts import renderdefmain_page(request):return render(request, ‘index.html‘)这个就是返回index.html的内容&#xff0c;但是如果要带一些数据一起传给前台的话&…

Dapper的基本使用

Dapper是.NET下一个micro的ORM&#xff0c;它和Entity Framework或Nhibnate不同&#xff0c;属于轻量级的&#xff0c;并且是半自动的。也就是说实体类都要自己写。它没有复杂的配置文件&#xff0c;一个单文件就可以了。给出官方地址。 http://code.google.com/p/dapper-dot-n…

函数名作为参数传递

假如不知道signal的函数原型&#xff0c;考虑child_handler函数的参数从哪里来&#xff1f; void child_handler(int sig) { if (sig SIGINT) kill(pid_parent, SIGUSR1); } int main(void) { ...... signal(SIGINT, child_handler); ...... } 1、…

易语言神经网络验证码识别_递归神经网络 GRU+CTC+CNN 教会验证码识别

利用 NLP 技术做简单数据可视化分析Chat 简介&#xff1a;用递归神经网络采用端到端识别图片文字&#xff0c;递归神经网络大家最早用 RNN &#xff0c;缺陷造成梯度消失问题&#xff1b;然后采用了 LSTM&#xff0c;解决 RNN 问题&#xff0c;并且大大提高准确率&#xff1b;现…

GCC 生成的符号表调试信息剖析

GCC把C语言源文件&#xff08;&#xff07;.c&#xff07;&#xff09;编译成汇编语言文件&#xff08;&#xff07;.s&#xff07;&#xff09;&#xff0c;汇编器把汇编语言文件翻译成目标文件&#xff08;&#xff07;.o&#xff07;&#xff09;&#xff0c;最后由链接器链…

《操作系统》OS学习(一):OS相关

清华大学操作系统OS&#xff08;向勇、陈渝&#xff09;视频地址&#xff1a;http://www.xuetangx.com/courses/course-v1:TsinghuaX30240243Xsp/about 在ucore实验中&#xff0c;一些基本的常用工具如下&#xff1a; 命令行shell: bash shell -- 有对文件和目录操作的各种命令…

Android4.0蓝牙使能的详细解析

毫无疑问&#xff0c;bluetooth的打开是在Settings中进行的操作。因此&#xff0c;冤有头&#xff0c;债有主&#xff0c;我们来到了Settings.java中&#xff0c;果然发现了相关的代码如下&#xff1a; mBluetoothEnabler new BluetoothEnabler(context, new Switch(context));…

第一次冲刺

本人小组分工角色&#xff1a;产品负责人 本组冲刺订单介绍&#xff1a;经过小组的成员讨论&#xff0c;我们大概确立了一个冲刺的订单是完成一个简易的长沙学院网站项目。 最后完成情况概述&#xff1a;经过大约两周的努力&#xff0c;我们组的编程人员运用python构建了一个简…

移动端导出excel_连载系列【4】Excel开发移动端quot;APPquot;

前三篇文章介绍了百度地图生成器、源代码编辑器、GPS经纬度批量转换工具、源代码编辑器中添加自定义功能按钮和地图控件。这些写好的Java Script代码虽然可以实现所有期望的结果&#xff0c;但毕竟不是一个HTML文件&#xff0c;不便于传播和使用&#xff0c;更无法变成一个类似…

《操作系统》OS学习(二):启动、中断、异常

Bootloader:加载OS。操作系统一开始是放在DISK&#xff08;硬盘&#xff09;中&#xff0c;并不是放在内存中。 BIOS&#xff1a;基本I/O处理系统。存放在ROMRead-Only Memory&#xff09;只读存储中 BIOS&#xff08;Basic Input/Output System&#xff09;基本输入输出系统。…