Hugging Face 在 AMD Instinct MI300 GPU 上
加入 6 月 6 日的下一次 Hugging Cast,向帖子作者提问,观看在 Azure 上将 Llama 3 部署到 MI300X 的现场演示,以及在 Ryzen AI PC 上本地部署模型的额外演示!
引言
在 Hugging Face,我们致力于让用户使用开放模型和开源轻松构建 AI,无论您想使用哪种框架、云和堆栈。其中一个关键组成部分是能够在多种硬件上部署 AI 模型。通过与 AMD 合作大约一年,我们正在投资多种不同的加速器,例如 AMD Instinct™ 和 Radeon™ GPU、EPYC™ 和 Ryzen™ CPU 以及 Ryzen AI NPU,以确保总能找到一个设备来在 AMD 机群上运行最大的 AI 社区。今天,我们很高兴地宣布,Hugging Face 和 AMD 共同努力,使最新一代的 AMD GPU 服务器,即 AMD Instinct MI300,在整个 Hugging Face 平台中实现了一流的集成。从在本地环境中进行原型设计,到在 Azure ND Mi300x V5 VM 上将模型投入生产,您无需使用 transformers[1]、text-generation-inference 和其他库进行任何代码更改,也无需使用 Hugging Face 产品和解决方案——我们希望让在 Hugging Face 上使用 AMD MI300 并获得最佳性能变得非常简单。让我们深入了解!
开源和生产启用
在 Transformers 和 text-generation-inference 中维护对 AMD Instinct GPU 的支持
在 AI 领域当前发生如此多的事情,确保 MI300 系列得到正确的长期测试和监控是绝对必要的。为了实现这一目标,我们一直与 Hugging Face 的基础设施团队密切合作,以确保我们为需要启用持续集成和部署 (CI/CD) 的任何人提供强大的构建模块,并且能够轻松实现而不影响其他已有的功能。
为了实现这些,我们与 AMD 和 Microsoft Azure 团队合作,利用最近推出的 Azure ND MI300x V5 作为针对 MI300 的构建模块。在几个小时内,我们的基础设施团队就能够部署、设置并让所有功能正常运行,以便我们能够着手使用 MI300!
我们还从旧的基础设施迁移到了托管的 Kubernetes 集群,负责调度所有 Hugging Face 协作者希望在特定硬件 Pod 上运行的 Github 工作流。这种迁移现在允许我们在各种硬件平台上运行完全相同的 CI/CD 流水线,而开发人员无需关注底层细节。我们能够在几天内轻松地在 Azure MI300X VM 上启动并运行 CI/CD。
因此,Transformers 和 text-generation-inference 现在定期在上一代 AMD Instinct GPU(即 MI250)以及最新的 MI300 上进行测试。实际上,有数万个单元测试定期验证这些存储库的状态,确保长期集成的正确性和健壮性。
提高生产 AI 工作负载的性能
推理性能
如前所述,我们一直在努力使新的 AMD Instinct MI300 GPU 能够通过我们的开源推理解决方案 text-generation-inference (TGI) 高效运行推理工作负载。TGI 可以看作由三个不同组件组成:- 传输层,主要为 HTTP,用于暴露和接收客户端的 API 请求 - 调度层,确保这些请求能够潜在地批量处理(即连续批量处理),以在不影响用户体验的情况下提高硬件上的计算密度 - 模型层,负责在设备上运行实际计算,利用模型中涉及的高度优化例程
在这里,在 AMD 工程师的帮助下,我们专注于最后一个组件,即模型,以有效地设置、运行和优化工作负载,用于服务 Meta Llama 系列等模型。特别是,我们专注于:- Flash Attention v2 - Paged Attention - GPTQ/AWQ 压缩技术 - ROCm TunableOp 的 PyTorch 集成 - 优化融合核的集成
其中大多数已经存在了一段时间,例如 FlashAttention v2、PagedAttention 和 GPTQ/AWQ 压缩方法(特别是它们的优化例程/内核)。我们不会详细介绍上述三项,我们邀请您访问其原始实现页面以了解更多信息。
尽管如此,对于一个全新的硬件平台、新的 SDK 版本来说,仔细验证、分析和优化每一个环节都非常重要,以确保用户能够从这个新平台获得全部性能。
最后但同样重要的是,作为此次 TGI 发布的一部分,我们正在集成 PyTorch 2.3 中最新发布的 AMD TunableOp。TunableOp 提供了一种多功能机制,它将根据形状和数据类型,寻找执行通用矩阵乘法(即 GEMM)的最有效方式。TunableOp 已集成到 PyTorch 中,目前仍在积极开发中,但正如您将在下面看到的,它可以在不显著影响用户体验的情况下提高 GEMM 操作的性能。具体来说,对于小型输入序列,我们使用 TunableOp 可以将延迟提高 8-10%,这对应于自回归模型生成的解码阶段。
实际上,当创建一个新的 TGI 实例时,我们会启动一个初始预热步骤,该步骤会加载一些虚拟负载,并确保模型及其内存已分配并准备就绪。
通过 TunableOp,我们让 GEMM 例程调优器分配一些时间来寻找最优化设置,该设置基于用户提供给 TGI 的参数,例如序列长度、最大批大小等。当预热阶段完成后,我们禁用调优器,并在服务器的剩余生命周期内利用优化后的例程。
如前所述,我们使用 Azure ND MI300x V5 进行了所有基准测试,该产品最近在 Microsoft BUILD 发布,集成了八个 AMD Instinct GPU。与上一代 MI250 相比,在 Meta Llama 3 70B 部署上,我们观察到首次令牌延迟(也称为预填充)加快了 2-3 倍,以及后续自回归解码阶段的延迟加快了 2 倍。
Meta Llama 3 70B 的 TGI 延迟结果,比较了 Azure VM 上的 AMD Instinct MI300X 与上一代 AMD Instinct MI250
模型微调性能
Hugging Face 库也可以用于微调模型。我们使用 Transformers 和 PEFT 库来使用低秩适配器 (LoRA) 微调 Llama 3 70B。为了处理多个设备上的并行性,我们通过 Accelerate 库利用了 DeepSpeed Zero3。
在 Llama 3 70B 上,我们的工作负载包含批次大小为 2 的 448 个令牌批次。使用低秩适配器,模型的原始 70,570,090,496 个参数被冻结,我们反而通过 低秩适配器额外训练了 16,384,000 个参数。
根据我们对 Llama 3 70B 的比较,在由 MI300X 提供支持的 Azure VM 上,我们能够将训练速度提高约 2 倍,而使用上一代 AMD Instinct MI250 的 HPC 服务器则无法达到这个速度。
此外,由于 MI300X 受益于其 192 GB HBM3 内存(MI250 为 128 GB),我们设法在单个设备上完全加载并微调 Meta Llama 3 70B,而 MI250 GPU 无法在单个设备上以 float16 或 bfloat16 格式完全容纳约 140 GB 的模型。 因为能够复制和挑战基准总是很重要的,所以我们发布了一个配套的 Github 存储库,其中包含我们用于收集本博客中展示的性能的所有工件和源代码。
未来展望
我们为这些新的 AMD Instinct MI300 GPU 准备了许多令人兴奋的功能。在未来几周,我们将投入大量精力在迷你浮点(即 float8 及更低精度)领域。这些数据布局具有以非均匀方式压缩信息的固有优势,从而缓解了整数面临的一些问题。
在诸如 LLM 推理等场景中,这将使 LLM 中常用的键值缓存大小减半。稍后,将 float8 存储的键值缓存与 float8/float8 矩阵乘法相结合,将带来额外的性能优势以及更小的内存占用。
结论
正如您所看到的,AMD MI300 在 AI 用例上带来了显著的性能提升,涵盖了从训练到推理的端到端用例。我们 Hugging Face 很高兴看到社区和企业将能够通过这些新硬件和集成实现什么。我们渴望听到您的意见并帮助您解决用例。
请务必访问 optimum-AMD 和 text-generation-inference Github 存储库,以获取针对 AMD GPU 的最新性能优化!