Meta 内部都在用的 FX 工具大起底:利用 Graph Transformation 优化 PyTorch 模型

Pytorch推出fx,量化起飞 pytorch推出了fx工具包,能做什么事情呢? 阅读详情

PyTorch 中的 graph mode 在性能方面表示更为出色,本文介绍 Torch.FX 这个强大工具,可以捕捉和优化 PyTorch 程序 graph。

一、简介

PyTorch 支持两种执行模式:eager mode 和 graph mode。

eager mode 中,模型中的运算符在读取时会立即执行,它易于使用,对机器学习从业者更友好,因此被设置为默认的执行模式。

graph mode 中,运算符先被合成一个 graph,然后作为一个整体进行编译和执行,它的性能更高,因此在实际生产中大量使用。

具体来说,graph mode 支持算子融合,两个算子通过合并,可以降低或本地化内存读取以及内核启动总开销。

融合可以是横向 (horizontal) 的:采取应用于多个  operand 的单一操作(如 BatchNorm),并将这些  operand 合并到一个数组中。

融合也可以是纵向 (vertical) 的:将一个内核与另一个内核合并,后者需要使用第一个内核的输出(如 ReLU 后接卷积)。

Torch.FX(缩写为 FX)是一个公开可用的工具包,作为 PyTorch 软件包的一部分,支持 graph mode 的执行。它可以:

1. 从 PyTorch 程序中获取 graph

2. 允许开发者在获取的 graph 上编写 transformation

Meta 内部先前已经在用 FX 来优化生产模型 (production model) 的训练吞吐量 (training throughput)。本文将通过介绍 Meta 开发的基于 FX 的优化,来展示利用图结构转换 (graph transformation) 优化 PyTorch 部署模型性能的方法。

二、背景

embedding table 广泛存在于推荐系统中,本节将介绍 FX 和 embedding table 的背景知识。

2.1. FX 

图 1 是一个简单示例,演示了如何用 FX 转换  PyTorch 程序,它包含三个步骤:

  •  从程序中获取 graph

  • 修改 graph(在本例中,我们用 GELU 代替 RELU)

  • 从修改后的 graph 中生成一个新程序

图1:在 PyTorch 模块中用 GELU 取代 RELU 的 FX

FX API 为检查和转换 PyTorch 程序 graph 还提供了许多其他功能。

2.2. embedding table 

图2:批尺寸=1 的稀疏特征 embedding table 示意图

在推荐系统中,稀疏特征(例如,User ID,Story ID)由 embedding table 表示。

embedding table E 是一个 HxD 矩阵,其中 H 是哈希大小,D 是嵌入向量维度。E 的每一行都是一个浮点数向量。

feature hashing 的作用是将一个稀疏特征映射到 E的索引列表中,例如 [S1,S2,...,Sk],其中 0≤Si<H。它的输出值计算为 f(E[S1], E[S2],...,E[Sk]),其中 E[Si] 是 Si 行的向量,f  是池化函数,通常是 sum,average,max 三个函数之一。

为了充分利用 GPU,稀疏特征通常为批处理。批处理中的每个实体都有自己的索引列表。如果一个批次有 B 个实体,可以简单理解为一个表征有 B 个索引列表。

更为严谨的表示方法是将 B 个索引列表合并成一个索引列表,并添加一个索引长度的列表(该批中的每个实体都有一个长度 length)。

例如,如果一批包含 3 个实体,其索引列表如下:

  •  Entity 1: indices = [10, 20]

  •  Entity 2: indices = [5, 9, 77, 81]

  •  Entity 3: indices = [15, 20, 45]

则完整批尺寸的 indice 和 length 将是:

  •  Indices = [10, 20, 5, 9, 77, 81, 15, 20, 45]

  •  Lengths = [2, 4, 3]

而整个 batch 的 embedding table 查询,输出为是一个 BxD 矩阵。

三、3 种 FX Transformation 

PyTorch 更新了 3 个 FX transformation,以加速对 embedding table 的访问,本节将逐一介绍。

下文 3.1 关于将多个小输入张量结合成一个大张量的转换;3.2 关于将多个并行计算链融合成一个计算链的转换;3.3 关于将通信与计算重叠的转换。

 3.1 结合输入稀疏特征 

batch 中的每个输入稀疏特征,都可以表示为两个列表:一个索引列表和一个 B length 列表,其中 B 表示批尺寸。

在 PyTorch 中,这两个列表都可以以张量的形式存在。当 PyTorch 模型在 GPU 上运行时,embedding table 通常存储在 GPU 内存中(它更接近 GPU,读写带宽比 CPU 内存更高)。

需要使用输入稀疏特征时,两个张量都要先从 CPU 复制到 GPU。然而每个主机到设备的内存复制都需要启动内核,这对于实际的数据传输来说,会更加耗费时间。

如果一个模型使用了多个输入稀疏特征,这种复制可能成为性能瓶颈(例如,1000 个输入稀疏特征将需要从主机到设备复制 2000 个张量)。

一个减少主机到设备 memcpy 数量的优化方法,就是在多个输入稀疏特征发送到设备之前,先将其进行组合。

例如,给定以下三个输入特征:

  •  Feature_A: indices = [106, 211, 7], lengths = [2, 1]

  •  Feature_B: indices = [52, 498, 616, 870, 1013], lengths = [3, 2]

  •  Feature_C: indices = [2011, 19, 351, 790], lengths = [1, 3]

组合后的形式为:

Features_A_B_C: indices = [106, 211, 7, 52, 498, 616, 870, 1013, 2011, 19, 351, 790], lengths = [2, 1, 3, 2, 1, 3]

所以不需要从主机到设备复制 3x2=6 个张量,只需要复制 2 个张量。

图 3(b) 描述了这种优化的实现,它包含两个组件:

  •  CPU 端:输入 pipeline 被修改为将所有稀疏特征的 indices 组合成一个张量,所有 length 组合成另一个张量。然后将这两个张量复制到 GPU 上。

  •  GPU 端:使用 FX,在模型 graph 中插入一个Permute_and_Split 算子,从合并的张量中恢复单个特征 indices 和 length 张量,并将其发送至下游的相应节点。

 

优化前:两个张量都要从 CPU 复制到 GPU

优化后:将输入稀疏特征进行组合

3.2 从访问 embedding table 开始的计算链横向融合 

在一个生产模型中,每个 GPU 上有 10 个 embedding table 很常见。出于性能方面的考虑,对这些 table 的查询被分到一组,这样它们的输出就被串联在一个大张量中(见图 4(a)中的红色部分)。

为了对单个特征输出进行计算,使用 Split 算子将大张量分成 N 个小张量(其中 N 为特征的数量),然后将所需的计算应用于每个张量。

如图 4(a) 所示,应用于每个特征输出 O 的计算是Tanh(LayerNorm(O))。所有的计算结果都被串联成一个大的张量,然后传递给下游的算子(图 4(a) 中的 Op1)。

这里主要的 runtime cost 是 GPU 内核启动的开销。例如,图 4(a) 中的 GPU 内核的启动次数为 2*N+3(图中的每个椭圆都表示一个 GPU 内核)。这会影响性能,因为 LayerNorm 和 Tanh 在 GPU 上的执行时间,与它们的内核启动时间相比很短。

此外,Split 算子可能会创建一个额外的嵌入向量输出张量的副本,消耗额外的 GPU 内存。

用 FX 来实现一种叫做横向融合 (horizontal fusion) 的优化,可以大大减少 GPU 内核的启动次数(在这个例子中,优化后的 GPU 内核启动次数为 5,见图 4(b))。

使用 Add_middle_dim 算子代替显式 Split,将 shape 为 (B, NxD) 的 2D 嵌入张量重塑为 shape 为 (B, N, D) 的 3D 张量。接下来将一个单一的 LayerNorm 应用到它的最后一维。对 LayerNorm 的结果应用一个 Tanh。最后,用 Remove_middle_dim 算子将 Tanh 的结果恢复成 2D 张量。

由于 Add_middle_dim 和 Remove_middle_dim 只是重塑张量,并没有创建额外的副本,所以也可以减少 GPU 内存的消耗。

优化前:所有输出被串联到一个大张量中

进行横向融合优化后

3.3 计算与通信间的重叠 (overlap) 

面向投产的推荐模型的训练,通常是在分布式 GPU 系统上完成的。由于每个 GPU 的设备内存容量不足以容纳模型中的所有 embedding table,因此需要将其分布在多个 GPU 上。

在训练步骤中,GPU 需要从其他 GPU 上的 embedding table 中读取/写入特征值。这被称为 all-to-all 通信,可能是影响性能的重要原因。

通过 FX 实现一个 transformation,可以将计算与 all-to-all 通信重叠。图 5(a) 显示了一个具备嵌入向量 table 访问 (EmbeddingAllToAll) 及其他算子的模型 graph 实例。如图 5(b) 所示,在没有任何优化的情况下,它们会在一个 GPU 流上顺序执行。

使用FX将 EmbeddingAllToAll 分成  EmbeddingAllToAll_Request和EmbeddingAllToAll_Wait,并在它们之间安排独立的算子。

图5:计算与通信的重叠

 3.4 总结 

表1:本节讨论的优化及解决的相应性能瓶颈

为了发现哪些模型会从这些 transformation 中受益,开发人员对 MAIProf 收集的运行在 Meta 数据中心的模型的性能数据进行分析。得出与 eager mode 相比,这些 transformation 在一组生产模型上实现了 2-3 倍的速度提升。

四、结语

从性能角度考量,PyTorch 中的 graph mode 比生产环境中使用的 eager mode 更受欢迎。FX 是一个强大的工具,可以捕捉和优化 PyTorch 程序 graph。本文展示了三种 FX transformation,用于优化 Meta 内部的生产推荐模型。

最后希望更多 PyTorch 开发者可以使用 graph transformation 来提升模型的性能。

​—— 完 ——

pytorch量化库使用(2) Eager 模式和 FX 图形模式量化 API 都为用户提供了一个钩子,以指定以自定义方式量化的模块,并使用用户定义的逻辑进行观察和量化。在转换模块交换期间,它将使用 (3) 中类的from_observed函数将 (2) 中指定类型的每个模块转换为(3) 中指定的类型。在准备模块交换期间,它将使用 (2) 中类的from_float函数将 (1) 中指定类型的每个模块转换为 (2) 中指定的类型。模型的输入和输出都是浮点张量,但量化模型中的激活是量化的,因此我们需要运算符在浮点和量化张量之间进行转换。 阅读详情

相关推荐

fxgraph:JavaFX图形编辑器

FXGraph FXGraph是javafx图形可视化工具。 这是我在stackoverflow上发现的帖子的延续。 拉取请求和功能请求表示赞赏。 您可以在这里找到原始问题: : 特征 可拖动节点 可调整大小的节点 缩放/平移 自定义节点和边 有向和无向边 随机布局 树形布局 顺序图 截屏 下载 您可以从Maven Central获取它 < dependency> < groupId>com.sirolf2009</ groupId> < artifactId>fxgraph</ artifactId> < version>0.0.3</ version> </ dependency> 用法 您可以查看以获取基本示例。 上面的屏幕快照中图形的相关代码如下 Graph graph = new Graph (); final Model model = graph

Pytorch Tutoriais (PROTOTYPE) FX GRAPH MODE QUANTIZATION USER GUIDE

Pytorch量化(四)

vivavivaa的博客 454

Cadence SKILL 语言实战指南:从函数列表到高效自动化脚本

本文是Cadence SKILL语言实战指南,旨在帮助芯片设计工程师从掌握核心函数列表出发,高效构建自动化脚本。文章详细解析了数据处理、数据库访问、流程控制及错误处理四类关键函数,并通过版图层批量修改与参数化单元生成两大实战场景,演示如何将函数组合成解决实际问题的自动化方案,从而显著提升Virtuoso环境下的工作效率。

beta5的博客 705

Pytorch Tutoriais (PROTOTYPE) FX GRAPH MODE POST TRAINING DYNAMIC QUANTIZATION

Pytorch量化(五)

vivavivaa的博客 370

zynq+LWIP 裸机双网口实现(MIO+EMIO)+程序下载

