图优化在降低 AI 模型的训练和推理使用的时间和资源方面起着重要作用。图优化的一个重要功能是模型中将可以融合的算子进行融合,通过降低内存占用和减少数据在低速内存中的搬运来提高计算效率。然而,实现一套能够提供各种算子融合的后端方案难度很大,导致在实际硬件上 AI 模型能够使用的算子融合非常有限。
Composable Kernel (CK)库旨在提供一套在 AMD GPU 上的算子融合的后端方案。CK 使用通用编程语言 HIP C ,完全开源。其设计理念包括:
CK 引入了两个概念以提高后端开发者的生产力:
1. 开创性的引入“张量坐标变换” (Tensor Coordinate Transformation)降低 AI 算子的编写复杂度。该研究开创性地定义了一组可复用的 Tensor Coordinate Transformation 基础模块,并且用它们把复杂的 AI 算子(比如卷积,group normalization reduction,Depth2Space,等等)以数学严谨的方式重新表达成了最基础的 AI 算子(GEMM,2D reduction,tensor transfer,等等)。这项技术可以让为基础 AI 算子编写的算法直接被用到所有与之对应的复杂的 AI 算子上,而无需重写算法。
2. 基于 Tile 的编程范式:开发算子融合的后端算法可以被看成先将每一个融合前的算子(独立算子)拆解成许多 “小块” 的数据操作,然后再把这些 “小块” 操作组合成融合的算子。每一个这样的 “小块” 操作都对应一个原始的独立算子,但是被操作的数据只是原始张量的一部分(tile),因此这样的 “小块” 操作被称为 Tile Tensor Operator。CK 库包含一组针对 Tile Tensor Operator 的高度优化的实现,CK 里所有的 AI 独立算子和融合算子都是用它们实现的。目前,这些 Tile Tensor Operators 包括 Tile GEMM,Tile Reduction 和 Tile Tensor Transfer。每一个 Tile Tensor Operator 都有针对 GPU thread block,warp 和 thread 的实现。
Tensor Coordinate Transformation 和 Tile Tensor Operator 共同组成了 CK 的可复用的基础模块。
图 1,使用 CK 的 Tensor Coordinate Transformation 基础模块将 convolution 算子表达成 GEMM 算子
图 2,CK 的组成(下:可复用的基础模块;上:独立算子与融合算子)
CK 库结构分为四层,从下到上分别是:Templated Tile Operator,Templated Kernel and Invoker,Instantiated Kernel and Invoker 和 Client API【3】。每一层对应不同的开发者。
图 3,CK 库四层结构
Meta 的 AITemplate 【7】(AIT)是一个统一 AMD 和 Nvidia GPU 的 AI 推理系统。AITemplate 使用 CK 作为其 AMD GPU 上的后端,它使用的是 CK 的 Templated Kernel and Invoker 层。
AITemplate CK 在 AMD Instinct™ MI250 上取得了多个重要 AI 模型最先进的推理性能。CK 里大多数先进的融合算子的定义,都是在 AITemplate 团队的远见下推动的。许多融合算子的算法也是由 CK 和 AITemplate 团队共同设计。
本文比较了几个端到端模型在 AMD Instinct MI250 和同级别产品【8】的性能表现。本文中所有 AMD Instinct MI250 的 AI 模型的性能数据都是用 AITemplate【9】 CK【10】取得的。
ResNet-50
下图显示了 AMD Instinct MI250 上的 AIT CK 与 A100-PCIe-40GB 和 A100-DGX-80GB 上的 TensorRT v8.5.0.12 【11】(TRT)的性能比较。结果显示 AMD Instinct MI250 上的 AIT CK 取得了相比于 A100-PCIe-40GB 上的 TRT 1.08 倍的加速。
BERT
一个基于 CK 实现的 Batched GEMM Softmax GEMM 融合算子模版,可以完全消除掉中间结果在 GPU 计算单元(Compute Unit)与 HBM 之间的搬运。通过使用这个融合算子模版,attention layer 许多原本是带宽瓶颈(bandwidth bound)的问题变成了计算瓶颈(compute bound)的问题,这样可以更好发挥 GPU 的计算能力。这个 CK 的实现深受 FlashAttention 【12】的启发,并比原始的 FlashAttention 的实现减少了更多的数据搬运。
下图显示了 AMD Instinct MI250 上的 AIT CK 与 A100-PCIe-40GB 和 A100-DGX-80GB 上的 FasterTransformer v5.1.1 bug fix 【13】(FT)的 Bert Base 模型(uncased)的性能比较。当 Sequence 是 4096 时,FT 在 A100-PCIe-40GB 和 A100-DGX-80GB 上会在 Batch 32 时 GPU 内存溢出。因此,在 Sequence 是 4096 时,本文只显示 Batch 16 的结果。结果显示 AMD Instinct MI250 上的 AIT CK 取得了相比于 A100-PCIe-40GB 上的 FT 3.28 倍,以及相比于 A100-DGX-80GB 上的 FT 2.91 倍的加速。
Vision Transformer (VIT)
下图显示了 AMD Instinct MI250 上的 AIT CK 与 A100-PCIe-40GB 和 A100-DGX-80GB 上的 TensorRT v8.5.0.12(TRT)的 Vision Transformer Base (224x224 图片)的性能比较。结果显示 AMD Instinct MI250 上的 AIT CK 取得了相比于 A100-PCIe-40GB 上的 TRT 1.8 倍,以及相比于 A100-DGX-80GB 上的 TRT 1.4 倍的加速。
Stable Diffusion
端到端的 Stable Diffusion
下表显示 AIT CK 在 AMD Instinct MI250 上 Stable Diffusion 端到端(Batch 1,2,4, 6)的性能数据。当 Batch 是 1 时,在 MI250 上只有一个 GCD 被使用,而在 Batch 2,4,6 时,两个 GCD 都被使用了。
Stable Diffusion 中的 UNet
不过本文还没有关于使用 TensorRT 运行 Stable Diffusion 端到端模型的公开的信息。但这篇文章“Make stable diffusion 25% faster using TensorRT” 【14】说明了怎么使用 TensorRT 加速 Stable Diffusion 中的 UNet 模型。UNet 是 Stable Diffusion 中最重要最花时间的部分,因此 UNet 的性能大致反应了 Stable Diffusion 的性能。
下图显示了 AMD Instinct MI250 上的 AIT CK 与 A100-PCIe-40GB 和 A100-DGX-80GB 上的 TensorRT v8.5.0.12(TRT)的 UNet 的性能比较。结果显示 AMD Instinct MI250 上的 AIT CK 取得了相比于 A100-PCIe-40GB 上的 TRT 2.45 倍,以及相比于 A100-DGX-80GB 上的 TRT 2.03 倍的加速。
更多信息
ROCm webpage: AMD ROCm™ Open Software Platform | AMD
ROCm Information Portal: AMD Documentation - Portal
AMD Instinct Accelerators: AMD Instinct™ Accelerators | AMD
AMD Infinity Hub: AMD Infinity Hub | AMD
Endnotes:
1.Chao Liu is PMTS Software Development Engineer at AMD. Jing Zhang is SMTS Software Development Engineer at AMD. Their postings are their own opinions and may not represent AMD’s positions, strategies, or opinions. Links to third party sites are provided for convenience and unless explicitly stated, AMD is not responsible for the contents of such linked sites and no endorsement is implied. GD-5
2.CPU CK 处于早期开发阶段。
3.C目前 API,Python API 正在规划中。
4.GEMM 的 CK “客户端 API”示例 添加 添加 FastGeLU 融合运算符。 https://github.com/ROCmSoftwarePlatform/composable_kernel/blob/685860c2a9483c9e909d2f8bfb95056672491...
5.CK“模板化 Ker 示例”内尔GEMM 的“Invoker”和“Invoker”添加 添加 FastGeLU 熔断运算符。 https://github.com/rocmsoftwareplatform/composable_kernel/blob/685860C2A9483C9E909D2F8BFBFBFB95056672491..........。 Tile Operator”原语用于编写 GEMM 管道。 https://github.com/rocmsoftwareplatform/composable_kernel/blob/685860C2A9483C9E909D2F8BFBFB95056672491.............upostecome https://github.com/facebookincubator/AITemplate
8.MI200-71:由 AMD MLSE 10.23.22 使用进行的测试AITemplate https://github.com/ROCmSoftwarePlatform/AITemplate,提交 f940d9b) 可组合内核 https://github.com/ROCmSoftwarePlatform/composable_kernel,提交 40942b9),ROCm™5.3 在 2 个 AMD EPYC 7713 64 核处理器服务器(4 个)上运行采用 AMD Infinity Fabric™ 技术的 AMD Instinct MI250 OAM (128 GB HBM2e) 560W GPU 与 TensorRT v8.5.0.12 和 FasterTransformer(v5.1.1 错误修复)以及 CUDA® 11.8 在 2 个 AMD EPYC 7742 64 核处理器服务器上运行4x Nvidia A100-PCIe-40GB (250W) GPU 和 TensorRT v8.5.0.12 和 FasterTransformer(v5.1.1 错误修复),带有 CUDA® 11.8,在 2xAMD EPYC 7742 64 核处理器服务器上运行,具有 8x NVIDIA A100 SXM 80GB (400W)图形处理器。服务器制造商可能会改变配置,从而产生不同的结果。性能可能会因使用最新驱动程序和优化等因素而有所不同。
9.https://github.com/ROCmSoftwarePlatform/AITemplate/tree/f940d9b7ac8b976fba127e2c269dc5b368f30e4e
10.https://github.com/ROCmSoftwarePlatform/composable_kernel/tree/40942b909801dd721769834fc61ad201b5795...
11.TensorRT GitHub 存储库。 https://github.com/NVIDIA/TensorRT
12.FlashAttention:具有 IO 感知的快速、内存高效的精确注意力。 https://arxiv.org/abs/2205.14135
13.FasterTransformer GitHub 存储库。 https://github.com/NVIDIA/FasterTransformer
14.使用 TensorRT 使稳定扩散速度提高 25%。 https://www.photoroom.com/tech/stable-diffusion-25-percent-faster-and-save-seconds/
15 .在 AMD 期间
以上是通过定制化算子融合提高AI端到端性能的详细内容。更多信息请关注PHP中文网其他相关文章!