首页 > 业界 > 关键词  > PyTorch最新资讯  > 正文

使用PyTorch加速生成式 AI模型

2023-12-01 11:43 · 稿源:站长之家

站长之家(ChinaZ.com)12月1日 消息:PyTorch 团队发布了一篇名为《Accelerating Generative AI with PyTorch II: GPT, Fast》的博文,重点介绍如何使用纯原生 PyTorch 加速生成式 AI 模型。

正如最近在PyTorch 开发者大会上宣布的那样,PyTorch 团队从头开始编写了一个 LLM,其速度几乎比基线快10倍,并且没有损失准确性,所有这些都使用本机 PyTorch 优化。团队利用了广泛的优化,包括:

  • Torch.compile:PyTorch 模型的编译器

  • GPU 量化:通过降低精度运算来加速模型

  • 推测性解码:使用小型“草案”模型来预测大型“目标”模型的输出,加速大模型

  • 张量并行:通过在多个设备上运行模型来加速模型。

而且,更令人惊讶的是,他们可以用不到1000行的本机 PyTorch 代码来完成此任务。

具体步骤如下:

第1步:通过 TORCH.COMPILE 和静态 KV 缓存(107.0TOK/S)减少 CPU 开销

Torch.compile 允许我们将更大的区域捕获到单个编译区域中,特别是在使用 mode=”reduce-overhead” 运行时,对于减少 CPU 开销非常有效。在这里,我们还指定 fullgraph=True,它验证模型中没有“图形中断”(即 torch.compile 无法编译的部分)。换句话说,它确保 torch.compile 充分发挥其潜力。

要应用它,我们只需用它包装一个函数(或模块)即可。

torch.compile(decode_one_token,mode="reduce-overhead",fullgraph=True)

然而,这里有一些细微差别,使得人们通过将 torch.compile 应用于文本生成来获得显着的性能提升有些不简单。

第一个障碍是 kv 缓存。kv-cache 是一种推理时间优化,可缓存为先前标记计算的激活(请参阅此处以获取更深入的解释)。然而,当我们生成更多令牌时,kv-cache 的“逻辑长度”就会增长。由于两个原因,这是有问题的。一是每次缓存增长时重新分配(和复制!)kv-cache 的成本非常高。另一个问题是,这种动态使得减少开销变得更加困难,因为我们不再能够利用 cudagraphs 等方法。

为了解决这个问题,我们使用“静态”kv-cache,这意味着我们静态分配 kv-cache 的最大大小,然后屏蔽掉计算的注意力部分中未使用的值。

代码

第二个障碍是预填充阶段。Transformer 文本生成最好被视为一个两阶段过程:1. 处理整个提示的预填充,以及2. 自回归生成每个标记的解码。

尽管一旦 kv-cache 静态化,解码就可以完全静态化,但由于提示长度可变,预填充阶段仍然需要更多的动态性。因此,我们实际上需要使用单独的编译策略来编译这两个阶段。

编译

虽然这些细节有点棘手,但实际实现起来一点也不困难(参见 gpt-fast)!而且性能的提升是巨大的。

图表

突然之间,我们的性能提高了4倍以上!当工作负载受到开销限制时,这种性能提升通常很常见。

步骤2:通过 INT8仅权重量化缓解内存带宽瓶颈(157.4TOK/S)

那么,鉴于我们已经看到应用 torch.compile 带来了巨大的加速,是否有可能做得更好?思考这个问题的一种方法是计算我们与理论峰值的接近程度。在这种情况下,最大的瓶颈是将权重从 GPU 全局内存加载到寄存器的成本。换句话说,每次前向传递都要求我们“接触”GPU 上的每个参数。那么,理论上我们能够以多快的速度“触及”模型中的每个参数?

重量

为了衡量这一点,我们可以使用模型带宽利用率(MBU)。这衡量了我们在推理过程中能够使用的内存带宽的百分比。

