目录
对分割一切模型 SAM 的重写
Torch.compile(+graph breaks 和 CUDA graphs)
SDPA: scaled_dot_product_attention
首页 科技周边 人工智能 PyTorch团队重新实现'分割一切”模型,速度比原始实现提升八倍

PyTorch团队重新实现'分割一切”模型,速度比原始实现提升八倍

Nov 22, 2023 pm 02:38 PM
模型 meta

从年初到现在,生成式 AI 发展迅猛。但很多时候,我们又不得不面临一个难题:如何加快生成式 AI 的训练、推理等,尤其是在使用 PyTorch 的情况下。

本文 PyTorch 团队的研究者为我们提供了一个解决方案。文章重点介绍了如何使用纯原生 PyTorch 加速生成式 AI 模型,此外,文章还介绍了 PyTorch 新功能,以及如何组合这些功能的实际示例。

结果如何呢?PyTorch 团队表示,他们重写了 Meta 的「分割一切」 (SAM) 模型,从而使代码比原始实现快 8 倍,并且没有损失准确率,所有这些都是使用原生 PyTorch 进行优化的。 

PyTorch团队重新实现分割一切”模型,速度比原始实现提升八倍

博客地址:https://pytorch.org/blog/accelerating-generative-ai/

在阅读本文后,你将会获得以下的了解:

  • Torch.compile:PyTorch 模型编译器, PyTorch 2.0 加入了一个新的函数,叫做 torch.compile (),能够通过一行代码对已有的模型进行加速;
  • GPU 量化:通过降低运算精度来加速模型;
  • SDPA(Scaled Dot Product Attention ):内存高效的注意力实现方式;
  • 半结构化 (2:4) 稀疏性:一种针对 GPU 优化的稀疏内存格式;
  • Nested Tensor:Nested Tensor 把 {tensor, mask} 打包在一起,将非均匀大小的数据批处理到单个张量中,例如不同大小的图像;
  • Triton 自定义操作:使用 Triton Python DSL 编写 GPU 操作,并通过自定义操作符注册轻松将其集成到 PyTorch 的各种组件中。

PyTorch团队重新实现分割一切”模型,速度比原始实现提升八倍

PyTorch 原生特性所带来的吞吐量增加以及减少的内存开销。

有关此研究的更多信息,请参考Meta提出的SAM。详细文章可在「CV不存在了?Meta发布「分割一切」AI模型,CV或迎来GPT-3时刻」中找到

PyTorch团队重新实现分割一切”模型,速度比原始实现提升八倍

接下来,我们将介绍SAM的优化过程,包括性能分析、瓶颈识别,以及如何将这些新功能整合进PyTorch以解决SAM所面临的问题。此外,我们还会介绍PyTorch的一些新特性,包括torch.compile、SDPA、Triton kernels、Nested Tensor以及semi-structured sparsity(半结构化稀疏)

内容的逐层深入,本文最后将介绍快速版 SAM。对于感兴趣的读者,可以前往 GitHub 下载。此外,通过使用 Perfetto UI 对这些数据进行了可视化,以展示 PyTorch 各项特性的应用价值

GitHub 地址:https://github.com/pytorch-labs/segment-anything-fast 可以找到这个项目的源代码

对分割一切模型 SAM 的重写

该研究指出,本文使用的SAM基线数据类型为float32 dtype,批处理大小为1,并使用PyTorch Profiler来查看核心追踪的结果如下:

PyTorch团队重新实现分割一切”模型,速度比原始实现提升八倍

本文发现 SAM 有两个地方可以优化:

第一个是对 aten::index 的长调用,这是由张量索引操作(例如 [])产生的底层调用导致的。然而实际上 GPU 花费在 aten::index 上的时间相对较低,原因在于 aten::index 在启动两个内核的过程中,两者之间发生了阻塞 cudaStreamSynchronize。这意味着 CPU 会等待 GPU 完成处理,直到启动第二个内核。因而为了优化 SAM,本文认为应该致力于消除导致空闲时间的阻塞 GPU 同步。

第二个问题是在矩阵乘法中,SAM花费了大量的GPU时间(如图所示的深绿色部分),这在Transformers模型中非常普遍。如果我们能够减少SAM模型在矩阵乘法上的GPU时间,那么我们就能够显着提高SAM的速度

接下来,我们将以SAM的吞吐量(img/s)和内存开销(GiB)来建立基准。然后就是优化过程

PyTorch团队重新实现分割一切”模型,速度比原始实现提升八倍

