Tensorflow[架构流程]
1. tensorflow工作流程
如官网所示:
根据整体架构或者代码功能可以分为:

图1.1 tensorflow架构
如图所示,一层C的api接口将底层的核运行时部分与顶层的多语言接口分离开。
而根据整个的工作流程,又可以分为:

图1.2 不同系统组件之间的交互
而图1.2也是tensorflow整个工作的流程,其中主要分为四个部分:
1.1. 客户端client
- 将整个计算过程转义成一个数据流graph
- 通过session,将graph传递给master执行
ps:假设我们使用的是python作为客户端,则其中session文件在Anaconda3/lib/python3.6/site-packages/tensorflow/python/client/session.py
1.2. 分布式主节点Distributed Master
- 基于用户传递给Session.run()中的参数来进行修剪整个完整的graph,提取其中特定subgraph;
- 将上述subgraph划分成不同部分,并将其对应不同的进程和devices中;
- 将上述划分的部分分布到worker services上;
- 每个worker services执行其收到的graph块
1.3. 工作节点的服务Worker Services (one for each task)
- 使用可用的硬件kernel(如cpu,gpu)计划执行接收到的graph块表示的计算部分;
- 与其他work services相互发送和接收计算结果
1.4. 核的实现Kernel Implementations
- 执行graph操作的计算部分
现在回到图1.2。其中的"/job:worker/task:0" 和"/job:ps/task:0" ,都是worker services上执行的任务。
- "PS"表示parameter server:一个task负责存储和更新模型的参数
- 其他worker会发送他们迭代优化的参数给PS。
当然如果在单机环境下,上述PS和worker不是必须的,不过如果是分布式训练,这种模式就很常见了。而且上述的 "Distributed Master","Worker Service"只存在于分布式tensorflow中,对于单进程的tensorflow(也就是单机版),一个特定的session就负责了Distributed Master的任何事情,且其自己负责本机的多进程或者说多devices之间的数据交互。
下面,通过一个graph例子详细的介绍下tensorflow的核心模块。
2 client
用户负责在client端编写tensorflow代码,以此行程一个计算graph。该程序可以直接通过底层API组成(如自己写每一层,每一个激活函数),或者使用google提供的如Estimators API等高阶API来完成整个NN的搭建。同时Tensorflow支持多种client端的语言,如Python,CPP。当然随着tensorflow本身的趋于完善,CPP的接口也会越来越多,用于提供更快速的执行效率,当然python接口还是最全的。
client创建一个session,该会话会将graph的定义通过一个tf.GraphDef的protocol buffer 发送给distributed master。当在run中指定了某个graph中的node或者某些nodes,该函数会触发distributed master 去执行所需要的计算。
假如我们的graph如图2.1,就是一个\[s+= wx+b\]

图2.1 基于client端建立的graph
ps:tf.Session
3 Distributed master
该部分的主要工作为:
- 基于client在run中指定的节点,从整个完整的graph中截取所需要的subgraph;
- 将subgraph进一步划分成多个pieces,使其可以将每个piece映射到不同的执行设备上;
- 将划分好的pieces缓存起来,以备后面的其他run的触发。
因为一旦到了master的部分,master可以总揽整个graph,所以它可以使用标准的优化方法去做优化,如公共子表达式消除(common subexpression elimination )和常量的绑定。然后给优化后的subgraphs或者说pieces定义不同的坐标,每个坐标对应了不同的执行设备如"/job:worker/task:0" 和"/job:ps/task:0"

图3.1 client通过运行run,将graph发送给master

图3.2 master将所需要执行的subgraph划分成参数更新和迭代优化两部分

图3.1 master在划分好的subgraph上添加所需要的发送和接收接口,为真实任务分发做准备

图3.1 master将每个piece通过分布式task分发到真实的节点去运行
Ps:MasterService API definition
Master interface
4 Worker Service
在每个task中,该部分负责:
- 处理从master发来的请求;
- 基于接收到的subgraph,规划所需要执行的kernels;
- 与其他task直接进行消息交换
google优化了该部分,使其就算面对large graph,其负载也很低。当前的版本可以执行每秒上万个subgraphs,这使得大量副本可以进行快速的,细粒度的训练。该部分会将所需要执行的kernels指派给本地的devices,并尽可能的并行执行kernels。例如使用多CPU核或者多GPU流。
该部分还负责具体化源和目标device的Send和Recv操作:
- 使用cudaMemcpAsync()来进行本地CPU和GPU设备之间的数据传输操作;
- 使用点对点的DMA进行GPU之间的传输,以避免需要通过host CPU主内存进行数据传输的高代价
为了在tasks之间进行传输,tensorflow使用多种协议:
- 基于TCP的gRPC;
- 基于Converged Ethernet的RDMA
同时tensorflow也支持NVIDIA的NCCL库来为多GPU之间进行数据交互(tf.contrib.nccl)

