加快10倍!GPT-Fast来了!使用原生 PyTorch 加速生成式 AI

2023-12-05

点击下方 卡片 ,关注“ CVer ”公众号

AI/CV重磅干货,第一时间送达

点击进入—> 【视觉和Transformer】微信交流群

扫码加入CVer知识星球 可以最快学习到最新顶会顶刊上的论文idea 和CV从入门到精通资料,以及最前沿项目和应用!发论文,强烈推荐!

4d5739ef11702c38137226bc3dc73bde.jpeg

转载自:量子位(QbitAI)

PyTorch团队让大模型推理速度加快了 10倍

且只用了不到 1000行的纯原生PyTorch代码

项目名为 GPT-fast ,加速效果观感是这样婶儿的:

1fd134bb53a0d5678dd219bceef70ced.gif

通畅,属实通畅!

重点是,团队直接放出了代码以及详细“教程”。还是简笔画版的那种,特别好理解。

开发团队成员@Horace He表示:

我们不把它看作是库或者框架,更希望大家能把它当成个例子,根据自己的需求“复制粘贴”。

d6826c4dc9880f0bf23ae07cd3ca5f88.png

网友直接炸开锅,英伟达AI科学家Jim Fan评价道:

这是自Andrej Karpathy发布的minGPT以来最棒的教程式repo之一!

开源世界需要更多minGPT、GPT-Fast这样的项目!

220ae4a2582ec4c9c6dcacf731609165.png

那么GPT-fast究竟是如何给大模型提速的?

开盒大模型“加速包”

总的来说,用到这几种方法:

  • Torch.compile :一个专门为PyTorch模型设计的编译器,可以提升模型运行效率。

  • GPU量化 :通过减少计算的精度来加速模型的运算速度。

  • 推测性解码 :使用一个较小的模型来预测较大模型的输出,以此加快大语言模型的运算。

  • 张量并行性 :通过在多个硬件设备上分布模型的运算来加速处理速度。

下面我们来一一展开。

开发团队一开始使用简单的PyTorch来实现,但效果不佳(25.5 tok/s):

7701f19c12ab0690920e9877239d9842.png

他们查看跟踪后发现,一个原因是推理性能由于CPU过多占用而受限。

5963c585ad896226e6ba1758baefdf6e.png

那么如何解决呢?

可以想象这样一个场景,GPU是一个庞大的工厂(拥有大量可用的算力),而CPU则是一个小推车,来回为工厂“供货”。

在很多情况下,CPU无法足够快地“喂”GPU。

因此,开发团队建议给GPU更多的工作量,或者说 一次性给它更大“块”的任务 来处理。

c0ca85aa44589b594bdefa70450fa7a4.png

在推理过程中要做到这一点,可以引入 torch.compile

torch.compile能够捕获模型中更大的区域,并将其编译成单一的编译区域。特别是当以“reduce-overhead”模式运行时,它非常有效地减少了CPU的开销。

效果立竿见影,性能直接提升了4倍,从25 tok/s提高到107 tok/s:

ece3e5619aa518d2cda9d2572f6d9f8c.png

接下来,开发团队想进一步提升速度,但遇到了 内存带宽 瓶颈。

开发团队计算了模型的带宽利用率,结果已经达到了72%:

557215817afa7244cbbc487dd37f64f8.png

也就是说进一步提高速度的空间可能有限。

重新审视上面的方程式,团队发现虽然实际上不能改变模型参数量,也不能改变GPU的内存带宽(至少在不花更多钱的情况下),但可以改变存储每个参数所用的 字节数

4f724ca81857e7651603ae09862d0dba.png

这意味着,虽然无法改变模型的大小或者升级硬件来提高性能,但可以通过减少存储模型参数所需的数据量来提高效率。

通常可以通过量化技术来实现,即减少表示每个参数所需的位数。

e463a2646dd8db686580c79a8dc560d6.png

由此,开发团队引入了下一个技术—— int8量化

采用int8权重量化减少了内存负载,进一步提升了性能(157.4 tok/s):

7f6518c0bc622d24448297aee26b57a5.png