需要进行改写的句子是:Bfloat16 半精度(加上GPU 同步和批处理)

为了解决上述问题,即减少矩阵乘法所需的时间,本文转向bfloat16。 bfloat16是常用的半精度类型,通过降低每个参数和激活的精度,能够节省大量的计算时间和内存

PyTorch团队重新实现分割一切”模型,速度比原始实现提升八倍


将填充类型替换为bfloat16

此外,本文发现有两个位置可以进行优化,以移除GPU 同步

PyTorch团队重新实现分割一切”模型,速度比原始实现提升八倍


PyTorch团队重新实现分割一切”模型,速度比原始实现提升八倍

具体来说,根据上图更容易理解,该研究发现在SAM的图像编码器中,有两个变量q_coords和k_coords充当坐标缩放器,这些变量都在CPU上进行分配和处理。然而,一旦这些变量用于在rel_pos_resized中建立索引,索引操作会自动将这些变量移动到GPU上,从而导致GPU同步的问题。为了解决这个问题,该研究指出可以使用torch.where函数重写这部分内容来解决问题,具体如上所示

核心追踪

在对这些更改进行应用之后,我们注意到单个内核调用之间存在明显的时间间隔,特别是在小批量(这里为1)的情况下更为明显。为了更深入地了解这一现象,我们开始对批大小为8的SAM推理进行性能分析

PyTorch团队重新实现分割一切”模型,速度比原始实现提升八倍

在分析每个内核所花费的时间时,我们注意到SAM 的大部分GPU时间都用于逐元素内核和softmax 操作

现在可以看到矩阵乘法的相对开销小了很多。

PyTorch团队重新实现分割一切”模型,速度比原始实现提升八倍

将 GPU 同步和 bfloat16 优化结合在一起,SAM 性能提高了 3 倍。

PyTorch团队重新实现分割一切”模型,速度比原始实现提升八倍

Torch.compile(+graph breaks 和 CUDA graphs)

在研究SAM的过程中发现了许多细小的操作。研究人员认为使用编译器来整合这些操作非常有益,因此PyTorch对torch.compile进行了以下优化

  • 将nn.LayerNorm 或nn.GELU 等操作序列融合成一个单一的GPU 内核;
  • 融合紧跟在矩阵乘法内核之后的操作,以减少GPU 内核调用的数量。

通过这些优化,该研究减少了 GPU 全局内存往返次数(roundtrips),从而加快了推理速度。我们现在可以在 SAM 的图像编码器上尝试 torch.compile。为了最大限度地提高性能,本文使用了一些高级编译技术:

PyTorch团队重新实现分割一切”模型,速度比原始实现提升八倍

核心追踪

PyTorch团队重新实现分割一切”模型,速度比原始实现提升八倍

根据结果显示,torch.compile 的表现非常出色

PyTorch团队重新实现分割一切”模型,速度比原始实现提升八倍

可以观察到 softmax 占了很大一部分时间,然后是各种 GEMM 变体。以下测量的是批大小为 8 及以上的变化。

PyTorch团队重新实现分割一切”模型,速度比原始实现提升八倍

SDPA: scaled_dot_product_attention

接下来,本文又对 SDPA(scaled_dot_product_attention)进行了实验,研究的重点是注意力机制。一般来讲,原生注意力机制在时间和内存上随序列长度呈二次方扩展。PyTorch 的 SDPA 操作基于 Flash Attention、FlashAttentionV2 和 xFormer 的内存高效注意力原理构建,可以显着加快 GPU 注意力。与 torch.compile 相结合,这个操作允许在 MultiheadAttention 的变体中表达和融合一个共同的模式。经过一小部分更改后,现在模型可以使用 scaled_dot_product_attention。

PyTorch团队重新实现分割一切”模型,速度比原始实现提升八倍

核心追踪

现在可以看到内存高效的注意力内核占用了 GPU 上大量的计算时间:

PyTorch团队重新实现分割一切”模型,速度比原始实现提升八倍

使用 PyTorch 的原生 scaled_dot_product_attention,可以显著增加批处理大小。下图为批大小为 32 及以上的变化。

PyTorch团队重新实现分割一切”模型,速度比原始实现提升八倍

接下来,该研究进行了对 Triton、NestedTensor、批处理 Predict_torch、int8 量化、半结构化 (2:4) 稀疏性等操作的实验

例如本文使用自定义 positional Triton 内核,观察到批大小为 32 的测量结果。

