一、架构概览

TensorFlow 的系统结构以 C API 为界,将整个系统分为前端和后端两个子系统:

前端系统:提供编程模型,负责构造计算图;

后端系统:提供运行时环境,负责执行计算图,后端系统的设计和实现可以进一步分解为 4 层;

  1. 运行层:分别提供本地模式和分布式模式,并共享大部分设计和实现;

  2. 计算层:由各个 OP 的 Kernel 实现组成;在运行时,Kernel 实现执行 OP 的具
      体数学运算;

  3. 通信层:基于 gRPC 实现组件间的数据交换,并能够在支持 IB 网络的节点间实
      现 RDMA 通信;

  4. 设备层:计算设备是 OP 执行的主要载体,TensorFlow 支持多种异构的计算设备
      类型。

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

1. 表达图:构造计算图,但不执行图;

2. 编排图:将计算图的节点以最佳的执行方案部署在集群中各个计算设备上执行;

3. 运行图:按照拓扑排序执行图中的节点,并启动每个 OP 的 Kernel 计算。

二、主要模块

Client

前端系统主要组成部分,用于构造计算图,支持多种语言,python 的 API 最为完善。

注意本部仅仅构造计算图,不执行计算图,后面和后台计算引擎建立 Session 后,以之为桥梁,建立 Client 与 Master 的通道,将 Protobuf 格式的 GraphDef 序列化后传给 Master,才能启动图的执行计算过程。

Master

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

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

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

Worker

对于每一个任务,TensorFlow 都将启动一个 Worker 实例。Worker 主要负责如下 3 个方面的职责:

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

首先,Worker 收到 Master 发送过来的图执行命令,此时的计算图相对于 Worker 是完整的,也称为
Full Graph,它对应于 Master 的一个 Graph Partition。随后,Worker 根据当前可用的硬件环境,包括
(GPU/CPU) 资源,按照 OP 设备的约束规范,再将图分裂(SplitByDevice)为多个 Graph
Partition;其中,每个计算设备对应一个 Graph Partition。
接着,Worker 启动所有的 Graph Partition 的执行。最后,对于每一个计算设备,Worker将按照计算图中节点之间的依赖关系执行拓扑排序算法,并依次调用 OP 的 Kernel 实现,完成 OP 的运算 ( 一种典型的多态实现技术 ) 。

其中,Worker 还要负责将 OP 运算的结果发送到其他的 Worker 上去,或者接受来自其他 Worker 发送给它的运算结果,以便实现 Worker 之间的数据交互。TensorFlow 特化实现了源设备和目标设备间的 Send/Recv。

1. 本地 CPU 与 GPU 之间,使用 cudaMemcpyAsync 实现异步拷贝;
2. 本地 GPU 之间,使用端到端的 DMA 操作,避免主机端 CPU 的拷贝。

对于任务间的通信,TensorFlow 支持多种通信协议。

1. gRPC over TCP;

2. RDMA over Converged Ethernet。

『TensorFlow Internals』笔记_系统架构的更多相关文章

  1. 『TensorFlow Internals』笔记_源码结构

    零.资料集合 知乎专栏:Bob学步 知乎提问:如何高效的学习 TensorFlow 代码?. 大佬刘光聪(Github,简书) 开源书:TensorFlow Internals,强烈推荐(本博客参考书 ...

  2. 『TensorFlow × MXNet』SSD项目复现经验

    『TensorFlow』SSD源码学习_其一:论文及开源项目文档介绍 『TensorFlow』SSD源码学习_其二:基于VGG的SSD网络前向架构 『TensorFlow』SSD源码学习_其三:锚框生 ...

  3. [开发笔记usbTOcan]系统架构设计

    SYS.3 | 系统架构设计 系统架构设计过程的目的是建立一个系统体系结构设计,并确定哪些系统需求分配给系统的哪些元素,并根据确定的标准评估系统架构. 系统结构设计需要做一下工作: 开发系统架构设计. ...

  4. Android源码笔记——Camera系统架构

    Camera的架构与Android系统的整体架构保持一致,如下图所示,本文主要从以下四个方面对其进行说明. Framework:Camera.java Android Runtime:android_ ...

  5. 『练手』001 Laura.SqlForever架构基础(Laura.XtraFramework 的变迁)

    001 Laura.SqlForever架构的基础(Laura.XtraFramework 的变迁之路) Laura.XtraFramework 到底是 做什么的? Laura.XtraFramewo ...

  6. Laravel5.1学习笔记i14 系统架构6 Facade

    Facades 介绍  使用 Facades Facade 类参考   #介绍 Facades provide a "static" interface to classes th ...

  7. Laravel5.1学习笔记12 系统架构4 服务容器

    Service Container 介绍 绑定的用法  绑定实例到接口 上下文绑定 标签 解析 容器事件 #介绍 The Laravel service container is a powerful ...

  8. Laravel5.1学习笔记13 系统架构5 Contract

    Contract 简介 为什么要用 Contract? Contract 参考 如何使用 Contract 简介 Laravel 中的 Contract 是一组定义了框架核心服务的接口.例如,Illu ...

  9. Laravel5.1学习笔记11 系统架构3 服务提供者

    服务提供者 简介 写一个服务提供者 Register注册方法 Boot 方法 注册提供者 缓载提供者 简介 Service providers are the central place of all ...

随机推荐

  1. HDU 5938 Four Operations(乱搞)题解

    题意:把'+', '-', '*' 和'/'按顺序插入任意两数字间隔,使得操作得到后计算后最大. 思路:没想到是个水题,打的时候想得太复杂了.这道题其实只要考虑*和/.显然我们要把a*b/c弄到最小. ...

  2. 【Dalston】【第七章】分布式链路跟踪(Sleuth)

    当我们进行微服务架构开发时,通常会根据业务来划分微服务,各业务之间通过REST进行调用.一个用户操作,可能需要很多微服务的协同才能完成,如果在业务调用链路上任何一个微服务出现问题或者网络超时,都会导致 ...

  3. SSM到Spring Boot从零开发校园商铺平台

    项目目的 特别 由于准备春招,所以希望各位看客方便的话,能去github上面帮我Star一下项目 https://github.com/Draymonders/Campus-Shop emmm, 已经 ...

  4. 4-Three-Matterhorn man

    What was the main objective of early mountain climbers?   ①Modern alpinists try to climb mountains b ...

  5. vs项目的属性页面总结

    本文主要针对vs中属性页面的相关选项含义进行了总结.

  6. ege demo

    #include <ege.h> const float base_speed = 0.5f; const float randspeed = 1.5f; //自定义函数,用来返回一个0 ...

  7. Spring boot 整合JSP开发步骤

    1. 新建Springboot项目,war <dependency> <groupId>org.springframework.boot</groupId> < ...

  8. python发送requests请求时,使用登录的token值,作为下一个接口的请求头信息

    背景介绍: 发送搜索请求时,需要用到登录接口返回值中的token值 代码实现: 登录代码: 搜索接口:

  9. python入门知识点(上)

    1.硬件系统: 主机部分: 1.中央处理器(CPU): 电脑的大脑 运算器: 数值计算和逻辑判断 控制器: 可以电脑中的各个部件协同工作 2.内部存储器: 随机存储器:内存条 使用电信号表示数据; 特 ...

  10. 【LeetCode】28. Implement strStr() (2 solutions)

    Implement strStr() Implement strStr(). Returns a pointer to the first occurrence of needle in haysta ...