芯片型号: ZYNQ: XC7Z010clg400开发软件:Vivado2022 + Xilinx Vitis 2022网卡芯片:RTL8211FDI(需要根据网口芯片型号修改对应的硬件配置代码。

thinking in 小宇宙 3408

【Office激活】学校正版Office已激活成功仍弹出激活窗口

学校正版Office激活问题:已激活成功仍弹出激活窗口

ESCM_的博客 1万+

PyTorch笔记——FX

官方文档链接:https://pytorch.org/docs/master/fx.html# 概述 FX是供开发人员用于转换nn.Module实例的工具包。FX由三个主要组件组成:符号追踪:symbolic tracer, 中间层表示:intermediate representation, Python代码生成:Python code generation。这些组件的运行演示: import torch # Simple module for demonstration class MyModule(t

itlilyer的博客 2238

【win10+RAGFlow+Ollama】搭建本地大模型助手(教程+源码)

在当今科技飞速发展的时代,人工智能(AI)已经成为各行各业不可或缺的一部分。特别是在文档处理和数据分析领域,AI的应用更是无处不在。今天,我要向大家介绍一个开源的AI框架引擎——RAGflow。它能够在深度文档理解方面执行检索增强生成(Retrieval-Augmented Generation,简称RAG),并且被认为是目前最优秀的RAG框架之一。本文将详细探讨RAGflow的创新功能、技术特点以及如何在实际应用中发挥其最大潜力。

Yooao的博客 9618

eager模式和graph模式 Tensorflow

Tensorflow2的eager模式和graph模式(1)_哔哩哔哩_bilibili

VIEO 1081

利用按键精灵实现批量截图与智能命名的高效工作流

本文详细介绍了如何利用按键精灵软件构建高效的批量截图与智能命名自动化工作流。通过基础脚本编写、循环逻辑实现及高级命名策略,解决手动操作耗时易错的问题,帮助用户实现一键自动截图、智能保存与文件重命名,大幅提升软件测试、教程制作及数据报告等场景的工作效率。

weixin_29268267的博客 569

小龙虾OpenClaw卸载全攻略,彻底清理缓存和配置,干净无残留!

不想要的小龙虾OpenClaw怎么彻底卸载?🦞本文教你如何彻底的卸载OpenClaw⚡️,Windows/macOS/Linux通用,干净无残留🧹

XiaoqiangClub的博客 313

PyTorch `torch.fx.experimental` 实验性 API 全指南:动态形状、代理张量与图变换工具矩阵

`torch.fx.experimental` 是 PyTorch 中承载新一代图级编译与符号形状基础设施的“试验田”,`make_fx`、`ShapeEnv`、`ProxyTensor` 等被 torch.compile、动态形状与 torch.export 体系广泛依赖的能力都从这里孵化。本文以 [fx.experimental API 参考文档](https://link.gitcode.c

gitblog_01172的博客 724

⑩电子产品拆解分析-家用无线遥控开关433Mhz

①免布线随意贴,装上就能使用解决单线开关烦恼;②遥控配对简单,无线通讯距离长,信号可穿墙;

a6662580的博客 4702

录屏停止就能发出分享链接:开源 Loom 替代品 Cap 完整指南

录屏最耗时的往往不是按下 Record 的那一刻,而是停止之后:导出、压缩、传网盘、再复制一个链接,一套下来小半天就没了。Cap 是一款开源的 Loom 替代品,一次录制同时抓屏幕、摄像头和麦克风,点完停止基本就能复制出一个可分享的链接。它和同类工具体感上的最大差别是——录完立刻能用,而且视频放在官方云、你自己的 S3、还是纯本地,由你选。下面从"选哪条录制路径"讲起,到最短跑通、自建实例,再到源

gitblog_00395的博客 1040

Allan方差这个工具,怎么把它用的更顺手?(附Allan方差、动态Allan方差代码)

本文详细说明了Allan方差和动态Allan方差的计算过程,并通过递归运算和时间序列选择两种算法提高动态Allan方差的计算效率。文末提供了快速动态Allan方差计算代码。

victoryqian528的博客 374

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

AI 编译器全景解析:从朴素编译器到通用编译器的演进、通用架构与未来挑战

AI 编译器是连接神经网络模型与异构 AI 芯片之间的关键桥梁,它通过将训练好的模型或高层语言程序转换为可在特定硬件上高效执行的代码,帮助开发者摆脱手工优化算力的人力成本。本文基于 AISystem 项目中《AI 编译器》章节的系列文档,系统梳理 AI 编译器诞生的背景与必要性、三阶段发展历程、通用架构(前端/后端、IR、优化 Pass)以及当前主流编译器(TVM、XLA、nGraph、TC、Gl

gitblog_00315的博客 607

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

PyTorch FX 功能提供了哪些新的使用场景

在实际应用中,许多情况下我们需要引入一些特殊的运算或算法,这些运算可能无法直接通过现有的PyTorch 操作符实现。这时,PyTorch FX 的自定义算子支持就显得尤为重要。借助于IR 和模型变换API,开发者可以方便地将自定义算子集成到模型中。比如,在图像处理领域,我们可能会遇到一些非标准的卷积核设计,或者在自然语言处理中需要实现特定的注意力机制。通过PyTorch FX,我们可以将这些特殊需求转化为高效的自定义算子,并无缝嵌入到现有模型中。

cda2024的博客 633

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

OpenVX 的 立即模式(immediate mode)和图模式(graph mode)和示例讲解

openvx 中 程序执行的两种方式,immediate mode 和 graph mode

恍恍惚惚的大穷猫的博客 2844

用沐神的方法阅读PyTorch FX论文

0x0. 动机 最近沐神在B站上分享了一些经典论文的阅读视频,我也跟着看了几个比如TransFormer,VIT等,很赞。所以我就想跟着沐神这种方法来实践一下,找一篇论文来阅读一下。目前我比较关注的是工程方向的论文,正好上周PyTorch 放出了它们FX的论文,所以就以这篇论文为例来试试沐神的论文阅读方法。沐神的论文阅读方法大概是这样(数字代表先后顺序): 标题 摘要 引言 结论 相关工作 FX特性 实验 评论 PyTorch FX论文的链接在:https://arxiv.org/pdf/2112.08

I good vegetable a! 1401

tensorflow的eager和graph模式

https://www.bilibili.com/video/BV1sT4y1G7Eb?from=search&seid=1803304955133154614

y_woshixiaowen的博客 654

【MindSpore学习打卡】初学教程-09使用静态图加速-使用静态图加速你的MindSpore模型

动态图模式的特点是计算图的构建和计算同时发生(Define by run)。这种模式下,代码的执行方式类似于Python的解释执行,能够实时得到中间结果,非常适合模型调试。ms.set_context(mode=ms.PYNATIVE_MODE) # 设置为动态图模式nn.ReLU(),nn.ReLU(),

weixin_43427267的博客 970

秒懂Flink:大数据开发面试技巧与简历优化

在竞争激烈的大数据开发领域,Flink作为流处理的领军技术已成为面试必考点。本文将结合GitHub加速计划的**flink_second_understand**项目资源,从核心知识点梳理、简历优化策略到面试应答技巧,全方位助你拿下Flink岗位offer。该项目包含200+Flink教程知识点与实战代码,覆盖Datastream、Table API、Window、State等核心组件,是备考Fl

gitblog_00453的博客 802

pytorch FX模型静态量化

以前面文章写到的mobilenet图像分类为例,本文主要记录一下pytorchh训练后静态量化的过程。

Y_snower的博客 2668

Pytorch Tutoriais (PROTOTYPE) FX GRAPH MODE POST TRAINING STATIC QUANTIZATION

Pytorch量化(六)

vivavivaa的博客 548

graphormer 代码阅读

看论文 论文中找到github代码连接 一开始论文刚发表时代码是没有公布的,后来过了一两个月才发布 运行他的代码 https://hub.xn–gzu630h.xn–kpry57d/microsoft/Graphormer github链接 下载到服务器上运行 进行环境准备和所需要的包安装时遇到问题:主要是torch-geometric的安装问题 最终解决方案是将下图中的最后两步换掉 安装torch按照pytorch官网步骤来,这里我的cuda版本是11.4,所以我安装了最新版本,1.9.1,使用conda

m0_47163076的博客 3367

torch.fx 简介与量化

pytroch发布的torch.fx工具包可以说是很好的消除一些动态图和静态图的Gap,可以使得我们对于nn.Module的各种变化操作变得非常简单。 动态图和静态图: 动态意味着程序将按照我们编写命令的顺序进行执行。这种机制将使得调试更加容易,并且也使得我们将大脑中的想法转化为实际代码变得更加容易。而静态则意味着程序在编译执行时将先生成神经网络的结构,然后再执行相应操作。按照动态图和静态图最明显的两个框架就是pytorch和tensorflow两个。 静态图的优势就在...

weixin_42638415的博客 5636
上一篇: 进 4 球得 1 分,阿根廷败北背后的科技与狠活
下一篇: TVM 从入门到精通 | 安装 TVM (Part 1)
HyperAI超神经
博客等级 码龄7年 8872粉丝 1753原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值