tensorflow——分布式的tensorflow运行环境(代码片段)

baby-lily baby-lily     2022-12-15     146

关键词:

当我们在大型的数据集上面进行深度学习的训练时,往往需要大量的运行资源,而且还要花费大量时间才能完成训练。

1.分布式TensorFlow的角色与原理

在分布式的TensorFlow中的角色分配如下:

PS:作为分布式训练的服务端,等待各个终端(supervisors)来连接。

worker:在TensorFlow的代码注释中被称为终端(supervisors),作为分布式训练的计算资源终端。

chief supervisors:在众多的运算终端中必须选择一个作为主要的运算终端。该终端在运算终端中最先启动,它的功能是合并各个终端运算后的学习参数,将其保存或者载入。

每个具体的网络标识都是唯一的,即分布在不同IP的机器上(或者同一个机器的不同端口)。在实际的运行中,各个角色的网络构建部分代码必须100%的相同。三者的分工如下:

服务端作为一个多方协调者,等待各个运算终端来连接。

chief supervisors会在启动时同一管理全局的学习参数,进行初始化或者从模型载入。

其他的运算终端只是负责得到其对应的任务并进行计算,并不会保存检查点,用于TensorBoard可视化中的summary日志等任何参数信息。

在整个过程都是通过RPC协议来进行通信的。

2.分布部署TensorFlow的具体方法

配置过程中,首先建立一个server,在server中会将ps及所有worker的IP端口准备好。接着,使用tf.train.Supervisor中的managed_ssion来管理一个打开的session。session中只是负责运算,而通信协调的事情就都交给supervisor来管理了。

3.部署训练实例

下面开始实现一个分布式训练的网络模型,以线性回归为例,通过3个端口来建立3个终端,分别是一个ps,两个worker,实现TensorFlow的分布式运算。

1. 为每个角色添加IP地址和端口,创建sever,在一台机器上开3个不同的端口,分别代表PS,chief supervisor和worker。角色的名称用strjob_name表示,以ps为例,代码如下:

# 定义IP和端口
strps_hosts = localhost:1681
strworker_hosts = localhost:1682,localhost:1683

# 定义角色名称
strjob_name = ps
task_index = 0

# 将字符串转数组
ps_hosts = strps_hosts.split(,)
worker_hosts = strps_hosts.split(,)

cluster_spec = tf.train.ClusterSpec(ps: ps_hosts, worker: worker_hosts)

# 创建server
server = tf.train.Server(ps:ps_hosts, worker:worker_hosts, job_name=strjob_name, task_index=task_index)

2为ps角色添加等待函数

ps角色使用server.join函数进行线程挂起,开始接受连续消息。

# ps角色使用join进行等待
if strjob_name == ps:
    print("wait")
    server.join()

3.创建网络的结构

与正常的程序不同,在创建网络结构时,使用tf.device函数将全部的节点都放在当前任务下。在tf.device函数中的任务是通过tf.train.replica_device_setter来指定的。在tf.train.replica_device_setter中使用worker_device来定义具体任务名称;使用cluster的配置来指定角色及对应的IP地址,从而实现管理整个任务下的图节点。代码如下:

with tf.device(tf.train.replica_device_setter(worker_device=/job:worker/task:%d%task_index,
                                              cluster=cluster_spec)):
    X = tf.placeholder(float)
    Y = tf.placeholder(float)
    # 模型参数
    w = tf.Variable(tf.random_normal([1]), name=weight)
    b = tf.Variable(tf.zeros([1]), name=bias)

    global_step = tf.train.get_or_create_global_step()   # 获取迭代次数

    z = tf.multiply(X, w) + b
    tf.summary(z, z)
    cost = tf.reduce_mean(tf.square(Y - z))
    tf.summary.scalar(loss_function, cost)
    learning_rate = 0.001

    optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost, global_step=global_step)

    saver = tf.train.Saver(max_to_keep=1)

    merged_summary_op = tf.summary.merge_all()  # 合并所有summary

    init = tf.global_variables_initializer()

4.创建Supercisor,管理session

在tf.train.Supervisor函数中,is_chief表明为是否为chief Supervisor角色,这里将task_index=0的worker设置成chief Supervisor。saver需要将保存检查点的saver对象传入。init_op表示使用初始化变量的函数。

training_epochs = 2000
display_step = 2

