TensorFlow架构

我们设计了TensorFlow进行大规模的分布式训练和推理,但它也足够灵活,以支持新机器学习模型和系统级优化的实验。

本文档描述了使得这种组合规模和灵活性成为可能的系统架构。它假设您对TensorFlow编程概念(如计算图,操作和会话)有基本的了解。有关 这些主题的介绍,请参阅入门。对分布式TensorFlow的熟悉程度 也将有所帮助。

本文档适用于希望扩展TensorFlow的开发人员,目前不支持当前API,希望优化TensorFlow的硬件工程师,扩展和分发机器学习系统的实施者,或任何想要查看Tensorflow引擎盖的人员。阅读完毕后,您应该了解TensorFlow架构,以便阅读和修改核心TensorFlow代码。

概观

TensorFlow运行时是一个跨平台的库。图1显示了其一般架构。AC API将不同语言的用户级代码与核心运行时分离。

图1

本文档重点介绍以下图层:

  • 客户
  • 将计算定义为数据流图。
  • 使用会话启动图执行
  • 分布式主人
  • 从图中修剪一个特定的子图,由Session.run()的参数定义。
  • 将子图划分为多个不同流程和设备中运行的子图。
  • 将图形分发到工作服务。
  • 由工作人员服务启动图形块执行。
  • 工作服务(每个任务一个)
  • 使用适用于可用硬件(CPU,GPU等)的内核实现安排图形操作的执行。
  • 发送和接收其他工作服务的操作结果。
  • 内核实现
  • 执行单个图形操作的计算。

图2说明了这些组件的相互作用。“/ job:worker / task:0”和“/ job:ps / task:0”都是带有工作服务的任务。“PS”代表“参数服务器”:负责存储和更新模型参数的任务。其他任务发送更新到这些参数,因为它们用于优化参数。任务之间的这种特殊分工是不需要的,但分布式培训是常见的。

图2

请注意,分布式主服务器和服务器服务仅存在于分布式TensorFlow中。单过程版本的TensorFlow包括一个特殊的会话实现,它执行分布式主控的所有功能,但只能与本地进程中的设备进行通信。

以下部分将更详细地介绍核心TensorFlow层,并逐步描述示例图的处理。

客户

用户编写构建计算图的客户端TensorFlow程序。该程序可以直接编写单个操作,也可以使用像Estimators API这样的便利库来组成神经网络层和其他更高层次的抽象。TensorFlow支持多种客户端语言,我们优先考虑Python和C ++,因为我们的内部用户最熟悉这些语言。随着功能变得越来越成熟,我们通常将它们移植到C ++中,以便用户可以从所有客户端语言访问优化的实现。大多数培训库仍然是Python,但是C ++确实有对高效推理的支持。

客户端创建会话,该会话将图定义作为tf.GraphDef 协议缓冲区发送到分布式主控。当客户端评估图中的一个或多个节点时,评估将触发对分布式主机的调用以启动计算。

在图3中,客户端已经构建了一个将权重(w)应用于特征向量(x)的图形,添加偏差项(b)并将结果保存在变量中。

图3

Code

分布式 master

分布式master:

  • 修剪图形以获得评估客户端请求的节点所需的子图,
  • 分割图以获得每个参与设备的图形片段,以及
  • 缓存这些片段,以便它们可以在随后的步骤中重新使用。

由于主人可以看到一个步骤的总体计算,因此它应用标准优化,如常见的子表达式消除和常量折叠。然后它协调一组任务中优化的子图的执行。

图4

图5显示了我们的示例图的可能分区。分布式主站已将模型参数分组,以便将它们放在参数服务器上。

图5

在图形边缘被分区切割的情况下,分布式主控器插入发送和接收节点以在分布式任务之间传递信息(图6)。

图6

然后,分布式主控器将图形发送到分布式任务。

图7

Code

工人服务

每个任务中的工作人员服务:

  • 处理主人的请求,
  • 为构成本地子图的操作计划内核的执行,以及
  • 调解任务之间的直接沟通。

