分布式 TensorFlow代码实现

  • Post author:
  • Post category:其他


通过多 GPU 并行的方式可以获得较好的加速计算的效果,但一台机器上能够安装的 GPU 是有限的,如果需要进一步提升深度学习模型的训练 速度,可以采用分布式运行TensorFlow 的方式将模型放在多台机器上进行 训练。TensorFlow 的分布式并行基于 gRPC通信框架。在一个分布式的运行环 境下,有一个 Master 负责创建和维护 Session,还有多个 Worker 负责执行计 算图中的运算,如下图。TensorFlow 集群将 TensorFlow 计算图中的运算描述为一系列的任务 (Task)。一般来说,每一个任务会对应到一台单独的机器(例外是,当使用一台机器上的不同 GPU 时,不同的 Task 可以使用不同的 GPU)。Tensor Flow 中的任务(Task)会被聚合成工作 Oob), 一个 Job 是指一 类特定的任务,例如 Parameter Server (参数服务器, PS)或者 Worker,每 一个Job 可以包含一个或者多个 Task。为了能通过程序的方式管理一系列 的任务,我们需要先创建一个 TensorFlow 中的 Cluster (集群)对象。Cluster 对象通过 TensorFlow 的位ain.ClusterSpec 类来初始化,这个类的 构造函数只有一个参数,该参数的取值通常会被赋予一个 Python 中的 diet (字典〉 。对于这个字典形式的参数值,键就是工作名,值就是不同机器的 E 地址。在得到创建的 Cluster (集群)对象之后,我们还需要根据集群对象的配置生成 Server (使用 TensorFlow 提供的train.Server 类)。以在本地(端口分别为 2222 和 2223 )运行有两个任务的 TensorFlow 集群为例,我们创建第一个任务:

在这里插入图片描述

在上面这段代码中,初始化 ClusterSpec 类时创建的两个任务同属于工作“local”。接下来,对于这个 local(或者说是 cluster),我们设置 server= tf.train.Server(cluster, job_ name=”local”,task_index=0 )表示将这台机器的job 定义为 local,并且是 local 工作中的第 0 台机器( task_index=0,这里采用本地的两个端口模拟两台机器,并且假设一个任务对应于一个机器〉。仿照创建第一个任务的思路,下面创建第二个任务。在创建第二个任务的代码中,与创建第一个任务的代码不同的是,task_index被设置为 1 。

在这里插入图片描述

只运行定义了第一个任务的 Python 代码文件,控制台会持续地输出一 些提示信息,这些信息提示的是“会话的创建正在等待来自 task1 的响应”。输出的信息如下:

在这里插入图片描述

运行定义了第二个任务的 Python 代码文件,这就相当于启动了第二个任务。当第二个任务启动之后,可以看到在第一个任务和第二个任务的控制台都会打印出常量 c 的运行结果(“1”)。同理,如果只运行定义了第二个任务的 Python 代码文件,控制台也会 持续输出一些提示信息,这些信息提示的是“会话的创建正在等待来自 task0 的响应”。

在上面的样例中只定义了一个工作“ local”,但一般在使用分布式训练深度学习模型时,有两个重要的工作需要被明确定义。参数服务器是其中的一个工作,专门负责存储、获取以及更新变量的取值。另外一个工作负责运行反向传播算法来计算得到参数的梯度,习惯上称之为 Worker 或者称为计算服务器)。

关注小鲸融创,一起深度学习金融科技!

在这里插入图片描述



版权声明:本文为Ftwhale原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。