sv = tf.train.Supervisor(is_chief=(task_index == 0),# 0号为chief
                         logdir=log/spuer/,
                         init_op=init,
                         summary_op=None,
                         saver=saver,
                         global_step=global_step,
                         save_model_secs=5)

# 连接目标角色创建session
with sv.managed_session(saver.target) as sess:

5迭代训练

session中的内容与以前一样,直接迭代训练即可。由于使用了supervisor管理session,将使用sv.summary_computed函数来保存summary文件。

print(sess ok)
    print(global_step.eval(session=sess))
    
    for epoch in range(global_step.eval(session=sess), training_epochs*len(train_x)):
        for (x, y) in zip(train_x, train_y):
            _, epoch = sess.run([optimizer, global_step], feed_dict=X: x, Y: y)
            summary_str = sess.run(merged_summary_op, feed_dict=X: x, Y: y)
            sv.summary_computed(sess, summary_str, global_step=epoch)
            if epoch % display_step == 0:
                loss = sess.run(cost, feed_dict=X:train_x, Y:train_y)
                print("Epoch:", epoch+1, loss:, loss, W=, sess.run(w), w, b=, sess.run(b))
                
    print( finished )
    sv.saver.save(sess, log/linear/ + "sv.cpk", global_step=epoch)

sv.stop()

(1)在设置自动保存检查点文件后,手动保存仍然有效,

(2)在运行一半后,在运行supervisor时会自动载入模型的参数,不需要手动调用restore。

(3)在session中不需要进行初始化的操作。

6.建立worker文件

新建两个py文件,设置task_index分别为0和1,其他的部分和上述的代码相一致。

strjob_name = worker
task_index = 1
  
strjob_name = worker
task_index = 0

7.运行

我们分别启动写好的三个文件,在运行结果中,我们可以看到循环的次数不是连续的,显示结果中会有警告,这是因为在构建supervisor时没有填写local_init_op参数,该参数的含义是在创建worker实例时,初始化本地变量,上述代码中没有设置,系统会自动初始化,并给出警告提示。

分布运算的目的是为了提高整体运算速度,如果同步epoch的准确率需要牺牲总体运行速度为代价,自然很不合适。

在ps的文件中,它只是负责连接,并不参与运算。

 

tensorflow简明入门教程(代码片段)

...经验丰富的数据科学家和对神经网络感兴趣的新手平台。TensorFlow是其中之一,TensorFlow是Google一年前开源的一个机器学习库。在这篇文章中,我向你介绍TensorFlow的基础知识,并且为你讲解几个在图像分类领域的TensorFlow模型。然... 查看详情

tensorflow——分布式的tensorflow运行环境(代码片段)

