torch.fx介绍

2023-10-27

Node

Node类构造函数的各项参数如下(参考torch.fx下的node.py):

  • graph:指明实例化的Node属于哪个Graph
  • op:节点的类型。一共有如下的几种类型:
    • placeholder:占位符,一般代表输入。
    • call_method:表示一种操作,该操作表示让前驱节点的输出对象调用自己的方法。
    • call_module:表示一种操作,该操作表示将前驱节点的输出输入到nn.Module中。
    • call_function:表示一种操作,该操作表示将前驱节点的输出输入到一个函数中。
    • get_attr:表示一个操作,该操作获取Module自己的一个属性,并保存到输出中。
    • output:输出节点,表示该节点是所属Graph的输出节点,即在所属Graph中无后继节点。
    • root:整个Node在底层的数据结构是一个循环双向链表,root代表这个双向链表的头,是一个空的链表节点,用于维护双向链表。
  • name:节点的名字。
  • target:该节点需要调用的对象。如果op是call_function,那么target必须是一个Callable,否则必须是str。
  • args:需要传递给target的变长参数。
  • kwargs:需要传递给target的位置参数。
  • return_type:代表该节点的输出数据的数据类型。

除此之外,Node在初始化时会创建几个属性,其中有几个比较重要:

  • _input_nodes:一个哈希表,key是Node,value是None:代表self在Graph模式下的所有前驱节点。
  • users:一个哈希表,数据类型同_input_nodes,代表self在Graph模式下的所有后继节点。
  • _prev:self底层存储逻辑的前驱节点。
  • _next:self底层存储逻辑的后继节点。

剩下来对于双向循环链表的插入(往前还是往后)和删除在Node中都实现了。

总结一下,Node通过_input_nodes和users来表示原本计算图的拓扑结构。其管理和存储是通过双向循环链表来的(和CPython的堆变量管理类似)

#查找conv节点
model = models.resnet18()
fx_model = fx.symbolic_trace(model)
modules = dict(fx_model.named_modules())

for node in fx_model.graph.nodes:
    if node.target in modules:
        print(node.target)
        if type(modules[node.target]) == nn.Conv2d:
            print('conv node')

Graph

由于Node中已经定义了完整管理计算图的属性和方法,因此Graph更多是对Node的管理和封装。

首先Graph在初始化时会创建一个root节点(在一张图中,有且仅有一个root):

 self._root : Node = Node(self, '', 'root', '', (), {})

这个root就是底层用于存储和管理Node的双向循环链表。并且指定了插入节点的方法为向前插入。

在Graph的create_node方法中。就是创建一个node,然后再插入到链表中。

除此之外,Graph还指定了一些用于描述上下文、所属模块的信息,这些和后续的原理关系不大,就不赘述了。

GraphModule

GraphModule是对Graph的封装,为啥还要封装呢?因为Graph的mro中没有nn.Module,为了工程规范,GraphModule继承了nn.Module并对Graph做了一个简单的封装。

Proxy

正如其名,Proxy类是对Node类的一层包裹,它允许用户在不修改原图的情况下,用自定义的函数代理其中的节点,从而完成重载。

Tracer

Tracer类是对符号跟踪的一层抽象,它的symbolic_trace(m)等价于Tracer().trace(m)。Tracer继承自TracerBase。

而symbolic_trace也只是对Tracer().trace的输出结果使用GraphModule进行了一次包装。因此,只需要看懂Tracer().trace的实现逻辑即可。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

torch.fx介绍 的相关文章