使用量化后还有一个问题:要生成100个token,必须加载(或调用)模型权重100次。频繁加载模型权重也会导致效率低下。

d612d4b3cabe827b33bf2dc26d47487e.png

乍一看,好像没有什么解决的法子,因为在自回归生成模式中存在着严格的序列依赖关系。

但开发团队指出,通过利用推测性解码可以打破这种严格的序列依赖关系。

0832b28706179a2f9a81f93523e67e34.png

再来打个比方,想象有一个资深工程师Verity,他在技术决策上总是正确,但编写代码的速度相对较慢。

同时,还有一个初级工程师Drake,和Verity相反,不擅长技术决策,但编写代码的速度更快、成本也更低。

3ecec3ed18697f47acdf8b8be4a5c9f4.png

那么如何利用不同人的优势来提高整体效率?

方法很简单,先让Drake编写代码,并在此过程中做出技术决策。接下来,将代码交给Verity进行审查,不对的地方就让Drake重做。

d9c91443d526fdad7b9066d9c4805267.png

在Transformer模型推理中,大型的验证模型即为Verity角色,Drake则是一个更小的、能更快生成文本的草稿模型。

开发团队使用草稿模型生成8个token,然后使用验证模型 并行处理 ,丢弃不匹配的部分。

由此一来,打破了串行依赖,再次提高速度。

值得一提的是,推测性解码不会改变输出的质量。只要使用草稿模型生成token+验证这些token所需的时间少于单独生成这些token所需的时间,这种方法就是有效的。

而且使用原生PyTorch实现这种技术实际上非常简单,整个实现过程只需要大约50行原生PyTorch代码。

304d62d72c558dc89d2483b1366462df.png

由于AMD也支持Triton和torch.compile后端,因此之前在Nvidia GPU上应用的所有优化也可以在AMD GPU上重新应用。

开发团队观察到int8量化的加速从22 tok/s达到102 tok/s:

86dd05ce1378be3e0c02ca8c0cbad787.png

之后开发团队又用了int4量化,进一步提升速度,但模型准确性有所下降。

因此使用了分组量化和GPTQ降低权重大小。

f40b80fa29f0e53bd90842922b2ad7d7.png

最后在保证准确性的前提下,速度提升至202.1 tok/s:

b79124b2a2997a1b48753417ab27a24c.png

将以上技术结合使用,达到更高速度244.7 tok/s:

80600d88145a260e02134a0c1ca429c2.png

到目前为止,研发团队一直都是在单个GPU上提速。但其实很多情况下是可以使用多个GPU的。

而使用多个GPU可以增加内存带宽,从而提高模型的整体性能。

1ee07bf6799bad874cf63d206b4e6338.png

在选择并行处理策略时,需要在多个设备上分割一个token的处理过程,所以需要使用张量并行性。

而PyTorch也提供了用于张量并行性的底层工具,可以与torch.compile结合使用。

开发团队还透露也正在开发用于表达张量并行性的更高级别的API。

然而,即使没有更高级别的API,添加张量并行性也很容易,150行代码即可实现,且不需要对模型进行任何改变。

b58143d5e8c68248f88ec420e2936fcf.png

之前提到的所有优化都可以与张量并行性相结合。将这些优化结合起来,能够以55 tokens/s的速度为Llama-70B提供int8量化。

acabb093ba127e155e491fe2e2a78693.png

最后总结成果,忽略量化,仅用766行代码(model.py 244行代码,generate.py 371行代码,tp.py 151行代码),就实现了快速推理、推测性解码和张量并行性。

对于Llama-7B,使用compile+int4量化+推测性解码速度达到241 tok/s。对于Llama-70B,通过加入张量并行性,达到80 tok/s。

这些性能都接近或超越了当前SOTA。

参考链接:
[1]https://pytorch.org/blog/accelerating-generative-ai-2/?utm_content=273712248&utm_medium=social&utm_source=twitter&hss_channel=tw-776585502606721024
[2]https://twitter.com/DrJimFan/status/1730298947376443698
[3]https://twitter.com/cHHillee/status/1730293330213531844

CVPR / ICCV 2023论文和代码下载


  

