我们为大规模分布式训练与推理设计了tensorflow,但它也是足够灵活地支持实验与新的机器学习模型和系统级的优化。
该文档描述了尽可能灵活与可扩展相结合的系统结构。
tensorflow 运行时是一个交叉平台库,图1 阐明了它的通用结构,一个C API 核心运行时在不同编程语言上分离了用户层代码。
本文聚焦下列层:
图2 表明了这些组件的交互。"/job:worker/task:0"
与 "/job:ps/task:0"
是工作服务器的任务。"PS"
代表 “parameter server”: 一个对于存储与更新模型参数的任务响应。别的任务达到最优参数的时候,会发射更新到这些参数。任务之间是不需要这种特殊的任务分工,但在分布式训练中很常见。
注意到这种分布式master 和 worker 服务器只存在于分布式 tensorflow, 单处理器版本的tensorflow 包括一个特殊的部分实现–做master的一切工作,但仅与本地处理的设备通信。
以下各节将更详细地描述核心 TensorFlow layers,并逐步完成示例图的处理。
用户写客户端 tensorflow 程序来构建计算图。这个程序既可以直接由独立的操作构成,也可以使用一个方便的库如 Estimators API 来构建神经网络层与别的高层抽象。TensorFlow 支持多个客户端语言,Python. C++, 大多数的训练库依然是Python,但C++ 已经支持高效的推断环节。
Client 创建了一个 session 会话,它发射图的定义到分布式 master 作为一个 tf.GraphDef protocol buffer。当client 评估一个节点或图中的节点,评估器触发一个到分布式master的调用来初始化计算。
图3,client 已经构建好了一个图,由权值W 乘以 特征向量X,再加上偏置项 B,并保持结果到一个变量(S)
Distributed master:
因为master看到了一个步骤的整体计算,所以它应用了标准的优化,比如公共子表达式消除和常量折叠。然后,它在一组任务之间协调优化子图的执行。
一种可能的分割。
当图的边被分割成部分,分布式master 插入 send 和 receive 节点在分布式任务之间贯通信息,如图6
分布式master 这时装好图块到分布式任务上。
Worker Service
我们为运行低开销的大规模图优化工作服务器。我们的实现可以在一秒内执行成千上万个子图,保证了使大量的副本能够快速,细粒度训练步骤。工作服务器发射kernel到本都设备上,当可能时并行地运行kernels ,比如使用多个CPU核或GPU流。
我们为每一对源与目标设备类型专门写了了 Send 和 Recv 操作:
cudaMemcpyAsync()
API 传输以重叠计算与数据传输。(cudamemcpy()的非阻塞变量,在该变量中,控件将立即返回到主机线程。
为了两个任务之间传输, Tensorflow 使用对倍 protocols, 包括:
运行时包含超过200个的标准操作,包括:数学运算,数组操作,控制流,和状态管理操作。每一个这些操作可以有 kernel 为每一类设备优化实现。这当中许多操作kernels 是用 Eigen::Tensor
实现的,它是使用C++ 模板生成为多核CPU与 GPU 的高效并行代码,我们大方地使用库如 cuDNN,其是一个可能更加高效的kernel 实现。我们也实现了 quantization,其可以在一些环境更快地推断,如移动设备,高吞吐数据中心应用,和使用 gemmlowp,一个低精度的通用矩阵乘法库来加速量化计算。
如果表达一个子计算作为一个操作的组成是很难,低效的,用户可以注册额外的 kernels 来提供一个有效的C++实现,比如,我们推荐注册你们自己的 fused 融合 kernels ,为了一些性能临界操作:ReLU, Sigmoid 激活函数和其他对应的梯度。 XLA Compiler 有一个实验性的自动化 kernel 融合实现。
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删