随机推荐

  • csu 1809 Parenthesis 2016湖南省赛 G

    Problem acm csu edu cn csuoj problemset problem pid 1809 vjudge net contest 161962 problem G Reference blog csdn net l95
  • spring之bean注入的意义

    简而言之就是 首先 service注解在当前类的上边 表示在当前类是spring管理的一个bean 使用 autowired 将另外一个A类的实体bean注入到当前类中 让当前类具备那个A类的功能
  • Android SDK & AVD Manager

    0 前言 Android源码中的prebuilts devtools tools android程序可根据不同的参数来启动SDK Manager或AVD Manager 1 SDK Manager 1 启动 android or andro
  • Chrome 基于 Wappalyzer 查看网站所用的前端技术栈

    1 找到谷歌商店 https chrome google com webstore search wappalyzer utm source ext app menu 2 搜索 Wappalyzer 3 添加至Chrome 4 使用 插件
  • MySQL的脏读、幻读、不可重复读

    首先我们要知道 我们的脏读 幻读 不可重复读这些概念是在事务中的概念 脏读 也就是读取了未提交的数据 比如我开启了一个事务A 在里面操作一个用户表 获取里面一个用户的积分 比如此时这个用户的积分是100 此时有另外一个事务B也操作了这个用户
  • LD3320语音识别

    芯片介绍 LD3320 不需要外接任何辅助的Flash芯片 RAM芯片和AD芯片 就可以完成语音识别功能 每次识别最多可以设置50项候选识别句 每个识别句可以是单字 词组或短句 另一方面 识别句内容可以动态编辑修改 只需要主控MCU把识别关
  • 碎碎念,浅浅饮-------Day30

    这不是一篇关乎技术的文章 它偏离了我原本的计划轨迹 但是 相信它的意义会远超出任何一项技术带给我的价值 高考已经开始了 不知道在这片宁静的夜空下有多少人已经美美的睡了 香甜憨然 又有多少人这睡着的眼角还挂着泪滴 偶尔蹙起眉头 却也记载不下那
  • 固态硬盘接口类型介绍

    固态硬盘接口类型介绍 现在装机硬盘肯定会首选SSD 容量小一点不怕 后面再补一个机械硬盘不迟 SSD有着稳固和高速的优势 深受用户喜爱 然而SSD有着各种各样的尺寸和接口 并不是每一个用户的电脑都能通用 所以选购SSD硬盘前必须先了解SSD
  • ajax请求出现闪屏,jquery $.Ajax 火狐浏览器闪屏解决办法

    本文章介绍了关于jquery的async false Ajax 火狐浏览器闪屏解决办法 jquery的async false 这个属性 默认是true 异步 false 同步 代码如下 复制代码 ajax type post url pat
  • vue2知识点梳理

    Vue梳理 对于Vue 我们并不陌生 现在我们来梳理一下关于它的东西吧 知识点 1 生命周期 最基本的就是它的生命周期 beforeCreate 在 beforeCreate 生命周期函数执行时 data 和 methods 中的数据都还没
  • Open3D (C++) 点云按坐标值大小进行排序

    目录 一 概述 二 点云排序 三 结果展示 一 概述 如题 点云按坐标大小进行排序 二 点云排序 代码以按照Z坐标的大小按照从小到大进行排序为例 include
  • java输出1~100之间的全部素数的5种方法

    文章目录 一 前言 二 需求分析 2 1 什么是素数 2 2 分析 三 代码实现 3 1 方法一 根据素数的定义来遍历检查 3 2 方法二 根据判断条件2进行遍历检查 减少遍历次数 3 3 方法三 根据判断条件3进行遍历检查 减少遍历次数
  • 达梦数据库调优组合索引的使用

    调优工程中对组合索引的使用的一个小总结 一 组合索引的执行计划 首先关于几个概念 等值条件和范围条件 1 等值条件 C1 X C1 X OR C1 Y 会被优化成C1 IN X Y C1 IN X Y 这种形式的我们都叫做等值条件 2 范围
  • Linux 安装Xrdp,实现RDP连接

    linux 安装xrdp RDP 连接 安装前提 root 权限 root server 76 conf yum install xrdp root 权限 安装 yum install xrdp Loaded plugins fastest
  • Eigen不同的方法来求矩阵的逆的效率

    背景 不同尺寸的矩阵 求逆使用不同的方法 会有不同的效率的 16x16矩阵的直接求逆与PartialPivLU的效率对比 本人亲测 1 实现代码 GetSystemTimeInMacroSecond的实现 boost posix time
  • 自适应卡尔曼滤波_【导师论坛】

    复杂噪声情况下的新型卡尔曼滤波器研究 主讲 黄玉龙 副教授 哈尔滨工程大学 时间 2019年1月17日 周四 14 30 16 30 地点 智能科学学院主楼401会议室 主讲人介绍 黄玉龙 博士 哈尔滨工程大学自动化学院副教授 2018年1
  • 远程代码执行漏洞的利用与防御

    什么是RCE漏洞 全称 remote command code execute 分为远程命令执行和远程代码执行 1 命令执行漏洞 直接调用操作系统命令 2 代码执行漏洞 靠执行脚本代码调用操作系统命令 一般出现这种漏洞 是因为应用系统从设计
  • 第十届蓝桥杯省赛Java B组 数的分解

    试题 D 数的分解 本题总分 10 分 问题描述 把 2019 分解成 3 个各不相同的正整数之和 并且要求每个正整数都不包 含数字 2 和 4 一共有多少种不同的分解方法 注意交换 3 个整数的顺序被视为同一种方法 例如 1000 100
  • mysql 数据恢复 binlog

    被删库勒索的一次记录 项目在云服务器运行了一年多了 中间迁移过一次 从阿里迁到华为了 迁移的时候把数据库文件 test sql 用完了之后就扔在了服务器上 最近访问系统的时候 忽然系统崩溃 表不存在了 数据库连接工具也连不上了 到服务器上的
  • torch.fx介绍

    Node Node类构造函数的各项参数如下 参考torch fx下的node py graph 指明实例化的Node属于哪个Graph op 节点的类型 一共有如下的几种类型 placeholder 占位符 一般代表输入 call meth