TF Boy 之初筵 - 分布十三式

我们在 " 机器学习平台的优化器 (平台篇优化篇)" 里面提到TensorFlow (TF) 速度的成为深度学习的武林第一大帮。 博士好友清华,在这方面也颇有修炼, 谓之TFBoy。

登堂入室,在TF帮占有一席, 修成TF Boy, 有两个方面,一个是丹炉, 另一个是丹方。 出入门庭,这里主要诱惑你进入太上老君的丹炉 。。。

( from 云戒 )

前言

TensorFlow 是两个词, Tensor可以分成物理上的张量, 和计算机里面的张量。 物理上的Tensor是对向量的除了矩阵之外的,又一种扩展。 是微分几何里面的基础框架。

计算机的张量是对多维数据的一种组织方式, 是对表数据, 时间序列数据, 面板数据的一种扩展。

Flow 是图, 把各种输入组织成Tensor, 然后让Tensor流过各个单元。 不同单元又个可以组织成层(Layer), 功能模块(Trainer)等等。

TensorFlow正如它的名字一样,就是这么架构出来的。

在开始介绍之前, 假设你已经安装了TensorFlow了, 如果你想从源码安装可以参考 "Install TensorFlow in Ubuntu 16.04.1 LTS" 。 目前TensorFlow的安装越来越简单了。 目前TF 1.2 版本已经发布了。

分布式TF

分布式MNIST例子跑起来