计算它非常简单。我们只需获取模型的总大小(# params * 每个参数的字节数)并将其乘以每秒可以进行的推理数量。然后,我们将其除以 GPU 的峰值带宽即可得到 MBU。

管理单元

例如,对于我们上面的情况,我们有一个7B 参数模型。每个参数都存储在 fp16中(每个参数2个字节),我们实现了107个令牌/秒。最后,我们的 A100-80GB 理论内存带宽为2TB/s。

管理单元

将所有这些放在一起,我们得到 **72% MBU!**这相当不错,考虑到即使只是复制内存也很难突破85%。

但是……这确实意味着我们非常接近理论极限,并且我们显然在从内存加载权重方面遇到了瓶颈。我们做什么并不重要——如果不以某种方式改变问题陈述,我们可能只能再争取10% 的性能。

让我们再看一下上面的等式。我们无法真正改变模型中参数的数量。我们无法真正改变 GPU 的内存带宽(好吧,无需支付更多的钱)。但是,我们可以更改每个参数存储的字节数!

管理单元

因此,我们得出了下一个技术——int8量化。这里的想法很简单。如果从内存加载权重是我们的主要瓶颈,为什么我们不把权重做得更小呢?

管理单元

请注意,这仅量化权重 - 计算本身仍然在 bf16中完成。这使得这种形式的量化易于应用,并且精度几乎没有降低。

此外,torch.compile还可以轻松生成int8量化的高效代码。让我们再次看看上面的基准测试,这次包含了仅 int8权重量化。

代码

代码

从深蓝色线(torch.compile + int8)可以看出,使用torch.compile + int8仅权重量化时,性能有显着提升!而且,浅蓝色线(没有torch.compile + int8)实际上甚至比fp16性能还差很多!这是因为为了利用 int8量化的性能优势,我们需要融合内核。这显示了 torch.compile 的好处之一 - 可以为用户自动生成这些内核!

将 int8量化应用于我们的模型,我们看到性能提高了50%,达到157.4个令牌/秒!

图表

第3步:使用推测解码重新构建问题

即使使用了量化等技术,我们仍然面临另一个问题。为了生成100个代币,我们必须加载权重100次。

图表

即使权重被量化,我们仍然必须一遍又一遍地加载我们的权重,对于我们生成的每个令牌一次!有没有办法解决?

乍一看,答案似乎是否定的——我们的自回归一代存在严格的序列依赖性。然而,事实证明,通过利用推测解码,我们能够打破这种严格的串行依赖性并获得加速!

工程师

想象一下,您有一位高级工程师(称为 Verity),他做出了正确的技术决策,但编写代码的速度相当慢。然而,您还有一名初级工程师(称为 Drake),他并不总是做出正确的技术决策,但可以比 Verity 更快(而且更便宜!) 编写代码。我们如何利用 Drake(初级工程师)更快地编写代码,同时确保我们仍然做出正确的技术决策?

工程师

首先,Drake 经历了编写代码的劳动密集型过程,并在此过程中做出技术决策。接下来,我们将代码交给 Verity 进行审查。

工程师

在审查代码后,Verity 可能会认为 Drake 做出的前3个技术决策是正确的,但后2个需要重做。因此,Drake 回去,放弃了他最后的2个决定,并从那里重新开始编码。

值得注意的是,虽然 Verity(高级工程师)只看过一次代码,但我们能够生成3段与她编写的代码相同的经过验证的代码!因此,假设 Verity 能够比她自己编写这3段代码更快地审查代码,那么这种方法就会领先。

在变压器推理的背景下,Verity 将由更大的模型发挥作用,我们希望其输出用于我们的任务,称为验证器模型。同样,Drake 将由一个较小的模型来扮演,该模型能够比较大的模型(称为草稿模型)更快地生成文本。因此,我们将使用草稿模型生成8个令牌,然后使用验证者模型并行处理所有8个令牌,并丢弃不匹配的令牌。

如上所述,推测解码的一个关键特性是它不会改变输出的质量。只要使用草稿模型生成令牌 + 验证令牌所需的时间少于生成这些令牌所需的时间,我们就会领先。

在原生 PyTorch 中完成这一切的一大好处是,这项技术实际上非常容易实现!这是完整的实现,大约50行原生 PyTorch。

代码

尽管推测性解码保证我们在数学上与常规生成相比具有相同的结果,但它确实具有运行时性能根据生成的文本以及草稿和验证器模型的对齐程度而变化的属性。例如,当运行 CodeLlama-34B + CodeLlama-7B 时,我们能够在生成代码时获得2倍的令牌/秒提升。另一方面,当使用 Llama-7B + TinyLlama-1B 时,我们只能获得大约1.3倍的令牌/秒提升。

步骤4:使用 INT4量化和 GPTQ (202.1TOK/S) 进一步减小权重的大小

当然,如果将权重从16位减少到8位可以通过减少我们需要加载的字节数来实现加速,那么将权重减少到4位将导致更大的加速!

不幸的是,当权重减少到4位时,模型的准确性开始成为一个更大的问题。从我们的初步评估中,我们看到虽然使用仅 int8权重量化没有明显的精度下降,但使用仅 int4权重量化却有。

桌子

我们可以使用两个主要技巧来限制 int4量化的精度下降。

第一个是拥有更细粒度的缩放因子。考虑缩放因子的一种方法是,当我们有量化张量表示时,它处于浮点张量(每个值都有缩放因子)和整数张量(没有值有缩放因子)之间的滑动比例。例如,对于 int8量化,我们每行都有一个缩放因子。然而,如果我们想要更高的精度,我们可以将其更改为“每32个元素一个缩放因子”。我们选择组大小为32来最小化准确性下降,这也是社区中的常见选择。

另一种是使用比简单地对权重进行舍入更先进的量化策略。例如,GPTQ等方法利用示例数据来更准确地校准权重。在本例中,我们基于 PyTorch 最近发布的torch.export在存储库中原型化了 GPTQ 的实现。

此外,我们需要将 int4反量化与矩阵向量乘法融合的内核。在这种情况下,torch.compile 不幸地无法从头开始生成这些内核,因此我们在 PyTorch 中利用一些手写的 CUDA 内核。

这些技术需要一些额外的工作,但将它们组合在一起会产生更好的性能!

图表

第5步:将所有内容组合在一起(244.7TOK/S)

最后,我们可以将所有技术组合在一起以获得更好的性能!

图表

第6步:使用张量并行性

到目前为止,我们一直限制自己在单个 GPU 上最大限度地减少延迟。然而,在许多设置中,我们可以使用多个 GPU。这使我们能够进一步改善延迟!

为了直观地了解为什么这可以让我们改善延迟,让我们看一下 MBU 的先验方程,特别是分母。在多个 GPU 上运行使我们能够获得更多的内存带宽,从而获得更高的潜在性能。

管理单元

至于选择哪种并行策略,请注意,为了减少一个示例的延迟,我们需要能够同时在更多设备上利用内存带宽。这意味着我们需要将一个令牌的处理拆分到多个设备上。换句话说,我们需要使用张量并行性。

幸运的是,PyTorch 还提供了与 torch.compile 组合的张量并行的低级工具。我们还在开发用于表达张量并行性的更高级别的 API,请继续关注!

然而,即使没有更高级别的 API,添加张量并行性实际上仍然很容易。我们的实现只有150行代码,并且不需要任何模型更改。

代码

我们仍然能够利用前面提到的所有优化,所有这些优化都可以继续与张量并行性组合。将这些组合在一起,我们能够以55个令牌/秒的速度为 Llama-70B 提供 int8量化服务!

图表

结论

让我们看看我们能够实现什么目标。

  1. 简单性:忽略量化,model.py(244LOC)+generate.py(371LOC)+tp.py(151LOC)得出766LOC,实现快速推理+推测解码+张量并行。
  2. 性能:使用 Llama-7B,我们能够使用编译 + int4Quant + 推测解码来达到241tok/s。借助 llama-70B,我们还能够引入张量并行性以达到80tok/s。这些都接近或超过 SOTA 性能数据!

PyTorch 始终保持简单性、易用性和灵活性。然而,使用 torch.compile,我们也可以提高性能。

代码地址: https://github.com/pytorch-labs/gpt-fast

举报

  • 相关推荐
  • 大家在看
  • 万彩商图:快速更换商品图片背景,提升商品展示效果。

    万彩商图是一个在线设计工具,专注于帮助用户快速更换商品图片的背景,以提升商品的视觉效果和吸引力。它利用AI技术实现一键式操作,简化了传统图片编辑的复杂流程,使非专业用户也能轻松制作出专业的商品展示图。

  • AIEmoji:快速找到适合你情感的Emoji表情。

    AIEmoji是一个基于人工智能技术的Emoji搜索网站,它允许用户通过自然语言描述来搜索和找到匹配的Emoji表情。这项技术简化了Emoji的搜索过程,提高了用户在社交、写作和其他需要表情符号的场合的效率和表达能力。

  • Brev.ai:AI音乐生成器,几秒钟创作高质量音乐。

    Brev.ai是一款利用人工智能技术,根据用户输入的文本描述快速生成独特音乐作品的在线音乐创作工具。它基于Suno V3.5技术,支持多种音乐风格和流派,适用于视频、播客、游戏配乐等多场景。Brev.ai的主要优点包括高效率、成本效益高、易于使用,以及能够提供高质量的音乐输出。

  • 知了zKnown:致力于信息降噪 / 阅读提效的个人知识助手

    知了 zKnown 是一款 AI-Native 构建的个人知识助手,专注于信息降噪和阅读提效。它通过多端同步、多渠道总结、长文本支持等功能,帮助用户高效地管理和整理信息。产品的主要优点包括:- 多端同步:用户可以在移动app、桌面客户端、网页版、小程序等多个平台同步使用。- 多渠道总结:支持微信公众号、知乎、简书、36Kr、少数派等多个渠道的文章总结。- 长文本支持:最长支持总结3万字的文章内容。- 摘要导出:用户可以将摘要保存到 Notion、Flomo 等平台。- 产品背景:知了 zKnown 致力于通过 AI 技术提升用户的阅读和信息管理效率,适合需要高效处理大量信息的用户。

  • MBox AI Meet:实时转录与会议总结的谷歌会议扩展

    MBox AI Meet是一款免费Chrome扩展,专为Google Meet设计,提供实时转录和自动生成会议总结的功能。它利用AI技术帮助用户在会议中专注于讨论,而无需担心记笔记。该工具通过实时转录捕捉会议的每一个细节,并在会议结束后自动生成总结,确保用户不会错过任何重要信息。MBox AI Meet的隐私优先策略确保会议安全,不存储任何音频或视频内容。此外,该扩展还计划在未来更新中增加更多AI功能,如发言人识别、实时AI助手等。

  • Klee:本地安全AI,保障数据隐私。

    Klee是一款macOS原生的AI助手应用程序,专注于本地处理数据,确保数据安全和隐私。它使用先进的AI技术,如RAG(检索增强生成)和开源大型语言模型,如Llama 3和Mistral,为用户提供高效、智能的笔记、搜索和知识管理功能。Klee的主要优点包括本地运行以保护隐私、支持团队协作、免费使用以及优化的macOS体验。

  • Kipps.AI:快速构建AI助手,提升业务效率

    Kipps.AI 是一个在线平台,允许用户在短短两分钟内构建自己的AI助手,并将其集成到业务中。该平台支持多种数据源,如PDF、Notion、网站链接和文本,用户只需提供这些数据,Kipps.AI 会处理其余部分。它还与常用的工具如GoDaddy、Wordpress、Drupal、Squarespace、Magento和Wix等进行集成,使得用户可以轻松地将AI助手集成到现有的业务流程中。

  • CrossPrism for MacOS:图像识别、标注和关键词生成工具

    CrossPrism for MacOS 是一款专为摄影师设计的图像识别、标注和关键词生成工具。它利用多核 CPU、GPU 和神经引擎,能够识别物种、生成标题和描述,并支持模型训练的可定制性。用户可以在本地自动标注无限量的原始照片,确保所有照片安全地存储在 Mac 上,无需担心云服务中断、数据锁定或文件传输问题。其20多个专家模型可以对从鸟类到地标的各种内容进行分类,并提供新的视角来整理目录和重新发现旧照片。此外,它还支持视频处理、Lightroom 插件、图像质量评估等功能,使其成为一个强大的筛选工具。

  • ZETIC.ai:构建零成本的设备端AI。

    ZETIC.ai提供了一种革命性的设备端AI解决方案,使用NPU技术帮助企业减少对GPU服务器和AI云服务的依赖,从而显著降低成本。它支持任何操作系统、任何处理器和任何目标设备,确保AI模型在转换过程中不损失任何核心功能,同时实现最优性能和最大能效。此外,它还增强了数据安全性,因为数据在设备内部处理,避免了外部泄露的风险。

  • Kerqu.Ai:一站式AI内容生成器,助力跨境电商提升效率。

    Kerqu.Ai是一个为跨境电商卖家提供一站式AI解决方案的平台,整合了先进的AI技术,帮助用户节约成本、提升品牌影响力和销售转化率。产品通过AI技术实现模特换场景、AI图片创作、批量抠图、图片变高清等功能,同时提供一键撰写文案、优化文案和多语言翻译服务,满足多站点经营需求。

  • ReviewHawk:通过分析用户评论,降低用户流失率。

    ReviewHawk是一个专注于分析应用商店评论的工具,旨在帮助企业降低用户流失率,获取用户反馈,从而改善产品。它通过数据驱动的决策和用户满意度分析,帮助企业了解用户真正想要的功能,从而提升用户留存率和产品满意度。

  • Airtable Cobuilder:快速创建与管理数据的应用程序

    Airtable Cobuilder 是一款强大的应用程序构建工具,旨在通过简单的拖放界面和AI辅助功能,帮助用户快速创建和管理数据。它允许用户连接和简化他们最关键的数据,通过可视化数据、自定义视图和集成其他业务工具,提高团队协作和数据管理的效率。该工具特别适合需要高度定制化和灵活性的业务应用场景。

  • Alertfor:追踪网络信息,及时获取答案变化

    Alertfor 是一个在线平台,通过其专有的AQTA (Ask Question Track Answer) 流程,允许用户提交复杂问题,并在网页上寻找最相关的答案。它通过持续追踪提供连续的更新,确保用户能够获得准确且及时的信息。

  • Unskool:家长支持工具,助力家庭教育

    Unskool是一个由家长为家长制作的辅助工具,旨在简化家庭教育过程。它通过去除繁琐的行政工作,让家长能够专注于创造一个丰富的学习环境,让家长和孩子都能茁壮成长。Unskool提供了跟踪、记录和灵感激发的功能,并通过人工智能生成定制的、按需的课程计划,帮助家长更高效地进行家庭教育。

  • AI Generated Diagram:智能生成图表工具

    AI Generated Diagram 是一款利用人工智能技术生成图表的工具。它通过用户输入的提示(prompts)来创建图表,支持多种布局类型,如水平布局(Horizontal)。用户可以通过编辑、配置等操作来调整图表的细节,并支持导出为SVG格式或导出数据。该工具不仅提高了设计图表的效率,还通过AI技术提升了图表的美观度和准确性。

  • Free AI Image Extender:使用人工智能扩展图像边界

    AI Image Extender 是一款利用人工智能技术扩展图像边界的工具,通过生成新内容与现有图像无缝融合,增强图像的视觉延展性。该产品通过先进的AI算法,能够智能识别图像内容并生成自然过渡的扩展区域,适用于需要图像扩展或背景生成的各种场景。

  • Capacities:一个为你的思维打造工作室的APP

    Capacities是一个旨在改善人们思考方式和工作流程的应用程序。它通过使用对象而非传统文件和文件夹来组织信息,帮助用户更直观地理解和连接复杂的信息结构。该应用支持网络化笔记,使用户能够自然地构建信息网络,激发新的创意。Capacities还提供AI助手,帮助用户与笔记中的对象动态互动,并提高写作质量。此外,该应用注重数据安全和隐私保护,符合GDPR标准,数据存储在欧盟的加密服务器上。

  • CLASI:高质量、类人同声传译系统

    CLASI是一个由字节跳动研究团队开发的高质量、类人同声传译系统。它通过新颖的数据驱动读写策略平衡翻译质量和延迟,采用多模态检索模块来增强特定领域术语的翻译,利用大型语言模型(LLMs)生成容错翻译,考虑输入音频、历史上下文和检索信息。在真实世界场景中,CLASI在中英和英中翻译方向上分别达到了81.3%和78.0%的有效信息比例(VIP),远超其他系统。

  • image-matting:AI抠图项目,使用开源模型实现图像抠图。

    image-matting 是一个基于开源模型 briaai/RMBG-1.4 的AI抠图项目。该项目旨在通过学习AI技术、GUI开发、前端学习以及i18n国际化等技术,实现本地模型算法的图像抠图功能。它支持单张和批量抠图,用户可以通过拖拽和粘贴的方式快速进行图像处理。项目还提供了打包后的运行文件下载链接,方便用户使用。

  • OnlyPans:AI定制周晚餐计划

    OnlyPans是一个利用人工智能技术为用户提供定制化晚餐计划的应用程序。它通过与用户的简短聊天来了解用户的预算、口味偏好、语言习惯、饮食限制以及日常生活的忙碌程度,然后快速生成符合用户需求的晚餐计划。随着用户使用时间的增长,OnlyPans会不断学习和优化,提供更加个性化的服务。此外,OnlyPans还提供智能购物清单功能,帮助用户避免食品浪费和不必要的紧急购物。OnlyPans注重用户隐私保护,承诺不会出售用户的任何信息。

今日大家都在搜的词: