『TensorFlow Internals』笔记_系统架构
一、架构概览
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』笔记_系统架构的更多相关文章
- 『TensorFlow Internals』笔记_源码结构
零.资料集合 知乎专栏:Bob学步 知乎提问:如何高效的学习 TensorFlow 代码?. 大佬刘光聪(Github,简书) 开源书:TensorFlow Internals,强烈推荐(本博客参考书 ...
- 『TensorFlow × MXNet』SSD项目复现经验
『TensorFlow』SSD源码学习_其一:论文及开源项目文档介绍 『TensorFlow』SSD源码学习_其二:基于VGG的SSD网络前向架构 『TensorFlow』SSD源码学习_其三:锚框生 ...
- [开发笔记usbTOcan]系统架构设计
SYS.3 | 系统架构设计 系统架构设计过程的目的是建立一个系统体系结构设计,并确定哪些系统需求分配给系统的哪些元素,并根据确定的标准评估系统架构. 系统结构设计需要做一下工作: 开发系统架构设计. ...
- Android源码笔记——Camera系统架构
Camera的架构与Android系统的整体架构保持一致,如下图所示,本文主要从以下四个方面对其进行说明. Framework:Camera.java Android Runtime:android_ ...
- 『练手』001 Laura.SqlForever架构基础(Laura.XtraFramework 的变迁)
001 Laura.SqlForever架构的基础(Laura.XtraFramework 的变迁之路) Laura.XtraFramework 到底是 做什么的? Laura.XtraFramewo ...
- Laravel5.1学习笔记i14 系统架构6 Facade
Facades 介绍 使用 Facades Facade 类参考 #介绍 Facades provide a "static" interface to classes th ...
- Laravel5.1学习笔记12 系统架构4 服务容器
Service Container 介绍 绑定的用法 绑定实例到接口 上下文绑定 标签 解析 容器事件 #介绍 The Laravel service container is a powerful ...
- Laravel5.1学习笔记13 系统架构5 Contract
Contract 简介 为什么要用 Contract? Contract 参考 如何使用 Contract 简介 Laravel 中的 Contract 是一组定义了框架核心服务的接口.例如,Illu ...
- Laravel5.1学习笔记11 系统架构3 服务提供者
服务提供者 简介 写一个服务提供者 Register注册方法 Boot 方法 注册提供者 缓载提供者 简介 Service providers are the central place of all ...
随机推荐
- 【2.0新特性】Spring Boot 2.0新特性
以Java 8 为基准 Spring Boot 2.0 要求Java 版本必须8以上, Java 6 和 7 不再支持. 内嵌容器包结构调整 为了支持reactive使用场景,内嵌的容器包结构被重构了 ...
- 题解——CF Manthan, Codefest 18 (rated, Div. 1 + Div. 2) T3(贪心)
是一道水题 虽然看起来像是DP,但其实是贪心 扫一遍就A了 QwQ #include <cstdio> #include <algorithm> #include <cs ...
- [echarts] - echarts量化比较图表类型解析
https://echarts.baidu.com/examples/editor.html?c=watermark <!DOCTYPE html> <!--用作两种货品的参数对比- ...
- CommandLineParser命令行解析类
目的:方便用户在命令行使用过程中减少工作量 以前版本没这个类时,如果要运行带参数的.exe,必须在命令行中输入文件路径以及各种参数,并且输入的参数格式要与代码中的if语句判断内容格式一样,一不小心就输 ...
- Ubuntu14.04下 升级 cmake
参考: How to install cmake 3.2 on ubuntu 14.04? Ubuntu14.04下升级cmake 1.通过PPA安装: $ sudo apt-get install ...
- re模块与subprocess模块介绍
一:re模块 处理正则表达式的模块,正则表达式就是一些带有特殊含义的符号或者符号的组合. 作用:对字符串进行过滤,在一堆字符串中找到你所关心的内容,你就需要告诉计算机你的过滤的 规则是什么 ...
- 实现一个键对应多个值的字典(multidict)
一个字典就是一个键对应一个单值的映射.如果你想要一个键映射多个值,那么你就需要将这多个值放到另外的容器中, 比如列表或者集合里面.比如,你可以像下面这样构造这样的字典: d = { , , ], , ...
- go 内嵌对象类型
demo1 // Sample program to show how to embed a type into another type and // the relationship betwee ...
- SpringBoot学习路线
网上也有很多github资源,都是自己学习Spring Boot时候,自己练的代码 虽然现在最新的版本用2.1.3.RELEASE版本,以前版本的demo运行可能会遇到错误.但是有总比没有要好,不是么 ...
- var_export
var_export可以将一个数组转为一个字符串,以符合PHP的代码风格,输出者展示一个字符串的内容. 多用于展示php代码结构,调试代码. <?php // 场合多用于展示php代码结构,调试 ...