Meta 如何大规模训练大型语言模型

Meta 如何大规模训练大型语言模型

发表于2024 年 6 月 12 日TO

Meta 如何大规模训练大型语言模型

www.zeeklog.com  - Meta 如何大规模训练大型语言模型

作者: 、 、

随着我们继续将人工智能研究和开发重点放在解决日益复杂的问题上,我们经历的最重大和最具挑战性的转变之一就是训练大型语言模型 (LLM) 所需的庞大计算规模。

传统上,我们的 AI 模型训练需要训练大量模型,而这些模型所需的 GPU 数量相对较少。我们的推荐模型(例如,我们的 feed 和排名模型)就是这种情况,这些模型需要提取大量信息才能做出准确的推荐,从而为我们的大多数产品提供支持。

www.zeeklog.com  - Meta 如何大规模训练大型语言模型

随着生成式人工智能 (GenAI) 的出现,我们看到工作量越来越少,但规模却越来越大。大规模支持 GenAI 意味着重新思考我们的软件、硬件和网络基础设施如何整合在一起。

大规模模型训练的挑战

www.zeeklog.com  - Meta 如何大规模训练大型语言模型

随着我们增加作业中的 GPU 数量,由于硬件故障而中断的可能性也会增加。此外,所有这些 GPU 仍然需要在同一高速结构上进行通信才能实现最佳性能。这强调了四个因素的重要性:

  • 硬件可靠性:确保硬件可靠性非常重要。我们需要尽量减少硬件故障中断训练工作的可能性。这涉及严格的测试和质量控制措施,以及快速检测和修复问题的自动化。
  • 故障时快速恢复:尽管我们尽了最大努力,但硬件故障仍然可能发生。当它们发生时,我们需要能够快速恢复。这涉及减少重新调度开销和快速训练重新初始化。
  • 高效保存训练状态:如果发生故障,我们需要能够从中断的地方继续。这意味着我们需要定期检查训练状态并高效地存储和检索训练数据。
  • GPU 之间的最佳连接:大规模模型训练涉及以同步方式在 GPU 之间传输大量数据。GPU 子集之间的缓慢数据交换可能会加剧并减慢整个工作的速度。解决这个问题需要强大而高速的网络基础设施以及高效的数据传输协议和算法。

跨基础设施堆栈创新

由于 GenAI 的大规模需求,完善基础设施堆栈的每一层都很重要。这涉及广泛领域的发展。

培训软件

我们让研究人员能够使用和其他新的开源开发成果,从而以极快的速度促进从研究到生产的开发。这包括开发新的算法和技术以实现高效的大规模训练,并将新的软件工具和框架集成到我们的基础设施中。

调度

高效的调度有助于确保我们的资源得到最佳利用。这涉及复杂的算法,可以根据不同作业的需求分配资源,并进行动态调度以适应不断变化的工作量。

硬件

我们需要高性能硬件来满足大规模模型训练的计算需求。除了尺寸和规模之外,许多硬件配置和属性都需要针对 GenAI 进行最佳优化。鉴于硬件开发时间通常很长,我们必须调整现有硬件,为此我们探索了各种维度,包括功率、HBM 容量和速度以及 I/O。

我们还通过修改使用 NVIDIA H100 GPU 开发的平台进行了调整,将 GPU 的 TDP 提高到 700W,并在 GPU 上迁移到 HBM3。由于我们没有时间改变冷却基础设施,因此我们不得不留在风冷环境中。机械和热设计必须改变以适应这种情况,这触发了验证周期以支持大规模部署。

所有这些与硬件相关的变化都具有挑战性,因为我们必须找到一个适合现有资源限制的解决方案,并且具有很小的改变自由度并满足紧张的时间表。

数据中心部署

一旦我们选择了 GPU 和系统,将它们放置在数据中心以最佳利用资源(电力、冷却、网络等)的任务就需要重新考虑为其他类型的工作负载所做的权衡。数据中心电力和冷却基础设施无法快速(或轻松)改变,我们必须找到一个最佳布局,以便在数据大厅内实现最大的计算能力。这需要将读取器等支持服务移出数据大厅,并打包尽可能多的 GPU 机架,以最大限度地提高电力和网络能力,从而通过最大的网络集群实现最高的计算密度。

可靠性

我们需要规划检测和补救措施,以最大限度地减少硬件故障期间的停机时间。故障数量与集群规模成正比,而跨集群的作业需要保留足够的备用容量,以便尽快重新启动作业。此外,我们还会监控故障,有时可以采取预防措施来减少停机时间。

www.zeeklog.com  - Meta 如何大规模训练大型语言模型

我们观察到的一些最常见的故障模式包括:

  • GPU 脱落:在这种情况下,主机无法在 PCIe 上检测到 GPU。导致此故障的原因有很多,但此故障模式在服务器早期更常见,并随着服务器老化而稳定下来。
  • DRAM 和 SRAM UCE:不可纠正的错误在存储器中很常见,我们监控并识别重复违规者,跟踪阈值,并在错误率超过供应商阈值时启动 RMA。
  • HW 网线:在一般无法访问的服务器类别中,这些故障在服务器的早期阶段也最常见。

