目录

  1. 什么是graph
  2. 图构建辅助函数
  3. graph_transfer_info
  4. 关系图
  5. 涉及的文件
  6. 迭代记录

1. 什么是graph

graph是TF计算设计的载体,如果拿TF代码的执行和Java代码执行相比,它相当于Java的字节码。关于graph的执行过程,我们在这里简单介绍一下。在graph构建完成,并进行了一些简单优化之后,会对图进行分割,实际上就是执行一个节点分配的过程,然后在各设备上分别对子图进行运行前的优化,最后调用各设备的执行器,调度运行运行子图。在node章节我们讲过,node本身是自带图结构的,一个node的集合就能复原一个完整的graph。所以,graph本身添加的数据内容并不多。下面我们看下GraphDef的定义:

message GraphDef {
repeated NodeDef node = 1;
VersionDef versions = 4;
int32 version = 3 [deprecated = true];
FunctionDefLibrary library = 2;
};

可以看到,这个结构里除了添加了一个函数定义库之外,没有其它数据了。

2. 图构建辅助函数

TF为了方便构建GraphDef,提供了很多辅助函数,下面我们来看下:

//生成一个可读性好的关于GraphDef的描述,而不是返回一个可读性差的proto文本
string SummarizeGraphDef(const GraphDef& graph_def); //校验一个GraphDef
Status ValidateExternalGraphDefSyntax(const GraphDef& graph_def); //从节点索引node_offset开始,为GraphDef中的节点加入默认参数值,节点对应的op的默认参数值在op_registry中
Status AddDefaultAttrsToGraphDef(GraphDef* graph_def, const OpRegistryInterface& op_registry, int node_offset); //从GraphDef中除去那些,在producer_op_registry中出现过,但在consumer_op_registry中未出现过的默认参数值
Status RemoveNewDefaultAttrsFromGraphDef(GraphDef* graph_def, const OpRegistryInterface& consumer_op_registry, const OpRegistryInterface& producer_op_registry, std::set<std::pair<string,string>>* op_attr_removed); //收集图使用的op,以字符串集合的形式返回
void OpsUsedByGraph(const GraphDef& graph_def, std::set<string>* ops_used_in_graph); //将graph_def中出现过,同时也在op_registry中出现过的op放入stripped_op_list
Status StrippedOpListForGraph(const GraphDef& graph_def, const OpRegistryInterface& op_registry, OpList* stripped_op_list);

我们发现,其中有很多是跟图中op的默认参数值相关的函数。这些函数出现的背景是这样的,假设在一个分布式的环境下,master需要workder执行一个子图,但这个图是master产生的,图中操作的默认值使用的是master所在机器的运行时环境中,OpRegistry中注册的操作所包含的默认值,但关键是,workder所在机器使用的运行时环境,跟master可能不一样!比如,master机器及时对TF进行了升级,但workder却没有。而升级之后,master所在运行时的op参数,可能之前没有默认值,现在加上了默认值,或者之前的默认值改成了现在的默认值,这时候,为了让这张子图具有向前兼容特性,即为了让它能够在workder机器上运行,需要对这张子图进行处理,删除仅在master运行时的OpRegistry中出现的op参数默认值。于是就出现了最后的三个函数。

3. graph_transfer_info

为了让我们定义的计算图能够在其它设备(比如DSP)上运行,需要对图结构进行一些转换。目前TF仅支持转换到HEXAGON,详见HEXAGON的SDK

message GraphTransferInfo {
enum Destination {
NOP = 0;
HEXAGON = 1;
}
message NodeInput {
int32 node_id = 1;
int32 output_port = 2;
}
message NodeInfo {
string name = 1;
int32 node_id = 2;
string type_name = 3;
int32 soc_op_id = 4;
int32 padding_id = 5;
int32 input_count = 6;
int32 output_count = 7;
};
message ConstNodeInfo {
string name = 1;
int32 node_id = 2;
repeated int64 shape = 3;
bytes data = 4;
DataType dtype = 5;
};
message NodeInputInfo {
int32 node_id = 1;
repeated NodeInput node_input = 2;
};
message NodeOutputInfo {
int32 node_id = 1;
repeated int32 max_byte_size = 2;
};
message GraphInputNodeInfo {
string name = 1;
repeated int64 shape = 2;
DataType dtype = 3;
};
message GraphOutputNodeInfo {
string name = 1;
repeated int64 shape = 2;
DataType dtype = 3;
};
repeated NodeInfo node_info = 1;
repeated ConstNodeInfo const_node_info = 2;
repeated NodeInputInfo node_input_info = 3;
repeated NodeOutputInfo node_output_info = 4;
repeated GraphInputNodeInfo graph_input_node_info = 5;
repeated GraphOutputNodeInfo graph_output_node_info = 6;
Destination destination = 7;
};

4. 关系图

5. 涉及的文件

  • graph
  • graph_def_util
  • graph_transfer_info