PyTorch团队重新实现分割一切”模型,速度比原始实现提升八倍

采用 Nested Tensor 技术,并调整批大小为 32 及以上

PyTorch团队重新实现分割一切”模型,速度比原始实现提升八倍

添加量化后,批大小为 32 及以上变化的测量结果。

PyTorch团队重新实现分割一切”模型,速度比原始实现提升八倍

文章的最后是半结构化稀疏性。该研究表示,矩阵乘法仍然是需要面对的一个瓶颈。解决的办法是使用稀疏化来近似矩阵乘法。通过稀疏矩阵(即将值归零)可以使用更少的位来存储权重和激活张量。该研究将张量中哪些权重设置为零的过程称为剪枝。剪枝掉较小的权重可以潜在地减小模型大小,而不会显着损失准确率。

剪枝的方法有很多种,从完全非结构化到高度结构化都有。虽然理论上来说非结构化剪枝对精度的影响最小,但是在稀疏情况下,GPU可能会遇到显着的性能下降,尽管在进行大型密集矩阵乘法时非常高效。最近PyTorch支持的一种剪枝方法是半结构化(或2:4)稀疏性,旨在寻求平衡。这种稀疏存储方式将原始张量减少了50%,同时产生密集张量的输出。请参考下图进行说明

PyTorch团队重新实现分割一切”模型,速度比原始实现提升八倍

为了使用这种稀疏存储格式和相关的快速内核,接下来要做的是剪枝权重。本文在 2:4 的稀疏度下选择最小的两个权重进行剪枝,将权重从默认的 PyTorch(“strided”)布局更改为这种新的半结构化稀疏布局很容易。要实现apply_sparse (model),只需要32 行Python 代码:

PyTorch团队重新实现分割一切”模型,速度比原始实现提升八倍

在稀疏度为2:4的情况下,我们观察到vit_b和批大小为32时的SAM峰值性能

PyTorch团队重新实现分割一切”模型,速度比原始实现提升八倍

最终,对这篇文章的概括如下:本文介绍了截至目前在PyTorch上实现Segment Anything的最快方法,借助官方发布的一系列新功能,本文在纯PyTorch中重新编写了原始的SAM,并且没有损失准确度

对于感兴趣的读者,可以查看原博客以获取更多信息

以上是PyTorch团队重新实现'分割一切”模型,速度比原始实现提升八倍的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

全球最强开源 MoE 模型来了,中文能力比肩 GPT-4,价格仅为 GPT-4-Turbo 的近百分之一 全球最强开源 MoE 模型来了,中文能力比肩 GPT-4,价格仅为 GPT-4-Turbo 的近百分之一 May 07, 2024 pm 04:13 PM

想象一下,一个人工智能模型,不仅拥有超越传统计算的能力,还能以更低的成本实现更高效的性能。这不是科幻,DeepSeek-V2[1],全球最强开源MoE模型来了。DeepSeek-V2是一个强大的专家混合(MoE)语言模型,具有训练经济、推理高效的特点。它由236B个参数组成,其中21B个参数用于激活每个标记。与DeepSeek67B相比,DeepSeek-V2性能更强,同时节省了42.5%的训练成本,减少了93.3%的KV缓存,最大生成吞吐量提高到5.76倍。DeepSeek是一家探索通用人工智

替代MLP的KAN,被开源项目扩展到卷积了 替代MLP的KAN,被开源项目扩展到卷积了 Jun 01, 2024 pm 10:03 PM

本月初,来自MIT等机构的研究者提出了一种非常有潜力的MLP替代方法——KAN。KAN在准确性和可解释性方面表现优于MLP。而且它能以非常少的参数量胜过以更大参数量运行的MLP。比如,作者表示,他们用KAN以更小的网络和更高的自动化程度重现了DeepMind的结果。具体来说,DeepMind的MLP有大约300,000个参数,而KAN只有约200个参数。KAN与MLP一样具有强大的数学基础,MLP基于通用逼近定理,而KAN基于Kolmogorov-Arnold表示定理。如下图所示,KAN在边上具

你好,电动Atlas!波士顿动力机器人复活,180度诡异动作吓坏马斯克 你好,电动Atlas!波士顿动力机器人复活,180度诡异动作吓坏马斯克 Apr 18, 2024 pm 07:58 PM

