分布式TensorFlow

来源:互联网 发布:算法交易是量化 编辑:程序博客网 时间:2024/04/30 09:34

TensorFlow支持分布式计算,首先看了一下官方文档中如何配置。
官方文档中提供了下面一个例子

import tensorflow as tfc = tf.constant("Hello, distributed TensorFlow!")server = tf.train.Server.create_local_server()sess = tf.Session(server.target)sess.run(c)

一个tf.train.Server的实例封装了一系列设备和一个tf.Session目标,可以参加到分布式的训练中。一个server属于一个集群,并且和一个任务相对应。server可以和集群中其他server通信。
server.target返回的是tf.Session和这个server相连的target
create_local_server(config=None, start=True)
创建一个本地运行,单进程的集群。这个函数创建一个tf.train.Server制定了一个单进程集群,包含了一个名叫”local”的单任务。

  • client: client创建一个Tensorflow Graph,构建一个tf.Session来和cluster交互。一个client可以直接和多个server交互,一个server也可以serve多个client。
  • cluster: cluster包含多个job,每个job分为多个task。一个cluster通常为了一个较高层的目标而设计,如训练一个神经网络,并行使用多个机器等。一个cluster由tf.train.ClusterSpec定义。
  • job: 一个job由多个task组成,通常是有一个共同的目的,比如名叫”ps”(parameter server)的job通常用于存储和更新变量;名叫”worker”的job通常用于进行compute-intensive的task。一个job的任务通常在多台机器上运行。
  • Master service: 一个PRC service提供到分布式设备的入口。master service完成tensorflow::Session接口,并且负责在一个或多个”worker service”之间协调工作。
  • task: 一个task对应一个tensorflow server,通常对应一个单独的进程。一个task在它的job中有一个index。
  • tensorflow server: 一个进程运行一个tf.train.Server实例,输出一个”master service”和一个”worker service”
  • worker service: 一个PRC service用本地的设备执行graph的一部分,一个worker service完成worker_service.proto

创建cluster

TensorFlow中的cluster是指一些task,每个task对应一个server,它包含一个master,用于创建session,一个worker用来执行图中的操作。一个cluster可以被分为一个或者多个job,每个job可以包含一个或多个task。

为了创建集群,首先在集群中每个task中开启一个TensorFlow server,每个task需要完成下列工作:
1. 创建一个tf.train.ClusterSpec,描述cluster中的所有task,每个task的ClusterSpec都相同。
cluster字典描述job名字到网络地址的映射,将字典传递给tf.train.ClusterSpec的constructor。
clusterSpec
2. 创建一个tf.train.Server,将tf.train.ClusterSpec传递给constructor,并且给本地的task指定一个job名字和task index。
一个tf.train.Server对象包含一些本地的设备,一些到其他task的连接,一个tf.Session用以进行分布式计算。一个server可以和cluster中的其他server通信。
下面语句运行了一个包含两个server的cluster

# In task 0:cluster = tf.train.ClusterSpec({"local": ["localhost:2222", "localhost:2223"]})server = tf.train.Server(cluster, job_name="local", task_index=0)
# In task 1:cluster = tf.train.ClusterSpec({"local": ["localhost:2222", "localhost:2223"]})server = tf.train.Server(cluster, job_name="local", task_index=1)

Kubernetes是cluster manager
https://kubernetes.io/

在模型中指定分布式设备

可以用tf.device函数来指定

with tf.device("/job:ps/task:0"):  weights_1 = tf.Variable(...)  biases_1 = tf.Variable(...)with tf.device("/job:ps/task:1"):  weights_2 = tf.Variable(...)  biases_2 = tf.Variable(...)with tf.device("/job:worker/task:7"):  input, labels = ...  layer_1 = tf.nn.relu(tf.matmul(input, weights_1) + biases_1)  logits = tf.nn.relu(tf.matmul(layer_1, weights_2) + biases_2)  # ...  train_op = ...with tf.Session("grpc://worker7.example.com:2222") as sess:  for _ in range(10000):    sess.run(train_op)

重复训练

常见的数据并行(data parallelism)部署:一个worker job中有多项task,用来在不同的mini-batch数据上用相同的模型进行训练;ps job中也有多项任务,用于更新shared parameter。所有的task都是在不同的机器上运行。可以用以下几种方法实现:

  • In-graph replication。这种方式下,client创建一个单独的tf.Graph,包含一些参数,这些参数在tf.Variable节点中,指向/job:ps。还有模型的compute-intensive部分的多个副本,每个都指向/job:worker中的不同的task。
  • Between-graph replication。这种方式下,每个**/job:worker**task单独对应一个client,每个client创建一个想死的graph,graph中包含参数,指向/job:ps;模型的compute-intensive部分的一个副本,指向/job:worker的本地任务。
  • Asynchronous training.这种方式下,graph的每个副本单独有一个training loop,不需要coordination。
  • Synchronous training。这种方式下,所有的副本读取相同的参数值,并行地计算梯度,之后一起应用。

但还是感觉迷迷糊糊的,还是需要再找些资料看下。

0 0
原创粉丝点击