...行资源,而且还要花费大量时间才能完成训练。1.分布式TensorFlow的角色与原理在分布式的TensorFlow中的角色分配如下:PS:作为分布式训练的服务端,等待各个终端(supervisors)来连接。worker:在TensorFlow的代码注释中被称为终端(superv... 查看详情

分布式 TensorFlow:谁应用参数更新?

】分布式TensorFlow:谁应用参数更新?【英文标题】:DistributedTensorflow:whoappliestheparameterupdate?【发布时间】:2019-01-0807:43:35【问题描述】:我使用过TensorFlow,但对分布式TensorFlow进行训练模型还是很陌生。我的理解是,当前的最佳... 查看详情

安装 Tensorflow 和 Keras 后无法安装 Spyder

】安装Tensorflow和Keras后无法安装Spyder【英文标题】:Can\'tinstallSpyderafterinstallingTensorflowandKeras【发布时间】:2022-01-1900:04:08【问题描述】:在安装Keras和Tensorflow后,我正在努力安装Spyder(5.1.5)。以下是我目前采取的步骤:安装Anacond... 查看详情

tensorboard使用

关于TensorBoard的安装是在安装Tensorflow的过程中就已经默认安装好了,所以安装了Tensorflow就不需要再安装TensorBoard,直接使用就可以了。具体的使用方法:命令行中输入   tensorboard  --logdir=PATH这里的PATH是你的log... 查看详情

《30天吃掉那只tensorflow2.0》三tensorflow的层次结构

三、TensorFlow的层次结构我们介绍TensorFlow中5个不同的层次结构:即硬件层,内核层,低阶API,中阶API,高阶API。并以线性回归和DNN二分类模型为例,直观对比展示在不同层级实现模型的特点。TensorFlow的层... 查看详情

tensorflow分布式计算机制解读:以数据并行为重

Tensorflow是一个为数值计算(最常见的是训练神经网络)设计的流行开源库。在这个框架中,计算流程通过数据流程图(dataflowgraph)设计,这为更改操作结构与安置提供了很大灵活性。TensorFlow允许多个worker并行计算,这对必须通过处... 查看详情

tensorflow机器学习:如何正确的掌握google深度学习框架tensorflow(第二代分布式机器学习系统)?

本文标签:  机器学习TensorFlowGoogle深度学习框架分布式机器学习唐源VGGREST 服务器自2015年底开源到如今更快、更灵活、更方便的1.0版本正式发布,由Google推出的第二代分布式机器学习系统TensorFlow一直在为我们带来惊... 查看详情

tensorflow1.3.0支持分布式吗

参考技术A支持的。但是是建立在你对TensorFlow的基础操作已经熟练掌握的基础之上。 查看详情

tensorflow分布式部署单机多卡(代码片段)

让TensorFlow飞一会儿面对大型的深度神经网络训练工程,训练的时间非常重要。训练的时间长短依赖于计算处理器也就是GPU,然而单个GPU的计算能力有限,利用多个GPU进行分布式部署,同时完成一个训练任务是一个很好的办法。... 查看详情

当spark遇上tensorflow分布式深度学习框架原理和实践

近年来,机器学习和深度学习不断被炒热,tensorflow作为谷歌发布的数值计算和神经网络的新框架也获得了诸多关注,spark和tensorflow深度学习框架的结合,使得tensorflow在现有的spark集群上就可以进行深度学习,而不需要为深度学... 查看详情

tensorflow-分布式(代码片段)

概述分布式Tensorflow是由高性能的gRPC框架作为底层技术来支持的。这是一个通信框架gRPC(googleremoteprocedurecall),是一个高性能、跨平台的RPC框架。RPC协议,即远程过程调用协议,是指通过网络从远程计算机程序上请求服... 查看详情

找不到满足要求 tensorflow 的版本(来自版本:)没有为 tensorflow 找到匹配的分布

】找不到满足要求tensorflow的版本(来自版本:)没有为tensorflow找到匹配的分布【英文标题】:Couldnotfindaversionthatsatisfiestherequirementtensorflow(fromversions:)Nomatchingdistributionfoundfortensorflow【发布时间】:2019-02-2307:20:02【问题描述】:在... 查看详情

tensorflow在推荐系统中的分布式训练优化实践

总第481篇2021年第051篇美团内部深度定制的TensorFlow版本,基于原生TensorFlow1.x架构与接口,从大规模稀疏参数的支持、训练模式、分布式通信优化、流水线优化、算子优化融合等多维度进行了深度优化。在推荐系统场景中,分布式... 查看详情

分布式tensorflow采坑记

单机版的TF没毛病,但是当大家在TensorflowGithub里面找到可用的模型,想分布式跑到时候,就会跑出来各种奇怪的问题。我尝试了几种不同构造TF的方式,算是成功渡过了踩坑期,特别记录一下。如果能帮助到各位TFboy最好。方法... 查看详情

Tensorflow:分类概率分布的 KL 散度

】Tensorflow:分类概率分布的KL散度【英文标题】:Tensorflow:KLdivergenceforcategoricalprobabilitydistribution【发布时间】:2017-11-0220:04:59【问题描述】:我正在尝试使用KL散度计算我的网络的准确性。预测是一个k维概率向量,应与相同维度... 查看详情

[tensorflow系列-2]:googletensorflow简介生态环境开发架构软件架构

作者主页(文火冰糖的硅基工坊):https://blog.csdn.net/HiWangWenBing本文网址:https://blog.csdn.net/HiWangWenBing/article/details/119360465目录第1章什么是TensorFlow?第2章深度学习的软件架构第3章Tensorflow软件开发架构第4章Tensorflo 查看详情

有人让 Tensorflow 分布式培训笔记本工作吗?

】有人让Tensorflow分布式培训笔记本工作吗?【英文标题】:DoesanyonegettheTensorflowdistributedtrainingnotebooktowork?【发布时间】:2019-09-1821:16:18【问题描述】:当我运行这个从Tensorflows文档站点链接的笔记本时,https://colab.research.google.com... 查看详情