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

news2024/11/24 6:22:52

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 来提升模型的性能。

—— 完 ——

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/43353.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JUC并发编程

目录JUC概述什么是JUC进程与线程的概念线程的状态线程的方法并发与并行管程(Monitor)用户线程和守护线程Lock接口Synchronized 关键字Synchronized 作用范围Synchronized 实现卖票例子Lock接口什么是LockLock与synchronized的区别可重入锁&#xff08;ReentrantLock&#xff09…

剑桥大学哪些专业需要IB物理成绩?

如果IB学生申请目标是剑桥大学&#xff0c;那么申请哪些专业需要学习IBDP物理课程&#xff1f;要不要学习IBDP物理课程呢&#xff1f;剑桥大学&#xff1a;IB成绩要求高&#xff0c;招录竞争激烈 在申请英国大学之前&#xff0c;理性的申请者都会提前查看一下目标大学的学术成绩…

Python破解WIFI源代码,测试成功(暴力跑字典)

目录 1&#xff0c;先安装Python环境(这个不用多说了吧) 2&#xff0c;安装PyWifi 3,自己手工整理高频弱口令&#xff0c;不建议程序生成的字典&#xff0c;生成的字典成功率实在太低。 4&#xff0c;自己生成字典的算法&#xff1a; 5&#xff0c;破解WIF代码第一种&#…

NetCore多租户开源项目,快速后台开发企业框架,赚钱就靠她了

今天给大家推荐一个开源项目&#xff0c;基于.NetCore开发的、多租户的企业开发框架。 文章目录项目简介技术架构项目结构系统功能代码生成器部分功能截图项目地址项目简介 这是一个基于.Net和Layui、基于多数据库的多租户&#xff0c;敏捷开发优选框架。系统自带权限功能、数…

面向移动支付过程中网络安全的研究与分析

基础防护系统设计 4.1.1入侵监测系统 入侵监测系统&#xff08;IDS&#xff09;的部署主要是防治外界非法人员对银行网络进行攻击&#xff0c;及时发现非法人员的入侵行为&#xff0c;以确保能够立刻采取网络阻止措施。在银行网络中的关键部位部署入侵检测系统&#xff0c;可…

springboot中controller层代码优雅写法

在基于spring框架的项目开发中&#xff0c;必然会遇到controller层&#xff0c;它可以很方便的对外提供数据接口服务&#xff0c;也是非常关键的出口&#xff0c;所以非常有必要进行规范统一&#xff0c;使其既简洁又优雅。 controller层的职责为负责接收和响应请求&#xff0c…

快手资讯|快手推出多档世界杯相关节目

1、快手直播间上线“相亲角”功能 近日&#xff0c;快手直播间上线了“相亲角”功能&#xff0c;可为主播打造相亲功能。 此外&#xff0c;快手还在“热门活动”中推出了“婚庆”频道&#xff0c;主要展示“婚礼现场”、“婚纱照”等短视频内容。企查查App显示&#xff0c;北京…

博主常用的 idea 插件,建议收藏!!!

一、Key Promoter X **快捷键提示工具&#xff1a;**每次操作&#xff0c;如果有快捷键&#xff0c;会提示用了什么快捷键。 二、Maven Helper maven 助手&#xff1a;展示 jar 包依赖关系 三、Lombok 只需加上注解 什么get set 什么toString 等等方法都不需要写 四、MyBati…

Postman下载安装注册登录简介登录后界面简介

一、为什么选择Postman? 如今&#xff0c;Postman的开发者已超过1000万(来自官网)&#xff0c;选择使用Postman的原因如下:1、简单易用 - 要使用Postman&#xff0c;你只需登录自己的账户&#xff0c;只要在电脑上安装了Postman应用程序&#xff0c;就可以方便地随时随地访问…

小程序上新(2022.11.15~11.28)

20221115 小程序基础库 2.27.3 更新 更新 框架 设备 VoIP 能力授权更新 框架 支持 worker 代码打包到小程序&小游戏分包 详情更新 组件 scroll-view 接近全屏尺寸时默认开启点击回到顶部更新 API createVKSession 在不需要用到摄像头的时候不再发起摄像头授权 详情修复 框…

elasticsearch7.6.2和logstash安装和初步

