Tensorflow系统架构

写在前面

最近在学习Tensorflow分布式运行机制的实现,因此,对Tensorflow的系统架构和源码有初步的了解。想把这个学习过程给记录一下,这篇博客就是整个学习过程记录的开端。后续会继续写新的博客,也请大家多多指教。

关于TF

TensorFlow™是一个基于数据流编程(dataflow programming)的符号数学系统,提供了丰富的深度学习相关的API,支持Python和C++接口,被广泛应用于各类机器学习(machine learning)算法的编程实现,其前身是谷歌的神经网络算法库DistBelief。

TensorFlow托管在GitHub平台,由谷歌人工智能团队谷歌大脑(Google Brain)开发,与contributors共同维护。自2015年11月9日起,TensorFlow依据阿帕奇授权协议(Apache 2.0 open source license)开放源代码。

Tensorflow提供了可视化分析工具Tensorboard,方便分析和调整模型,支持Linux平台、Windows平台、Mac平台,甚至是手机移动设备。其依赖视图如下所示。
Tensorflow系统架构_第1张图片

系统架构

如下图所示,TensorFlow 的系统架构以C API 为界,将整个系统分为前端和后端两个子系统。

  • 前端系统:提供编程模型,负责构造计算图;
  • 后端系统:提供运行时环境,负责执行计算图。

TensorFlow 的系统设计遵循良好的分层架构,后端系统的设计和实现可以进一步分解为4 层。

  • 运行层:分别提供本地模式和分布式模式,并共享大部分设计和实现;
  • 计算层:由各个OP 的Kernel 实现组成;在运行时,Kernel 实现执行OP 的具体数学运算;
  • 通信层:基于gRPC 实现组件间的数据交换,并能够在支持IB 网络的节点间实现RDMA 通信;
  • 设备层:计算设备是OP 执行的主要载体,TensorFlow 支持多种异构的计算设备类型。

Tensorflow系统架构_第2张图片
从图操作的角度看待系统行为,TensorFlow 运行时就是完成计算图的构造、编排、及其运行。

  1. 表达图:构造计算图,但不执行图;
  2. 编排图:将计算图的节点以最佳的执行方案部署在集群中各个计算设备上执行;
  3. 运行图:按照拓扑排序执行图中的节点,并启动每个OP 的Kernel 计算。

Client

Client 是前端系统的主要组成部分,它是一个支持多语言的编程环境。Client 基于TensorFlow 的编程接口,构造计算图。目前,TensorFlow 支持Python 和C++ 的编程接口较为完善,尤其对Python 的API 支持最为全面。并且,对其他编程语言的API 支持日益完善。

此时,TensorFlow 并未执行任何的图计算,直至与后台计算引擎建立Session,并以Session 为桥梁,建立Client 与Master 之间的通道,并将Protobuf 格式的GraphDef 序列化后传递给Master,启动计算图的执行过程。

Master

Client 执行Session.run 时,传递整个计算图给后端的Master。此时,计算图是完整的,常称为Full Graph。随后,Master 根据Session.run 传递给它的fetches, feeds 参数列表,反向遍历Full Graph,并按照依赖关系,对其实施剪枝,最终计算得到最小的依赖子图,常称为Client Graph。

接着,Master 负责将Client Graph 按照任务的名称分裂(SplitByTask) 为多个GraphPartition;其中,每个Worker 对应一个Graph Partition。随后,Master 将Graph Partition分别注册到相应的Worker 上,以便在不同的Worker 上并发执行这些Graph Partition。最后,Master 将通知所有Worker 启动相应Graph Partition 的执行过程。

其中,Worker 之间可能存在数据依赖关系,Master 并不参与两者之间的数据交换,它们两两之间互相通信,独立地完成交换数据,直至完成所有计算。

Worker

Worker 主要负责如下3 个方面的职责:

  1. 处理来自Master 的请求;
  2. 对注册的Graph Partition 按照本地计算设备集实施二次分裂( SplitByDevice),并通知各个计算设备并发执行各个Graph Partition;
  3. 按照拓扑排序算法在某个计算设备上执行本地子图,并调度OP 的Kernel 实现;
  4. 协同任务之间的数据通信。

对于任务间的通信,TensorFlow 支持1) gRPC over TCP;2)RDMA over Converged Ethernet这两种通信协议。

kernel

TF中包含大量Op算子,这些算子组成Graph的节点集合。这些算子对Tensor实现相应的运算操作,kernel负责执行Op的具体运算。下图是TF中Op算子的分类和举例。
Tensorflow系统架构_第3张图片
其中,大多数Kernel 基于Eigen::Tensor 实现。Eigen::Tensor 是一个使用C++ 模板技术,为多核CPU/GPU 生成高效的并发代码。但是,TensorFlow 也可以灵活地直接使用cuDNN, cuNCCL, cuBLAS 实现更高效的Kernel。

Tensorflow代码

对于TF的源码,我才刚开始看,主要关注的部分也是Tensorflow的分布式实现,所以了解也不是很多,贴出其目录组织如下图。
Tensorflow系统架构_第4张图片

你可能感兴趣的:(分布式机器学习系统)