波士顿动力Atlas,正式进入电动机器人时代!昨天,液压Atlas刚刚「含泪」退出历史舞台,今天波士顿动力就宣布:电动Atlas上岗。看来,在商用人形机器人领域,波士顿动力是下定决心要和特斯拉硬刚一把了。新视频放出后,短短十几小时内,就已经有一百多万观看。旧人离去,新角色登场,这是历史的必然。毫无疑问,今年是人形机器人的爆发年。网友锐评:机器人的进步,让今年看起来像人类的开幕式动作、自由度远超人类,但这真不是恐怖片?视频一开始,Atlas平静地躺在地上,看起来应该是仰面朝天。接下来,让人惊掉下巴

特斯拉机器人进厂打工,马斯克:手的自由度今年将达到22个! 特斯拉机器人进厂打工,马斯克:手的自由度今年将达到22个! May 06, 2024 pm 04:13 PM

特斯拉机器人Optimus最新视频出炉,已经可以在厂子里打工了。正常速度下,它分拣电池(特斯拉的4680电池)是这样的:官方还放出了20倍速下的样子——在小小的“工位”上,拣啊拣啊拣:这次放出的视频亮点之一在于Optimus在厂子里完成这项工作,是完全自主的,全程没有人为的干预。并且在Optimus的视角之下,它还可以把放歪了的电池重新捡起来放置,主打一个自动纠错:对于Optimus的手,英伟达科学家JimFan给出了高度的评价:Optimus的手是全球五指机器人里最灵巧的之一。它的手不仅有触觉

FisheyeDetNet:首个基于鱼眼相机的目标检测算法 FisheyeDetNet:首个基于鱼眼相机的目标检测算法 Apr 26, 2024 am 11:37 AM

目标检测在自动驾驶系统当中是一个比较成熟的问题,其中行人检测是最早得以部署算法之一。在多数论文当中已经进行了非常全面的研究。然而,利用鱼眼相机进行环视的距离感知相对来说研究较少。由于径向畸变大,标准的边界框表示在鱼眼相机当中很难实施。为了缓解上述描述,我们探索了扩展边界框、椭圆、通用多边形设计为极坐标/角度表示,并定义一个实例分割mIOU度量来分析这些表示。所提出的具有多边形形状的模型fisheyeDetNet优于其他模型,并同时在用于自动驾驶的Valeo鱼眼相机数据集上实现了49.5%的mAP

新款经济实惠的 Meta Quest 3S VR 耳机出现在 FCC 上,暗示即将推出 新款经济实惠的 Meta Quest 3S VR 耳机出现在 FCC 上,暗示即将推出 Sep 04, 2024 am 06:51 AM

Meta Connect 2024 活动定于 9 月 25 日至 26 日举行,在本次活动中,该公司预计将推出一款价格实惠的新型虚拟现实耳机。据传这款 VR 耳机是 Meta Quest 3S,它似乎已经出现在 FCC 清单上。这个建议

首个超越GPT4o级开源模型!Llama 3.1泄密:4050亿参数,下载链接、模型卡都有了 首个超越GPT4o级开源模型!Llama 3.1泄密:4050亿参数,下载链接、模型卡都有了 Jul 23, 2024 pm 08:51 PM

快准备好你的GPU!Llama3.1终于现身了,不过出处却不是Meta官方。今日,Reddit上新版Llama大模型泄露的消息遭到了疯传,除了基础模型,还包括8B、70B和最大参数的405B的基准测试结果。下图为Llama3.1各版本与OpenAIGPT-4o、Llama38B/70B的比较结果。可以看到,即使是70B的版本,也在多项基准上超过了GPT-4o。图源:https://x.com/mattshumer_/status/1815444612414087294显然,3.1版本的8B和70

单卡跑Llama 70B快过双卡,微软硬生生把FP6搞到了A100里 | 开源 单卡跑Llama 70B快过双卡,微软硬生生把FP6搞到了A100里 | 开源 Apr 29, 2024 pm 04:55 PM

FP8和更低的浮点数量化精度,不再是H100的“专利”了!老黄想让大家用INT8/INT4,微软DeepSpeed团队在没有英伟达官方支持的条件下,硬生生在A100上跑起FP6。测试结果表明,新方法TC-FPx在A100上的FP6量化,速度接近甚至偶尔超过INT4,而且拥有比后者更高的精度。在此基础之上,还有端到端的大模型支持,目前已经开源并集成到了DeepSpeed等深度学习推理框架中。这一成果对大模型的加速效果也是立竿见影——在这种框架下用单卡跑Llama,吞吐量比双卡还要高2.65倍。一名

See all articles