网络

大规模模型训练涉及在 GPU 之间快速传输大量数据。这需要强大而高速的网络基础设施以及高效的数据传输协议和算法。

业界有两种符合这些要求的领先选择:RoCE 和 InfiniBand 结构。这两种选择都有利弊。一方面,Meta 在过去四年中构建了 RoCE 集群,但其中最大的集群仅支持 4K GPU。我们需要大得多的 RoCE 集群。另一方面,Meta 已经使用 InfiniBand 构建了多达 16K GPU 的研究集群。,这些集群并没有紧密集成到 Meta 的生产环境中,也不是为最新一代的 GPU/网络构建的。这使得我们很难决定使用哪种结构来构建。

因此,我们决定同时构建,一个使用 RoCE,另一个使用 InfiniBand。我们的目的是构建并从运营经验中学习。这些经验将为 GenAI 结构的未来发展方向提供参考。我们优化了 RoCE 集群以缩短构建时间,优化了 InfiniBand 集群以提供全二分带宽。我们使用 InfiniBand 和 RoCE 集群来训练,其中 RoCE 集群用于训练最大的模型。尽管这两个集群之间存在底层网络技术差异,但我们能够对它们进行调整,以便为这些大型 GenAI 工作负载提供同等的性能

www.zeeklog.com  - Meta 如何大规模训练大型语言模型

我们优化了整个堆栈的三个方面,使得 GenAI 模型的网络通信在两个集群上都具有高性能:

  1. 我们将不同模型、数据和管道并行产生的通信模式分配给网络拓扑的不同层,以便有效利用网络能力。
  2. 我们实现了具有网络拓扑感知功能的集体通信模式,以便降低延迟敏感度。我们通过使用自定义算法(例如递归加倍或减半)而不是传统算法(例如环)来更改集体的默认实现,从而实现这一点。
  3. 和排名作业一样,GenAI 作业会产生额外的肥流,这使得很难在所有可能的网络路径上分配流量。这要求我们进一步投资网络负载平衡和路由,以实现跨网络资源的最佳流量分配。

上深入讨论了我们的。

www.zeeklog.com  - Meta 如何大规模训练大型语言模型

贮存

我们需要高效的数据存储解决方案来存储模型训练中使用的大量数据。这涉及投资高容量和高速存储技术,以及为特定工作负载开发新的数据存储解决方案。

展望未来

未来几年,我们将使用数十万个 GPU,处理更大量的数据,并应对更长的距离和延迟。我们将采用新的硬件技术(包括更新的 GPU 架构)并改进我们的基础设施。

这些挑战将迫使我们以目前尚无法完全预测的方式进行创新和适应。但有一件事是肯定的:我们才刚刚开始这段旅程。随着我们继续探索不断发展的人工智能领域,我们仍致力于突破可能的界限。

Read more

深入理解 Proxy 和 Object.defineProperty

在JavaScript中,对象是一种核心的数据结构,而对对象的操作也是开发中经常遇到的任务。在这个过程中,我们经常会使用到两个重要的特性:Proxy和Object.defineProperty。这两者都允许我们在对象上进行拦截和自定义操作,但它们在实现方式、应用场景和灵活性等方面存在一些显著的区别。本文将深入比较Proxy和Object.defineProperty,包括它们的基本概念、使用示例以及适用场景,以帮助读者更好地理解和运用这两个特性。 1. Object.defineProperty 1.1 基本概念 Object.defineProperty 是 ECMAScript 5 引入的一个方法,用于直接在对象上定义新属性或修改已有属性。它的基本语法如下: javascript 代码解读复制代码Object.defineProperty(obj, prop, descriptor); 其中,obj是目标对象,prop是要定义或修改的属性名,descriptor是一个描述符对象,用于定义属性的特性。 1.2 使用示例 javascript 代码解读复制代码//

By Ne0inhk

Proxy 和 Object.defineProperty 的区别

Proxy 和 Object.defineProperty 是 JavaScript 中两个不同的特性,它们的作用也不完全相同。 Object.defineProperty 允许你在一个对象上定义一个新属性或者修改一个已有属性。通过这个方法你可以精确地定义属性的特征,比如它是否可写、可枚举、可配置等。该方法的使用场景通常是需要在一个对象上创建一个属性,然后控制这个属性的行为。 Proxy 也可以用来代理一个对象,但是相比于 Object.defineProperty,它提供了更加强大的功能。使用 Proxy 可以截获并重定义对象的基本操作,比如访问属性、赋值、函数调用等等。在这些操作被执行之前,可以通过拦截器函数对这些操作进行拦截和修改。因此,通过 Proxy,你可以完全重写一个对象的默认行为。该方法的使用场景通常是需要对一个对象的行为进行定制化,或者需要在对象上添加额外的功能。 对比 以下是 Proxy 和 Object.defineProperty 的一些区别对比: 方面ProxyObject.defineProperty语法使用 new Proxy(target,

By Ne0inhk