网站开发项目启动成本,建行官方网站多少钱,简要列举网站常见类型,如何在百度上添加自己的店铺一、简介
使用单台机器或者单个GPU/CPU来进行模型训练#xff0c;训练速度会受资源的影响#xff0c;因为毕竟单个的设备的计算能力和存储能力具有一定的上限的#xff0c;针对这个问题#xff0c;TensorFlow支持分布式模型运算#xff0c;支持多机器、多GPU、多CPU各种模…一、简介
使用单台机器或者单个GPU/CPU来进行模型训练训练速度会受资源的影响因为毕竟单个的设备的计算能力和存储能力具有一定的上限的针对这个问题TensorFlow支持分布式模型运算支持多机器、多GPU、多CPU各种模型的组合运行方案的设计。(默认情况下TensorFlow程序会将程序运行在第一个GPU上如果有GPU并且安装的TensorFlow支持GPU运行)
TensorFlow的分布式支持单机多GPU、单机GPUCPU、多机GPU等结构不过所有结构的构建方式基本类似。
除了TensorFlow外Caffe、DeepLearning4j等也支持分布式训练TensorFlow中的集群(Cluster)指的是一系列能够对TensorFlow中的图(graph)进行分布式计算的任务(task)。每个任务是同服务(server)相关联的。TensorFlow中的服务会包含一个用于创建session的主节点和至少一个用于图运算的工作节点。另外在TensorFlow中一个集群可以被拆分为一个或者多个作业(job)每个作业可以包含至少一个任务。
cluster(集群)、job(作业)、task(任务)三者可以简单的看成是层次关系task可以看成每台机器上的一个进程多个task组成jobjob又有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.3Synchronous Training
在同步训练中每个graph的副本读取相同的parameter值并行的计算然后将计算完的结果放到一起处理。在TensorFlow中如果是Betweengraph replication的情况下可以通tf.train.SyncReplicasOptimizer来处理如果是In-graph replication情况下直接对结果进行处理即可(比如平均).
3.4Asynchronous 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_valuework, docstringOne of ps or work)
tf.app.flags.DEFINE_integer(task_index, default_value0, docstringIndex of task within the job)
FLAGS tf.app.flags.FLAGS# 2. 启动服务
def main(_):print(FLAGS.job_name)server tf.train.Server(cluster,job_nameFLAGS.job_name,task_indexFLAGS.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(targetgrpc://127.0.0.1:33335,configtf.ConfigProto(log_device_placementTrue,allow_soft_placementTrue)) as sess:print(sess.run(y))
执行
1、通过命令行进入对应环境进入server-demo.py所在文件夹重复打开5个分别输入虽然最后结果只是在最后3335中显示但是必须要全部运行才能运算出结果
python server-demo.py --job_nameps --task_index0python server-demo.py --job_nameps --task_index1python server-demo.py --job_namework --task_index0python server-demo.py --job_namework --task_index1python server-demo.py --job_namework --task_index2
2、运行客户端最后结果如下