一、linux安装 参考以下链接&#xff1a; Linux&#xff08;centos7&#xff09;如何部署ElasticSearch7.6.2单节点跟集群&#xff08;es部署指南&#xff09; 二、window安装 参考下文更加详细&#xff1a;windows ElasticSearch 7.6.0集群搭建 2.1 下载elasticsearch7.6.…

开源多商户商城源码代码分析

如今&#xff0c;互联网几乎普及到了所有地区&#xff0c;同时也推动了传统行业发展。目前&#xff0c;越来越多的线下商家开始搭建多商户商城系统&#xff0c;打造属于自己的淘宝、天猫电商服务平台。什么是多商户商城系统呢&#xff1f;想必大部分人并不是很了解&#xff0c;…

多线程基本概念

多线程多线程基本概念线程控制创建终止等待分离线程安全基本概念实现互斥互斥锁死锁同步线程应用生产者与消费者模型线程池单例模式多线程基本概念 线程是进程中一个执行流程&#xff0c;是 CPU 进行执行调度的基本单元&#xff1b; 进程是系统进行资源分配的基本单元。 Linu…

SpringBoot很熟?那手撕一下自定义启动器吧

一. 前言 哈喽&#xff0c;大家好&#xff0c;不知道你有没有想辉哥呢&#xff1f;我可是很想你们哟&#xff01;最近金九银十&#xff0c;又有不少小伙伴私信辉哥&#xff0c;说自己在面试时被问到SpringBoot如何自定义启动器&#xff0c;结果自己不知道该怎么回答。那么今天…

maltose-BSA 麦芽糖-牛血清白蛋白 BSA-PEG-maltose,牛血清白蛋白-PEG-麦芽糖

maltose-BSA 麦芽糖-牛血清白蛋白 BSA-PEG-maltose,牛血清白蛋白-PEG-麦芽糖 中文名称&#xff1a;麦芽糖-牛血清白蛋白 英文名称&#xff1a;maltose-BSA 纯度&#xff1a;95% 别称&#xff1a;牛血清白蛋白修饰麦芽糖&#xff0c;BSA-麦芽糖 麦芽糖-聚乙二醇-牛血清白…

设计模式日常学习(七)

6.5 状态模式 6.5.1 概述 【例】通过按钮来控制一个电梯的状态&#xff0c;一个电梯有开门状态&#xff0c;关门状态&#xff0c;停止状态&#xff0c;运行状态。每一种状态改变&#xff0c;都有可能要根据其他状态来更新处理。例如&#xff0c;如果电梯门现在处于运行时状态…

什么是副业思维,副业应该怎么做,用创业思维分析副业的可行性

副业其实也算是创业的一种&#xff0c;他考量的不仅仅是自身的知识储备&#xff0c;还有你对市场的看法&#xff0c;再加上一定的做副业的技巧&#xff0c;下面分享七个做好副业的技巧​。 1.循序渐进投入 不要大量投资。首先&#xff0c;使用相对较轻的方法来验证创业理念是否…

教程六 在Go中使用Energy创建跨平台GUI - 应用下载事件

教程-示例-文档 介绍 Energy应用下载文件时触发的下载事件和使用 我们在页面上下载文件时&#xff0c;可以对文件下载时的处理&#xff0c;例如&#xff1a;保存路径&#xff0c;下载取消&#xff0c;开始、暂停。 下面将用代码和注释&#xff0c;和简要的说明来演示 Go代码…

GUI编程--PyQt5--布局管理

文章目录布局管理布局步骤QHBoxLayout & QVBoxLayoutQFormLayoutQGridLayout布局管理 布局&#xff0c;按照一定规则&#xff0c;将子控件放入父控件 手动布局&#xff1b;绝对布局move & resize & resizeEvent布局管理器&#xff0c;实现快速布局&#xff0c;是…

08 SQL优化

上一篇文章记录了索引的创建、使用、设计&#xff0c;除了索引方面还需要注意平日对于SQL的使用&#xff0c;对SQL进行优化&#xff1b;SQL的优化是建立在索引使用的基础上 这篇笔记将从以下7个方面对SQL进行优化。 1. 插入数据 使用批量插入,避免循环单条插入 注意批量插入不…