后台回复: CVPR2023, 即可下载CVPR 2023论文和代码开源的论文合集

后台回复:ICCV2023,即可下载ICCV 2023论文和代码开源的论文合集
计算机视觉和Transformer交流群成立
扫描下方二维码,或者添加微信:CVer444,即可添加CVer小助手微信,便可申请加入CVer-计算机视觉或者Transformer 微信交流群。另外其他垂直方向已涵盖:目标检测、图像分割、目标跟踪、人脸检测&识别、OCR、姿态估计、超分辨率、SLAM、医疗影像、Re-ID、GAN、NAS、深度估计、自动驾驶、强化学习、车道线检测、模型剪枝&压缩、去噪、去雾、去雨、风格迁移、遥感图像、行为识别、视频理解、图像融合、图像检索、论文投稿&交流、PyTorch、TensorFlow和Transformer、NeRF等。
一定要备注:研究方向+地点+学校/公司+昵称(如目标检测或者Transformer+上海+上交+卡卡),根据格式备注,可更快被通过且邀请进群


  
▲扫码或加微信号: CVer444,进交流群
CVer计算机视觉(知识星球)来了!想要了解最新最快最好的CV/DL/AI论文速递、优质实战项目、AI行业前沿、从入门到精通学习教程等资料,欢迎扫描下方二维码,加入CVer计算机视觉(知识星球),已汇集近万人!

▲扫码加入星球学习

  
▲点击上方卡片,关注CVer公众号

整理不易,请点赞和在看 562530a9cbb60d854b894f6cc3d292c4.gif

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

加快10倍!GPT-Fast来了!使用原生 PyTorch 加速生成式 AI 的相关文章

