tensorflow源码解析之framework-node
目录
- 什么是node
- node_def
- 关系图
- 涉及的文件
- 迭代记录
1. 什么是node
TF中的计算图由节点组成,每个节点包含了一个操作,表示这个节点的作用,比如,如果一个节点的作用是做矩阵乘法,那么它的输入是两个矩阵,输出是两个输入矩阵相乘的结果。节点是自带结构的,每个节点都包含了输入的来源,因此若干节点的集合就能无需其它信息的生成一张图。节点必须被放置在某一个设备上,为了减少跨设备传输数据,也为了提高计算效率,节点的放置是一个受限条件下的优化问题,为此TF还专门开发了相应的节点放置算法。
2. node_def
我们先来看一下节点的定义:
message NodeDef {
string name = 1;//节点名称
string op = 2;//节点包含的操作名称
repeated string input = 3;//节点的输入,详见正文
string device = 4;//节点所在的设备
map<string, AttrValue> attr = 5;//节点包含的op,其参数的具体赋值
};
由于节点对于后续理解graph和kernel非常重要,因此我们详细分析一下它包含的字段:
- 关于input,刚才提到,节点是自带结构信息的,这个信息就包含在input字段中。input的格式是node:src_output,其中的node表示输入的节点名称,src_output表示该输入是输入节点的第几个输出。这样听起来可能很绕,举个例子,假设node1和node2是两个节点,它们分别产生两个输出,node1:0,node1:1,node2:0,node2:1。现在我们有第三个节点node3,它需要来自前两个节点的输出作为输入,具体需要的输入是node1:1和node2:0,那么,node3的input字段就是node1:1和node2:0,如下图所示。另外,如果需要的是输入节点的第1个输出,那么后面的端口号可以忽略,比如node2:0可以直接写为node2。
node1-->|输出1|node1:0
node1-->|输出2|node1:1
node2-->|输出1|node2:0
node2-->|输出2|node2:1
node1:1-->node3
node2:0-->node3
- 关于input,再啰嗦一点,节点的输入可以是真实输入,也可以是控制输入。控制输入表示节点并不需要这个输入的具体数值做计算,仅仅是为了说明一种计算的先后关系,即当前节点的计算,必须在所有的控制输入计算都完成之后进行。在表示input字段时,控制输入需要跟在常规输入的后面,并且用^node表示。
- 关于device,它表示了我们对于当前节点可以被放置的设备的需求。这个描述可以是完全限定的,比如
"/job:worker/replica:0/task:1/gpu:3",也可以是局部限定的,比如"/job:worker/gpu:3",也可以不限定。因此这个字段指代的,可能不是某一个具体的设备,这就需要上文提到的节点放置算法,对节点所在的设备进行选择了。也就是说,device这个字段有些情况下只是给节点所在的设备限制了一个粗略的条件,节点放置算法需要在考虑这些条件的基础上,为节点选择合适的设备。关于节点放置算法的细节,我们将在后面详述。 - 关于attr,我们前面讲过,op是一个抽象信息,这个抽象信息包含了很多未赋值的参数,在运行时构建图的时候,这些参数就一定要被赋值了,否则图计算就无法进行。因此这里必须包含op中所有未赋值的参数的具体数值。如果op中的参数有默认值,这里可以对其进行覆盖,也可以忽略,这样该参数就会使用默认值。
按照惯例,TF会给每一个核心概念设计一个构建类,node也不例外,这个类就是NodeDefBuilder。我们先来看一下它的用法:
NodeDef node_def;
Status status = NodeDefBuilder(node_name, op_name)
.Input(...)
.Attr(...)
.Finalize(&node_def);
可见,与OpDefBuilder类似,我们也可以采用链式规则,通过逐个设置NodeDef的字段来构建它。下面我们看下NodeDefBuilder包含的私有数据:
class NodeDefBuilder {
private:
const OpDef* op_def_;
NodeDef node_def_;
int inputs_specified_;
std::vector<string> control_inputs_;
std::vector<string> errors_;
};
这里之所以会包含OpDef,是因为在NodeDef中,仅包含了操作的名称。
3. 关系图
NodeDefBuilder-->|构建|NodeDef
NodeDef-.包含.->节点名称name
NodeDef-.包含.->节点包含的操作名称op
NodeDef-.包含.->输入input
NodeDef-.包含.->节点所在设备名称device
NodeDef-.包含.->节点属性也是操作属性attr
4. 涉及的文件
- node_def
5. 迭代记录
- v1.0 2018-08-27 文档创建
- v2.0 2018-09-09 文档重构
tensorflow源码解析之framework-node的更多相关文章
- tensorflow源码解析之framework拾遗
把framework中剩余的内容,按照文件名进行了简单解析.时间原因写的很仓促,算是占个坑,后面有了新的理解再来补充. allocation_description.proto 一个对单次内存分配结果 ...
- tensorflow源码解析系列文章索引
文章索引 framework解析 resource allocator tensor op node kernel graph device function shape_inference 拾遗 c ...
- Tensorflow源码解析1 -- 内核架构和源码结构
1 主流深度学习框架对比 当今的软件开发基本都是分层化和模块化的,应用层开发会基于框架层.比如开发Linux Driver会基于Linux kernel,开发Android app会基于Android ...
- tensorflow源码解析之common_runtime-executor-上
目录 核心概念 executor.h Executor NewLocalExecutor ExecutorBarrier executor.cc structs GraphView ExecutorI ...
- tensorflow源码解析之common_runtime-executor-下
目录 核心概念 executor.h Executor NewLocalExecutor ExecutorBarrier executor.cc structs GraphView ExecutorI ...
- tensorflow源码解析之framework-allocator
目录 什么是allocator 内存分配器的管理 内存分配追踪 其它结构 关系图 涉及的文件 迭代记录 1. 什么是allocator Allocator是所有内存分配器的基类,它定义了内存分配器需要 ...
- tensorflow源码解析之common_runtime拾遗
把common_runtime中剩余的内容,按照文件名排序进行了简单的解析,时间原因写的很仓促,算是占个坑,后续有了新的理解再来补充. allocator_retry 有时候内存分配不可能一次完成,为 ...
- tensorflow源码解析之distributed_runtime
本篇主要介绍TF的分布式运行时的基本概念.为了对TF的分布式运行机制有一个大致的了解,我们先结合/tensorflow/core/protobuf中的文件给出对TF分布式集群的初步理解,然后介绍/te ...
- tensorflow源码解析之framework-op
目录 什么是op op_def定义 op注册 op构建与注册辅助结构 op重写 关系图 涉及的文件 迭代记录 1. 什么是op op和kernel是TF框架中最重要的两个概念,如果一定要做一个类比的话 ...
- tensorflow源码解析之framework-graph
目录 什么是graph 图构建辅助函数 graph_transfer_info 关系图 涉及的文件 迭代记录 1. 什么是graph graph是TF计算设计的载体,如果拿TF代码的执行和Java代码 ...
随机推荐
- Thread中常用API
1.sleep方法 线程的 sleep 方法会使线程休眠指定的时间长度.休眠的意思是,当前逻辑执行到此不再继续执行,而是等待指定的时间.但在这段时间内,该线程持有的锁并不会释放.这样设计很好理解,因为 ...
- CentOS 7下iptables配置添加修改规则端口方法(转)
简介: Linux CentOS 7默认没有安装iptables,默认的防火墙是firewalld,云吞铺子分享CentOS 7系统下iptables安装.iptables规则配置(放行或者禁用端口) ...
- 我对JavaWeb中中文URL编码的简单总结
1.application/x-www-form-urlencoded 它是一种编码类型.当URL地址里包含非西欧字符的字符串时,系统会将这些字符转换成application/x-www-form-u ...
- Kubernetes-三大开放接口-初见
目录 容器运行时接口CRI 历史 简介 架构 启用 CRI CRI 接口 当前支持的 CRI 后端 容器网络接口CNI 简介 接口定义 官方网络插件 接口参数 CNI 的特性 在 kubernetes ...
- HTTP缓存小结
介绍 提到页面优化,浏览器缓存必定是一个绕不过的话题,判断一个网站的性能最直观的就是看网页打开的速度,而提高网页反应速度的一个方式就是使用缓存.一个优秀的缓存策略可以缩短网页请求资源的距离,减少延迟, ...
- 详解 Apache SkyWalking OAP 的分布式计算
SkyWalking的OAP(Observability Analysis Platform,观测分析平台)是一个用于链路数据的分布式计算系统. 因为它巧妙的设计,使得在链路数据计算和聚合过程中,不需 ...
- Solution -「HNOI 2019」「洛谷 P5293」白兔之舞
\(\mathcal{Description}\) Link. 不想概括题意.jpg \(\mathcal{Solution}\) 定义点集 \(S_c=\{(u,v)|v=c\}\):第 ...
- docker为什么会出现
痛点 环境不同所引发的问题 一款产品从开发到上线,一般都会有开发环境,测试环境,运行环境. 如果有一个环境中某个软件或者依赖版本不同了,可能产品就会出现一些错误,甚至无法运行.比如开发人员在windo ...
- 搭建开源跳板机——jumpserver
搭建开源跳板机mobaxterm 官方文档:https://jumpserver.readthedocs.io/zh/master/ $ yum update -y # 防火墙 与 selinux 设 ...
- Java邮件发送中的setRecipient方法使用
一.方法setRecipient(Message.RecipientType type, Address address),是用于设置邮件的接收者. 1.有两个参数,第一个参数是接收者的类型,第二 ...