Tensorflow系统架构一览

325 阅读4分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。 Tensorflow提供了可视化分析工具Tensorboard,方便分析和调整模型,支持Linux平台、Windows平台、Mac平台,甚至是手机移动设备。

TensorFlow基于分层和模块化的设计思想进行开发设计。TensorFlow的运行库是一个跨平台的库,下图表示了它的通用结构。一个基于C的API底层分隔开了不同的用户级的代码,这些代码可以是来自于核心运行库中的多种语言的,如常用的python,c++等,包括近期的tensorflow.js。

image.png

TensorFlow的C语言API是核心组件和用户代码的分界,其它组件/API均通过C语言API与核心组件进行交互。以 C API 为界,将整个系统分为前端和后端两个子系统。前端系统提供编程模型,负责构造计算图;后端系统提供运行时环境,负责执行计算图。

  1. 前端系统

前端也就是用户端(client)。通常情况下用户只会关心模型的图该怎么构建,这个时就可以采用TensorFlow的Client进行计算图的搭建。TensorFlow不仅支持直接用分立的操作符进行组装构建模型,而且可以利用一些方便的库,如Estimation APIs等组装出一个神经网络和其他更加高阶的抽象的网络。TensorFlow由C写成,但是用C构造复杂的模型并且调试也非常麻烦,因此TensorFlow封装出了多种面向客户的客户机语言,用于简单明了地构建计算图。TF支持多种用户机语言,优先推荐的是python和c++,前者适合制作模型的原型,后者适合部署模型。目前尽管大部分的训练库都还只有python的接口,但是C+ + 确实是支持更为高效的实现的。

用户端(client)负责创建一个对话,而对话可以通过tf.GraphDef协议,将计算图的定义发送到分布式主机中。当client需要计算一个节点的值的时候,这个计算过程将会触发一个对分布式主机的调用,用于初始化这个计算过程。如下图所示,这个client构建了一个应用了权值w和特征向量x的计算图,并且加上了一个偏置项b,并且将其保存在一个变量中。

  1. 后端系统

分布式TensorFlow的核心组件(core runtime)包括分发中心(distributed master)、执行器(dataflow executor/worker service)、内核应用(kernel implementation)和最底端的设备层(device layer)、网络层(networking layer)。

(1) 分发中心(distributed master)

分发中心从输入的数据流图中剪取子图(subgraph),将其划分为操作片段并启动执行器。分发中心处理数据流图时会进行预设定的操作优化,包括公共子表达式消去(common subexpression elimination)、常量折叠(constant folding)等。

(2) 执行器(dataflow executor/worker service)

执行器负责图操作(graph operation)在进程和设备中的运行、收发其它执行器的结果。分布式TensorFlow拥有参数器(parameter server)用来汇总和更新其它执行器返回的模型参数。执行器在调度本地设备时会选择进行并行计算和GPU加速。

(3) 内核应用(kernel implementation)

内核应用负责单一的图操作,包括数学计算、数组操作(array manipulation)、控制流(control flow)和状态管理操作(state management operations)。内核应用使用Eigen执行张量的并行计算、cuDNN库等执行GPU加速、gemmlowp执行低数值精度计算,此外用户可以在内核应用中注册注册额外的内核(fused kernels)以提升基础操作,例如激励函数和其梯度计算的运行效率。

(4) 最底端的设备层(device layer)/网络层(networking layer)。

设备管理层包括 TensorFlow 分别在 CPU、GPU、FPGA 等设备上的实现,也就是对上层提供了一个统一的接口,使上层只需要处理卷积等逻辑,而不需要关心卷积在硬件上的实现过程。网络通信层包括个gRPC(google Remote Procedure Call Protocol)和远程直接数据存取(Remote DirectMemory Access,RDMA),在分布式计算时这些需要用到的。