我们优化了以较低开销运行大型图形的工作服务。我们目前的实施可以每秒执行数以万计的子图,这使得大量的副本可以进行快速,细粒度的培训步骤。工作者服务将内核分派到本地设备,并在可能的情况下并行运行内核,例如使用多个CPU内核或GPU流。

我们专门针对每种源和目标设备类型进行发送和恢复操作:

  • 本地CPU和GPU设备之间的cudaMemcpyAsync()传输使用 API来重叠计算和数据传输。
  • 两个本地GPU之间的传输使用对等DMA,以避免通过主机CPU发生昂贵的复制。

对于任务之间的传输,TensorFlow使用多种协议,包括:

  • gRPC over TCP。
  • 融合以太网上的RDMA。

我们还初步支持NVIDIA NCCL多GPU通信库(见tf.contrib.nccl)。

图8

Code

内核实现

运行时包含超过200个标准操作,包括数学,数组操作,控制流程和状态管理操作。这些操作中的每一个都可以为各种设备优化内核实现。许多操作内核使用Eigen :: Tensor实现,它使用C ++模板为多核CPU和GPU生成有效的并行代码; 然而,我们自由地使用诸如cuDNN的库,其中可以实现更有效的内核实现。我们还实现了 量化,可以在移动设备和高吞吐量数据中心应用等环境中实现更快的推理,并使用gemmlowp低精度矩阵库来加速量化计算。

如果将子计算表示为操作组合是困难或无效的,用户可以注册提供以C ++编写的高效实现的其他内核。例如,我们建议您为一些性能关键的操作注册自己的融合内核,例如ReLU和Sigmoid激活功能及其相应的渐变。该XLA编译器有一个实验实现自动内核融合。

Code

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏微信终端开发团队的专栏

移动客户端多音字搜索

本文重点讲述微信安卓客户端在 SQLite FTS5 的基础上,多音字问题的解决方案。

99521
来自专栏aCloudDeveloper

初识The ONE

Author:bakari  Date:2014.1.14       本学期开始做真正意义上的研究,主要方向为wireless and mobile netw...

1986
来自专栏张善友的专栏

负载均衡的基本算法

负载均衡的基本算法,主要有以下几种(参考F5产品): 随机:负载均衡方法随机的把负载分配到各个可用的服务器上,通过随机数生成算法选取一个服务器,然后把连接发送给...

2187
来自专栏拂晓风起

cocos2d-js 越来越慢的定时器schedule 制作不变慢的定时器

1014
来自专栏代码GG之家

Android 启动过程框架

一张图 纵横世界 ,给你一个完整的android启动过程框架 ,还你一个清晰明了的思路。 ? 觉得太花哨,那就来个黑白版: ? android本...

1966
来自专栏智能计算时代

Envoy架构概览(5):负载均衡

负载均衡 当过滤器需要获取到上游群集中主机的连接时,群集管理器使用负载平衡策略来确定选择哪个主机。 负载平衡策略是可插入的,并且在配置中以每个上游集群为基础进行...

3267
来自专栏瓜大三哥

串口通信控制器的Verilog HDL实现(四) 接收模块的Verilog HDL 实现

但凡涉及到双方通信的系统,接收机的复杂度往往都是高于发送机的,对于串口通信系统也如此。在接收系统中,起始状态和数据都需要依靠接收端检测得到,为了避免毛刺影响,...

1915
来自专栏美团技术团队

人工智能在线特征系统中的数据存取技术

一、在线特征系统 主流互联网产品中,不论是经典的计算广告、搜索、推荐,还是垂直领域的路径规划、司机派单、物料智能设计,建立在人工智能技术之上的策略系统已经深入到...

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

Nebula3中的Jobs子系统

1032
来自专栏美团技术团队

人工智能在线特征系统中的生产调度

前言 在上篇博客《人工智能在线特征系统中的数据存取技术》中,我们围绕着在线特征系统存储与读取这两方面话题,针对具体场景介绍了一些通用技术,此外特征系统还有另一个...

37310

扫码关注云+社区