图4.1 worker端接收到的piece;对应的接收发送接口;task之间的交互
ps:WorkerService API definition
Worker interface
Remote rendezvous (for Send and Recv implementations)
5 Kernel Implementations
该运行时包含了超过200个标准操作,其中涉及数学,数组,控制流,和状态管理等操作。每个操作都有对应不同devices的优化后的实现。其中许多kernel是通过使用了CPP的模版的Eigen:Tensor去实现的,主要是为了能生成可以在多CPU和多GPU上运行的高效并行代码。不过如果cuDNN中已经实现了一些kernel,那么就用cuDNN的接口。同时google还实现了quantization,可以更快速的基于移动设备和高吞吐量的数据中心应用进行inference,并且可以使用低精确度的gemmlowp用于加速量化计算。
如果用户发现很难去将子计算组合成一个大计算,或者说组合后发现效率很低,那么用户可以通过注册额外的cpp编写的kernel来提供一个新的接口。例如,可以自己将一些性能敏感的操作如ReLU和Sigmoid等函数(或者其对应的梯度等)进行融合。XLA提供了一个实验性质的自动kernel融合实现
参考资料:
Tensorflow[架构流程]的更多相关文章
- 『TensorFlow』流程控制
『PyTorch』第六弹_最小二乘法对比PyTorch和TensorFlow TensorFlow 控制流程操作 TensorFlow 提供了几个操作和类,您可以使用它们来控制操作的执行并向图中添加条 ...
- TensorFlow架构与设计:概述
TensorFlow是什么? TensorFlow基于数据流图,用于大规模分布式数值计算的开源框架.节点表示某种抽象的计算,边表示节点之间相互联系的张量. TensorFlow支持各种异构的平台,支持 ...
- 一:SpringMVC架构流程
架构流程: 1.用户发送请求至前端控制器DispatcherServlet 2.DispatcherServlet收到请求调用HandlerMapping处理器映射器. 3.处理器映射器根据请求url ...
- 『TensorFlow』流程控制之tf.identity
一个详细介绍 下面程序要做的是,5次循环,每次循环给x加1,赋值给y,然后打印出来, x = tf.Variable(0.0) #返回一个op,表示给变量x加1的操作 x_plus_1 = tf.as ...
- MyBatis原理-架构流程
一 .MyBatis原理架构图 Mybatis的功能架构分为三层: API接口层:提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库.接口层一接收到调用请求就会调用数据处理层来完成具体 ...
- MyBatis(十一):MyBatis架构流程浅析
架构分层 我们将MyBatis架构分为三层,分别为接口层.数据处理层和框架支撑层 接口层:提供外部接口调用的API,使用端通过这些API来操作数据库,接口层收到请求后会调用数据处理层完成具体的数据处理 ...
- TensorFlow架构学习
0 - TensorFlow 基于数据流图,节点表示某种抽象计算,边表示节点之间联系的张量. Tensorflow结构灵活,能够支持各种网络模型,有良好的通用性和扩展性. 1 - 系统概述 Tenso ...
- 实现 TensorFlow 架构的规模性和灵活性
TensorFlow https://mp.weixin.qq.com/s/tEyX596WXTzsABXaeTesug
- Struts2架构流程
[Struts2] Action实现. interceptor实现. Filter工作原理. 使用 拦截器来处理请求. 业务逻辑控制器与 Servlet API分离. ================ ...
随机推荐
- ES6学习之变量的解构赋值
前言:什么是ES6?ECMAScript 6(简称ES6)是JavaScript语言的下一代标准,已经在2015年6月正式发布了.其中相比较于ES5新增了诸多的特性,并且ES6可转换为ES5的语法.- ...
- TortoiseSVN 1.9.5安装 与 Eclipse4.4.2及以上版本中安装SVN插件
引自: http://blog.csdn.net/chenchunlin526/article/details/54631458 TortoiseSVN 1.9.5安装 与 Eclipse4.4.2及 ...
- Windows下更新 npm 和 nodejs
一.更新npm // 将npm更新到最新版本 npm install npm@latest -g 二.更新nodejs 1. 首先通过 where node 命令找到nodejs的安装路径 2. 然后 ...
- Salesforce数据安全简介
数据安全级别 Salesforce中将数据安全分为若干等级: 组织级别:组织级别的安全设定在整个系统内部都有效.这是最广泛的级别 对象级别:对象级别的安全设定可以限制用户对于对象的权限 字段级别:字段 ...
- loadrunner 场景设计-添加Windows Resources计数器
场景设计-添加Windows Resources计数器 by:授客 QQ:1033553122 目的 监控要测试的windows服务器的资源使用情况 步骤 1.添加视图,方法双击.拖动左侧的Windo ...
- 安卓开发_深入理解Activity和Fragment的关系
Fragment(碎片)是必须嵌入在 Activity(活动) 中使用的.Fragment的生命周期随着Activity的生命周期的变化而变化 一.首先让我们看下Activity和Fragment的生 ...
- python变量的命名空间
首先必须要提一下python程序执行过程中变量的查找规则 较官方的查找机制是: 局部作用域--外部函数作用域--全局作用域--内建函数作用域 其实一般内建函数中的作用域很少会涉及到,因为内建函数其实是 ...
- python:异常处理、自定义异常、断言
什么是异常: 当程序遭遇某些非正常问题的时候就会抛出异常:比如int()只能处理能转化成int的对象,如果传入一个不能转化的对象就会报错并抛出异常 常用的异常有: ValueError :传入无效的错 ...
- weblogic系列漏洞整理 -- 3. weblogic 后台提权
目录 三. weblogic 后台提权 0. 思路分析 1. 利用过程 2. 提示和技巧 一.weblogic安装 http://www.cnblogs.com/0x4D75/p/8916428.ht ...
- 【第二篇】SAP ABAP7.5x新语法之OPEN SQL
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:SAP ABAP7.5x系列之OPEN SQL ...