TensorFlow——分布式的TensorFlow运行环境

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

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的文件中,它只是负责连接,并不参与运算。

原文地址:https://www.cnblogs.com/baby-lily/p/10960828.html

时间: 2024-08-30 18:15:36

TensorFlow——分布式的TensorFlow运行环境的相关文章

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

近年来,机器学习和深度学习不断被炒热,tensorflow 作为谷歌发布的数值计算和神经网络的新框架也获得了诸多关注,spark和tensorflow深度学习框架的结合,使得tensorflow在现有的spark集群上就可以进行深度学习,而不需要为深度学习设置单独的集群,为了深入了解spark遇上tensorflow分布式深度学习框架的原理和实践,飞马网于4月10日晚,邀请到先后就职于百度.腾讯,负责过多个大数据研发工作的李曙鹏老师进行线上直播,主要向我们介绍spark和深度学习的基本原理.sp

【推荐算法工程师技术栈系列】分布式&数据库--tensorflow

目录 TensorFlow 高阶API Dataset(tf.data) Estimator(tf.estimator) FeatureColumns(tf.feature_column) tf.nn tf.layers tf.train tf.linalg checkpoint(模型保存与恢复) Tensorflow Serving 官方例子 half_plus_two的例子 创建自定义镜像 架构 Source Loader Manager Servable 部署服务 模型导出 API请求(p

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

tensorflow分布式训练 博客:http://blog.csdn.net/hjimce 微博:黄锦池-hjimce   qq:1393852684 情况一.单机单卡 单机单卡是最普通的情况,当然也是最简单的,示例代码如下: #coding=utf-8 #单机单卡 #对于单机单卡,可以把参数和计算都定义再gpu上,不过如果参数模型比较大,显存不足等情况,就得放在cpu上 import tensorflow as tf with tf.device('/cpu:0'):#也可以放在gpu上 w

TensorFlow分布式部署【多机多卡】

让TensorFlow们飞一会儿 前一篇文章说过了TensorFlow单机多卡情况下的分布式部署,毕竟,一台机器势单力薄,想叫兄弟们一起来算神经网络怎么办?我们这次来介绍一下多机多卡的分布式部署. 其实多机多卡分布式部署在我看来相较于单机多卡分布式更容易一些,因为一台机器下需要考虑我需要把给每个device分配哪些操作,这个过程很繁琐.多台机器虽然看起来更繁琐,然而我们可以把每一台机器看作是一个单卡的机器,并且谷歌爸爸已经把相对复杂的函数都给封装好了,我们直接拿来用就行.为什么这么说呢?我们首先

Flink1.6系列之—分布式运行环境

Distributed Runtime Environment(分布式运行环境) Tasks and Operator Chains 在分布式执行情况下,Flink将operator subtasks 链接到一起,形成任务(task).每个任务(subtask)由一个线程执行.将operator subtasks链接到任务中是一个好处:它减少了线程到线程的切换和缓冲的开销,并在减少延迟的同时提高了总体吞吐量.链接行为是可以进行配置的;有关详细信息,请参阅此文档. 下图中有5个子任务,因此就有5个

移动端目标识别(3)——使用TensorFlow Lite将tensorflow模型部署到移动端(ssd)之Running on mobile with TensorFlow Lite (写的很乱,回头更新一个简洁的版本)

承接移动端目标识别(2) 使用TensorFlow Lite在移动设备上运行         在本节中,我们将向您展示如何使用TensorFlow Lite获得更小的模型,并允许您利用针对移动设备优化的操作. TensorFlow Lite是TensorFlow针对移动和嵌入式设备的轻量级解决方案.它支持端上的机器学习推理,具有低延迟和小二进制模型大小. TensorFlow Lite使用了许多技术,例如允许更小和更快(定点数学)模型的量化内核. 对于本节,您需要从源代码构建TensorFlow

EJB3基本概念、运行环境、下载安装与运行jboss

EJB3基本概念 什么是EJB: EJB(EnterpriceJavaBeans)是一个用于分布式业务应用的标准服务端组件模型.采用EJB架构编写的应用是可伸的.事务性的.多用户安全的.采用EJB编写的这些应用,可以部署在任何支持EJB规范的服务器平台,如Jboss.weblogic等. EJB用来干什么? EJB实际是用来编写业务层代码.如果大家对于MVC(model-view-controller)结构的应用有所了解的话,我们知道一个基于MVC结构的应用应包含显示层.控制层和业务层,假设我们

分布式HBase-0.98.3环境搭建

Hbase是一个分布式,版本化(versioned),构建在 Apache Hadoop和 Apache ZooKeeper上的列数据库.本文使用默认的Zookeeper,构造HDFS基础上的分布式Hbase. 1 安装环境 操作系统:Ubuntu-12.04 JDK版本:jdk1.7.0_51 计算机台数:2 (master:192.168.44.130   slave1:192.168.44.131) 2 预安装配置 安装Hadoop-2.2.0集群 安装SSH及设置SSH免密码登录 配置/

分布式光伏系列:分布式光伏电站 运行与维护方案一览(zz)

原文:http://www.toutiao.com/a6353487210709516546/ 中小型光伏电站的特点是占地面积小.安装位置灵活且日常维护量少.由于光伏电站不同的运行环境,为了能够使光伏发电系统更安全.更稳定的运行,提高发电效率,增加用户收益,特编制本运维手册,以便于有一定专业知识人员在条件允许的情况下对电站进行适当维护. 分布式光伏电站运维管理 1 建立完善的技术文件管理体系 技术文件主要包括: 1)建立电站的设备技术档案和设计施工图纸档案: 2)建立电站的信息化管理系统: 3)