6. 迭代记录

  • v1.0 2018-08-28 文档创建
  • v2.0 2018-09-09 文档重构

github地址

tensorflow源码解析之framework-graph的更多相关文章

  1. tensorflow源码解析之framework拾遗

    把framework中剩余的内容,按照文件名进行了简单解析.时间原因写的很仓促,算是占个坑,后面有了新的理解再来补充. allocation_description.proto 一个对单次内存分配结果 ...

  2. tensorflow源码解析系列文章索引

    文章索引 framework解析 resource allocator tensor op node kernel graph device function shape_inference 拾遗 c ...

  3. Tensorflow源码解析1 -- 内核架构和源码结构

    1 主流深度学习框架对比 当今的软件开发基本都是分层化和模块化的,应用层开发会基于框架层.比如开发Linux Driver会基于Linux kernel,开发Android app会基于Android ...

  4. tensorflow源码解析之common_runtime-executor-上

    目录 核心概念 executor.h Executor NewLocalExecutor ExecutorBarrier executor.cc structs GraphView ExecutorI ...

  5. tensorflow源码解析之framework-allocator

    目录 什么是allocator 内存分配器的管理 内存分配追踪 其它结构 关系图 涉及的文件 迭代记录 1. 什么是allocator Allocator是所有内存分配器的基类,它定义了内存分配器需要 ...

  6. tensorflow源码解析之common_runtime-executor-下

    目录 核心概念 executor.h Executor NewLocalExecutor ExecutorBarrier executor.cc structs GraphView ExecutorI ...

  7. tensorflow源码解析之distributed_runtime

    本篇主要介绍TF的分布式运行时的基本概念.为了对TF的分布式运行机制有一个大致的了解,我们先结合/tensorflow/core/protobuf中的文件给出对TF分布式集群的初步理解,然后介绍/te ...

  8. tensorflow源码解析之common_runtime拾遗

    把common_runtime中剩余的内容,按照文件名排序进行了简单的解析,时间原因写的很仓促,算是占个坑,后续有了新的理解再来补充. allocator_retry 有时候内存分配不可能一次完成,为 ...

  9. tensorflow源码解析之framework-op

    目录 什么是op op_def定义 op注册 op构建与注册辅助结构 op重写 关系图 涉及的文件 迭代记录 1. 什么是op op和kernel是TF框架中最重要的两个概念,如果一定要做一个类比的话 ...

  10. Tensorflow源码解析2 -- 前后端连接的桥梁 - Session

    Session概述 1. Session是TensorFlow前后端连接的桥梁.用户利用session使得client能够与master的执行引擎建立连接,并通过session.run()来触发一次计 ...

随机推荐

  1. docker基础——2.镜像管理

    1. Docker镜像的主要特点 (1) 采用分层构建机制. 最底层为bootfs,用于系统引导的文件系统,包括bootloader和kernel,容器启动后会被卸载以节约资源. 其上为rootfs, ...

  2. 为hade增加model自动生成功能

    大家好,我是轩脉刃. 我们写业务的时候和db接触是少不了的,那么要生成model也是少不了的,如何自动生成model,想着要给hade框架增加个这样的命令. 看了下网上的几个开源项目,最终聚焦在两个项 ...

  3. 1、Linux基础--相关软件安装与网络配置

    1.虚拟机(VM安装) 2.网络配置 3.Linux操作系统安装 4.xshell安装

  4. Solution -「CF 923F」Public Service

    \(\mathscr{Description}\)   Link.   给定两棵含 \(n\) 个结点的树 \(T_1=(V_1,E_1),T_2=(V_2,E_2)\),求一个双射 \(\varph ...

  5. Solution -「CCO 2019」「洛谷 P5532」Sirtet

    \(\mathcal{Description}\)   Link.   在一个 \(n\times m\) 的网格图中,每个格子上是空白 . 或沙子 #,四联通的沙子会连成一个整体.令此时所有沙子块同 ...

  6. fork_join

    在systemverilog中可以用fork-- join.fork --join_any.fork--join_none来实现多个线程的并发执行. 1.父线程.子线程 调用fork--join的线程 ...

  7. 当gitlab的数据库坏了,或者其他的组件坏了,修复教程。

    一般企业的gitlab都承载着多个项目的源码和提交记录 如果gitlab的数据库 PostgreSQL 坏掉了,基本很难修复,那这是不是意味着源码丢失了呢. 本文章只针对 gitlab传统存储方式的修 ...

  8. 关于iOS APP转让

    需要以下条件即可

  9. Django整体模型理解(1)

    Django大概理解 *models:  设计一个模型,即在数据库中设计一个表,一个模型就是对应一个数据库中的表:models是一个类,类名就是表名,而类的属性就是表的字段.如下例子设计了两个表: f ...

  10. KVM 虚机镜像操作, 扩容和压缩

    KVM镜像操作 qemu-img命令 创建镜像 qemu-img create # 创建一个设备空间大小为10G的镜像 qemu-img create -f qcow2 centos7-guest.q ...