随机推荐

  • 部门新来的00后太猛了,老油条表示真干不过...

    在程序员职场上 什么样的人最让人反感呢 是技术不好的人吗 并不是 技术不好的同事 我们可以帮他 是技术太强的人吗 也不是 技术很强的同事 可遇不可求 向他学习还来不及呢 真正让人反感的 是技术平平 却急于表现自己的人 每天加班到12点 在老
  • js 解析表达式,js的算法案例

    大家好 给大家分享一下js 解析表达式 很多人还不知道这一点 下面详细解释一下 现在让我们来看看 01 模拟实现 new 首先 这里呢 先简单说明一下 new 关键字的基本作用 有以下三点 创建一个新的对象 把Person方法的原型 pro
  • 一致性哈希算法,hash(key)是负值时,会出现异常吗?

    一致性哈希算法 hash key 是负值时 会出现异常吗 一致性哈希算法中 哈希函数hash key 的返回值通常是一个非负整数 如果hash key 返回负值 则可能会出现一些问题 例如无法正确地映射对象到哈希环上的位置 或者无法正确地找
  • MySQL中,什么是 crash-safe?

    crash safe 是指发生宕机等意外情况下 服务器重启后数据依然不会丢失的情况 在MySQL中 crash safe 是指数据库系统在发生意外崩溃或故障时 能够保证数据的一致性和持久性 具体来说 一个 crash safe 的数据库系统
  • 【源码篇】基于SpringBoot+thymeleaf实现的大学生自习室座位预定系统

    文章目录 系统介绍 管理员 学生 技术选型 成果展示 账号地址及其他说明 系统介绍 基于SpringBoot thymeleaf实现的大学生自习室座位预定系统是为座位管理打造的一款在线管理平台 它可以实时完成信息处理 使其系统化和规范化 系
  • 关于#java#的问题:该文件夹下有两个文件file1和file2,请将files文件夹从原位置整体复制到其他磁盘中

    现有一个文件夹files 该文件夹下有两个文件file1和file2 请将files文件夹从原位置整体复制到其他磁盘中 import java io File import java io IOException import java n
  • 请老师修改论文怎么说【一文读懂】

    大家好 今天来聊聊请老师修改论文怎么说 希望能给大家提供一点参考 以下是针对论文重复率高的情况 提供一些修改建议和技巧 请老师修改论文怎么说 一 引言 在学术领域 论文的质量和准确性是至关重要的 当我们在撰写论文时 可能会遇到各种问题 如语
  • python使用numpy实现高斯核并对数据进行高斯滤波

    自定义高斯核 size为一个数表示一维高斯核 两个数的列表表示二维高斯核 import numpy as np def gaussian filter size sigma if type size int siz int size 1 2
  • MySQL中,redolog 和 binlog 有什么区别?

    MySQL中 redolog 和 binlog 有什么区别 概述 redo log 重做日志 和 binlog 归档日志 都是 MySQL 的重要的日志 它们的区别如下 redo log 是物理日志 记录的是 在某个数据页上做了什么修改 b
  • MySQL乐观锁有什么优点和缺点?

    因为没有加锁所以乐观锁的优点就是执行性能高 它的缺点就是有可能产生 ABA 的问题 ABA 问题指的是有一个变量 V 初次读取的时候是 A 值 并且在准备赋值的时候检查到它仍然是 A 值 会误以为没有被修改会正常的执行修改操作 实际上这段时
  • 数据库SQL中的三个语句:DROP、TRUNCATE 、DELETE 以上三种的区别? 效率?

    数据库SQL中的三个语句 DROP TRUNCATE DELETE 以上三种的区别 效率 DROP TRUNCATE和DELETE是数据库SQL中用于删除数据或表的三种不同语句 它们之间有以下区别 1 DROP DROP用于删除整个表 包括
  • js必须掌握的知识点,javascript基础笔记

    本篇文章给大家谈谈js必须掌握的知识点 以及javascript基础笔记 希望对各位有所帮助 不要忘了收藏本站喔 JavaScript 1 JavaScript介绍 Java 语言诞生主要是完成页面的数据验证 因此它运行在客户端 需要运行浏
  • MySQL中,优化锁方面你有什么建议?

    MySQL中 优化锁方面你有什么建议 思路 尽量使用较低的隔离级别 精心设计索引 并尽量使用索引访问数据 使加锁更精确 从而减少锁冲突的机会 选择合理的事务大小 小事务发生锁冲突的几率也更小 给记录集显示加锁时 最好一次性请求足够级别的锁
  • 数据库日期类型dateTime,java用Date接收结果多一个.0

    问题 MySQL数据库表里数字段时date类型的字段 Java用string接收会莫名多一个 0 解决方法 1 字段换成date 2 用substring截取
  • C#有像Java ThreadLocal的类似实现吗?

    在C 中 可以使用 ThreadLocal
  • 低成本扩大输入分辨率!华科大提出Monkey:新的多模态大模型

    点击下方 卡片 关注 CVer 公众号 AI CV重磅干货 第一时间送达 点击进入 gt 超分和Transformer 微信交流群 扫码加入CVer知识星球 可以最快学习到最新顶会顶刊上的论文idea 和CV从入门到精通资料 以及最前沿项目
  • [转]HTML中 ;      等6种空白空格的区别

    HTML提供了5种空格实体 space entity 它们拥有不同的宽度 非断行空格 nbsp 是常规空格的宽度 可运行于所有主流浏览器 其他几种空格 ensp emsp thinsp zwnj zwj 在不同浏览器中宽度各异 nbsp 它
  • 创建java类,抽象类,实例化类源码演示

    创建一个名叫Example java类文件 定义一个常量PI 3 14 定义一个圆类Circle 包含属性半径radius等 定义两个抽象方法 一个是计算面积的getArea 一个是计算周长的getPer 在main方法中 创建Circle
  • ebpf简述

    0 什么是ebpf Ebpf可以简单的理解成在linux内核 当然windows也已经支持 里添加了一个虚拟机 开发者编写的代码可以安全地在内核虚拟机中运行 这样可以更高效地 安全地实现内核级程序的编写 ebpf 的map机制可以实现内核态
  • 加快10倍!GPT-Fast来了!使用原生 PyTorch 加速生成式 AI

    点击下方 卡片 关注 CVer 公众号 AI CV重磅干货 第一时间送达 点击进入 gt 视觉和Transformer 微信交流群 扫码加入CVer知识星球 可以最快学习到最新顶会顶刊上的论文idea 和CV从入门到精通资料 以及最前沿项目