学习资源mark一下:
https://blog.csdn.net/j2IaYU7Y/article/details/79694692
基础概念
- tensorflow-计算图,图中节点代表数学计算操作的算子(op),节点之间连接的边代表参与计算的高维数组数据,叫tensor。计算图的执行可以看作数据tensor按照图的拓扑顺序,从输入节点逐步流过所有中间节点,最后流到输出结点的过程。
- tensor-多维数组,对应神经网络计算中的多维矩阵。 一维tensor--向量,二维tensor--矩阵。一般用四维tensor表示一个mini-batch的图片,[批大小,像素行数,像素列数,通道数],即[batch,height,width,channels]
- tensor中元素可以是任意类型,常用的有int32, int64, float32, float64等等,神经网络中常用单精度float32。
- 算子op是参与计算的基本单位,对应一种数学计算。tensorflow内嵌多种算子,举例:
类别 | 算子示例 |
---|---|
数值计算操作 | Add,Sub,Mul,Div,Less,Equal... |
数组操作 | Concat,Slice,Split,Constant,Rank,Shape,Shuffle,... |
矩阵计算操作 | MatMul,MatrixInverse,MartrixDeterminant,... |
状态操作 | Variable,Assign,AssignAdd,... |
神经网络相关操作 | SoftMax,Sigmod,ReLU,Convolution2D,MaxPool,... |
存档操作 | Save,Restore |
队列和同步操作 | Enquence,Dequeue,MutexAcquire,MutexRelease,... |
控制流操作 | Merge,Switch,Enter,Leave,Nextratio |
- session--驱动tensorflow系统执行计算交互的入口。负责完成多计算设备或集群分布式的节点布置和数据传输节点的添加,并负责将子图分配给相应的执行器单元来运行。触发计算图的执行通过Run接口,即tf.Session.run(),计算完成后,要关闭Session以释放资源。
小结:tensorflow是计算图,节点表示算子,对应一种数学计算,边表示高维数组数据。计算图通过Session会话执行,Session是系统执行计算交互的入口
系统架构
- client->master->worker 架构的分布式系统;
- 算子定义与面向硬件的代码实现分离的机制;
- 面向集群分布式环境的容错机制:
- 检错:
- 基于发送和接收算子之间传输的错误信息;
- master进程的轮询检查
- 纠错:
- 终止当前迭代,从存档状态重新运行。
- 检错:
源码结构
- 后端执行引擎(执行系统的实现借鉴了NumPy等高性能数值计算库的方案,使用C++编写,以充分保证执行性能)
- 系统框架(core/framework目录):定义了计算图、tensor、算子等数据结构,还包括数据类型、资源管理器、消息通信机制等基础设施。算子的实现使用了注册机制
- 计算图(core/graph):实现计算图模型的数据结构,包括节点Node、边Edge和图Graph等类的定义,以及图的遍历算法和在布置节点时所需的代价模型。
- 算子声明与内核实现(core/ops和core/kernels)
- 算子声明和实现分离,注册声明使用c++的宏REGISTER_OP,定义了算子的名称、输入输出、相关参数及说明文档。内置算子的注册声明在ops目录中。
- 内核:计算操作在硬件上的具体代码实现。
- 对于CPU,数值计算基于Eigen库(C++编写的模板库,支持整数、浮点数、复数、使用模板编程,可以为特殊的数据结构提供矩阵操作);
- 对于GPU,基于Nvidia的CUDA库来完成(CUDA是计算同一设备架构的简称,是一个并行编程平台,提供了基于GPU加速的编程API)。
- 前后端交互接口(core/protobuf)
- 运行时(core/common_runtime 和core/distributed_runtime):负责管理程序运行时所需要的资源,在分布式运行模块中主要实现了master和worker两个服务,以及执行调度器。
- 操作系统平台(core/platform)
- TFRecord数据的格式定义类Example(core/example)
- 前端语言接口
- 已支持C/C++、Python、Java、Go等多种语言
- 例如Python采用了符号式编程的定义方式
- tensorflow核心是计算,对于算子的接入若人工建立前后端wrapper,工作量巨大。因此充分采用代码生成技术,对于python语言版本,前后端使用swig生成的代码相连接,Go语言则是实现了一个代码生成器,在编译期间生成所需要的代码。