看完简单的, 我们看一下, TF最新代码的样子。 大家在安装完成TF之后可以试着跑一下 mnist_replica.py 这个分布式TF的例子。 ( https://github.com/tensorflow/tensorflow/blob/master/tensorflow/tools/dist_test/python/mnist_replica.py )。 可以在同一个机器上模拟, 运行方式如下:

1. 运行PS服务器 ( Parameter Server ) :

python mnist_replica.py --job_name ps

2. 运行两个分布式工作端( Worker ) :

python mnist_replica.py --job_name worker --task_index 0 --train_steps 30000

python mnist_replica.py --job_name worker --task_index 1 --train_steps 30000

跑完之后, 你可以看到, 两个Worker可以共同更新,你可以看到他们交替更新global step。

一共设置了30000部, 我们对比一下, 单机情况下的时间消耗。 2个Worker跑需要79秒时间。 而1个Worker跑需要90秒时间。 由于单机两个进程本来就存在竞争关系。 所以效果不是很明显。 但是你可以看到分布式是可以节省时间的。 但是之间的通信也是要话费时间的。

2个Worker,各花了79秒和77秒。

1个Worker,花了90秒。

参数服务器配置

这个mnist_replica.py 是典型的参数服务器 + 模型复制 的情景:

如果你需要在不同机器上测试, 你需要修改参数的, 目前在同一个机器上, 多进程模拟的话, IP地址全是localhost, 采用不同的Socket端口,PS:2222, Worker task_index 0 : 2223, task_index 1: 2224 。

flags.DEFINE_string("ps_hosts", "localhost:2222",
                    "Comma-separated list of hostname:port pairs")
flags.DEFINE_string("worker_hosts", "localhost:2223,localhost:2224",
                    "Comma-separated list of hostname:port pairs")

代码框架认识

第一部分: 引入tensorflow的library。 这里很简单。

第二部分:参数定义。 在TF1.2里面, 利用tf.app的flags接口可以定义各种类型的参数。

Flag的参数定义形式如下:

第三部分:数据读取和参数确认。

第四部分:ClusterSpec定义。 分布式TF运行需要定义好机器簇(Cluster)。 这部分是对于PS和Worker,都需要知道的。 如果,如果运行是"--job_name ps",那么server.join(),就开启端口,等待Worker运行。

第五部分: 设备配置。 对于Worker,需要根据任务分配GPU, 一旦定义号了服务器,就可以在 tf.device( 定义清楚 cluster 和 ps 和worker 和模型的replica_device_setter。

第六部分:模型定义。 这里定义了MLP, 一层隐含层Hidden Layer。 一层输出层Softmax Layer。 在隐含层, 需要定义hid_w 和 hid_b两个Tensor ( Variable 类型 )。 同样在输出层, 也需要定义sm_w 和 sm_b两个Tensor 是 Variable ( Variable 类型 )。 同时还需要定义输出数据X 和 输入验证 Y。 这也是定义了两个Tensor ( Placeholder 类型 )。

从上面我们可以看到, 隐含层用的激活函数是relu ( ), 而输出层的激活函数是softmax(), 距离公式是用的cross_entropy 。

第七部分:定义优化器。 默认就是使用Adam优化器 (参考 机器学习平台的优化器 (优化篇))。 但是如果在Adam基础上加上同步锁SyncReplicasOptimzer, 也是可以的。 这样印证了我们在前面优化器里面讲的, 分布式优化算法实现并不多。 而是采用了分布式加锁的方式。 现在是不是看到更清楚了。

第八部分: 优化、变量、空间 初始化。 优化器,变量和训练目录需要初始化。

第九部分: 定制训练的Supervisor。Supervisor是TF1.1里面对训练跟踪可视化的一个封装。 这样可以用来跟踪可视化训练过程。训练完成后,可以利用 TensorBoard来展示Supervisor跟踪到的训练信息。

第十部分: Session配置。 对于分布式情况下的Session配置稍微复杂。 Session是指 一次运行训练事务的启动、运行、管理的流程 。 但是具体什么是Session,我们后续说明。

第十一部分:循环调度。 我们知道GD算法基本都是循环迭代求优的过程。 那么每个Worker什么时间停止呢? 在Session的管理中,就要指明数据和运行步骤的情况。

在这里要注意的, 对于不同的Worker的话, Session配置可以不一样的。 就算Session的程序是一样的, 但是参数也可以不一样的。 例如, 我们可以让两个Worker的训练步骤不一致。 那么前30000步,两个Worker同时迭代的训练。

python mnist_replica.py --job_name worker --task_index 0 --train_steps 40000

python mnist_replica.py --job_name worker --task_index 1 --train_steps 30000

但是一旦到了30000步的时候, task_index 1的worker就停止了。

第十二部分: 输出结果验证信息。

第十三部分: tf.app启动。 会自动找到对应的main函数作为入口, 还会自动解析对应参数配置

flags = tf.app.flags
def main(unused_argv):

至此, 我们利用 分布十三式 (太极十三式) 完成了最酷的分布式TensorFlow的解读!

但是,这里的tf.app包是从1.0开始引入的 , tf.app.flags, tf.app.run ( ). 还有Supervisor 和 Estimator 这两个大类, 是收到Scikit-learn的影响, 对TensorFlow底层接口的封装, 以达到简单应用的效果。 再加上分布式的参数服务器PS+Worker的配置, 就可以搞定分布式TF了。 如何发展到这一步的, 具体细节我们后续解释。

小结:

直接给出了TF最好玩的分布式的例子的解释。 以后记住分布十三式。 基本上可以入门到TF Boy之庭了。

参考:

http://www.jianshu.com/p/5df664260056

原文发布于微信公众号 - AI2ML人工智能to机器学习(mloptimization)

原文发表时间:2017-07-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏图形学与OpenGL

实验2 关系可视化

启动RStudio后,菜单栏点击Tools>Install Packages…中输入ggplot2,安装;

17020
来自专栏ATYUN订阅号

使用多种工具组合进行分布式超参数优化

在这篇文章中,我介绍如何使用工具组合来加速超参数优化任务。这里提供了Ubuntu的说明,但可以合理地应用于任何*nix系统。

17140
来自专栏ATYUN订阅号

防止在训练模型时信息丢失 用于TensorFlow、Keras和PyTorch的检查点教程

如果你玩过电子游戏,你就会明白为什么检查点(chekpoint)是有用的了。举个例子,有时候你会在一个大Boss的城堡前把你的游戏的当前进度保存起来——以防进入...

63350
来自专栏用户2442861的专栏

Caffe中LMDB的使用

http://rayz0620.github.io/2015/05/25/lmdb_in_caffe/

33310
来自专栏磐创AI技术团队的专栏

Tensorboard 详解(上篇)

25030
来自专栏racaljk

2017第八届蓝桥杯决赛(C++ B组)4.发现环

小明的实验室有N台电脑,编号1~N。原本这N台电脑之间有N-1条数据链接相连,恰好构成一个树形网络。在树形网络上,任意两台电脑之间有唯一的路径相连。 不过在最...

27240
来自专栏marsggbo

Udacity并行计算课程笔记-The GPU Programming Model

一、传统的提高计算速度的方法 faster clocks (设置更快的时钟) more work over per clock cycle(每个时钟周期做更多的...

27770
来自专栏专知

Tensorflow Eager Execution入门指南

本文介绍了最新版的Tensorflow 1.7的功能及其使用方法,重点介绍其中最有趣的功能之一eager_execution,它许用户在不创建静态图的情况下运行...

572130
来自专栏量子位

TensorFlow 1.2正式发布,新增Python 3.6支持

王小新 编译整理 量子位 出品 | 公众号 QbitAI TensorFlow 1.2.0今日正式发布。 主要功能和改进点: 在Windows系统下新增对Pyt...

35640
来自专栏逍遥剑客的游戏开发

Nebula3绘制基本图元

14860

扫码关注云+社区

领取腾讯云代金券