之前15发布的白皮书初步介绍了tensorflow的整体特性,而16发布的第二篇白皮书则侧重于介绍tensorflow的设计理念。
1. Introduction
略过
2. Background & motivation
Previous system: DistBelief ,前任的不足
之前就讲过, tensorflow的前任是distblief:Googlers吸取了distblief的开发和应用经验之后重新设计、开发和实现了tensorflow。Distbelief在完成如下几个任务时很麻烦(不了解distblief的没关系,可以用caffe对号入座):
* 定义新的layer, 例如新的loss layer
* 微调训练优化算法,例如将SGD变成xxxxGD
* 定义新的优化算法,例如GAN使用的算法
还有就是, Distbelief的设计目标是大规模集群训练。而在算法开发一般都是从小规模试验性训练开始。使用distblief时,从试验到训练到部署都需要高昂的切换代价(工作量)。
Design Principles, TF的设计原则
- 细粒度的运算接口。计算图的节都是基本运算, 例如add/sub/mult等。用这些细粒度的运算可以组成更复杂的运算,如ConvRelu, Softmax等。这样可以更方便地定义新layer,而且不用自己求导数。
- 图的定义与执行分离。实现一个tensorflow程序通常分为两步: 定义graph与run graph。将这两步分离的好处是,在run之前, tf编译器可以看到整个graph,进行全局性的优化。
- 使用相同的接口操作不同的硬件。无论底层的运算硬件是CPU,GPU,TPU还是集群,使用的都是同一套graph接口(即Operation)。
Related Work
从集群训练的角度介绍了三种不同的流派:
- 单机框架,如theano,caffe
- Batch flow systems, 如SparkNet
- Parameter Servers, 如MXNet与Tensorflow
3. Tensorflow Execution Model
Dataflow graph elements
之前也介绍过, 这里的作为补充。
- Node: 由Input, Operation, Output组成
- Tensor
- Operation: node上的操作 。根据是否变化(状态属性)分为:
- 普通的Operation,如
Const
,Add
等,一旦定义好,它的node输出只与输入有关 - 可变的/有状态的Operation,主要有
Variable
与Queue
。它们的node输出是可变的,与当前程序状态有关。
- 普通的Operation,如
Partial and Concurrent Execution
Partial Execution之前也讲过。
Concurrent Execution,不同子图并发执行,提高了并发程度。
Distributed execution
主要是device分配与通信,之前也讲过。
Dynamic control flow
Tensorflow支持类似于while, if, switch等动态语句, 之前也讲过。
4. Extensibility case studies, 可拓展性
- 可自动求导,可便捷的定义新的优化算法
- 可训练(超)大模型。一些大模型, 或者一些高维运算,可能大到一个device甚至一台机器都装不下, tensorflow提供了一些解决方案。
- 通过checkpoint容错,支持恢复训练
-
集群训练时提供了三种同步方式:
- 完全异步:各自计算梯度,各自更新各自的参数
- 完全同步:将所有梯度收集起来平均,统一更新
- 忽略部分梯度:如果有些worker工作得很慢,Parameter Server不会等待下去,而是已经收集到的梯度计算平均值。以此来解决long tail问题,这应该也是Tensorflow比SparkNet快的主要原因。
5. Implementation
* Distributed Master:用户通过session与这个master交互。它负责将运算任务分成一个个的子任务交给Executor执行,还负责收集梯度更新参数
* Dataflow executor: 执行具体运算的device或机器。
其余的就略过吧,大部分之前都或多或少的讲过。
6. Evaluation
对tensorflow的性能进行衡量。
就提提单机单卡吧,caffe最慢。。。