作者 | IMBUE团队
OneFlow编译
翻译 | 刘乾裕、林心宇
题图由Siliconcloud平台生成
今年6月,大模型公司Imbue依托它们自主构建的基础设施,从零起步,成功训练出一个70亿参数的模型,其在相关推理任务上的卓越表现远零样本GPT-4o。
在《70B大模型训练秘方① :数据集创建与评估》一文中,他们分享了用于模型评估的数据集,包含11个公共数据集的高质量子集,以及一套用于代码理解的原始问题。重点分享了为什么选择这些特定的数据集,以及数据创建过程和实际数据集的详细信息。
本文是Imbue团队训练70B大模型三部曲系列的第二篇。在本文中,他们将分享一套适用于搭建所需基础设施的端到端指南:从搭建初始集群、安装操作系统,直至训练过程中实现错误的自动纠正。在每个步骤中,他们都详细说明了遇到的挑战,并分享了解决方案。
除了经验教训外,他们还分享了为确保主机健康而自主开发的大量基础设施脚本,旨在帮助其他团队更便捷地为自己的模型训练创建稳定的基础设施。
随着他们给出的详细流程,他们还推出了:
-
主机级健康性检查(https://github.com/imbue-ai/cluster-health/tree/master/health_checks):用于确保特定主机无已知错误的脚本
-
NVIDIA集群通信库(NCCL) 补丁,优化错误和延迟的日志记录
-
压力测试,确认GPU能够分配大型张量并执行标准操作(https://github.com/imbue-ai/cluster-health/tree/master/gpu_stress_test)
-
网络测试(https://github.com/imbue-ai/cluster-health/tree/master/host_validation) ,以检查特定机器上的GPU能否相互通信(通过 NVLink),并且是否能够与其他机器上的GPU进行通信(通过 InfiniBand)
-
用于解析统一网络管理器(UFM)事件日志的脚本(https://github.com/imbue-ai/cluster-health/tree/master/host_validation) ,检查相关事件,并确定哪些网络端口应被禁用
-
一个用于为InfiniBand网络结构生成全面预热工作负载的脚本,目的是测试每一个可用的链路。
(本文由OneFlow编译发布,转载请联系授权。来源:https://imbue.com/research/70b-infrastructure/)
1
背景:如何实现这一运作
我们的计算目标在于实现大规模语言模型的快速实验。为此,我们需要大量高速GPU,并确保它们能够以高速相互通信。
本文重点介绍一个由511台服务器构成的集群,其中部署了4088枚H100 GPU,均匀分布在每台服务器上,每台服务器搭载8个GPU。考虑到统一网络结构管理节点对连接的需求,保留了部分连接并且用于管理 InfiniBand 网络。
在这511台配置了GPU的主机中,每个GPU均直接连接到一块 ConnectX-7 卡。这块卡具备高效的数据交换能力,通过自身的 ConnectX-7 卡,能够以400 Gbps的速度向InfiniBand网络中的其他任何GPU发送和接收数据,从而确保了集群内部的高速数据流通。
我们的InfiniBand网络拓扑被称为“完全非阻塞(fully non-blocking)”,因为理论上每个GPU均能实现与其他GPU的最大速率通信。这是通过三层InfiniBand网络架构实现的:当正确连接时,三层InfiniBand交换机能够在整个网络上实现这种高水平的吞吐量。请参阅下方的InfiniBand网络概述:
请注意,训练网络的通信是通过InfiniBand而非以太网进行的。尽管这些计算机也连接到了以太网,但该网络主要用于传输数据集、检查点和其他数据。如果通过以太网发送数据将会非常缓慢,因为数据需要首先从GPU传输到CPU,然后再通过一根100 Gbps的以太网卡发送。虽然理论上可以通过称为融合以太网的RDMA(RoCE)技术在以太网上进行训练,但在硬件和软件两方面都需要大量额外工作,并且通常比InfiniBand更不可靠(详情参见论文(https://arxiv.org/pdf/2402.15627),其中概述了整体流程)。
此外,还存在一个专门用于配置和管理的辅助以太网络,它允许访问基本输入/输出系统(BIOS)、电源供应以及其他底层计算机接口的控制界面。如果没有这个管理网络,我们就必须手动使用USB驱动器、键盘和显示器来设置我们的节点,这对于成百上千台机器而言,显然不是一个高效且可持续的解决方案。
使用我们的集群进行高性能训练意味着每个组件——InfiniBand、以太网、GPU以及节点本身——都必须近乎完美地协同工作。如果超过12000个连接中的任何一个稍微不稳定,都可能拖慢整个训练过程的进度。本文剩余部分将详细阐述实现所有组件完美运行的过程,并确保其持续稳定运行的方法。
2
流程:如何从裸机蜕变为高效运转集群
预配单台机器
在成功建立管理网络与集群之间的初始以太网络连接后,我们获得了对主板管理控制器(BMC)的访问权限。BMC作为一种专业化服务处理器,能够对主机系统进行实时监控,并通常与一个独立网络相连接。这使得我们能够如同身临其境般地操控每一台计算机,同时提供了丰富的API接口,涵盖了硬件健康状况的监控、BIOS配置的调整以及电源管理的全面控制。有了这些组件,我们卷起袖子开始设置集群。
步骤 0:获取一台预配机器
我们首先使用iDRAC(戴尔的主板管理控制器)在一台服务器上安装Ubuntu 22.04,该服务器将用于设置其他所有内容。除此之外,iDRAC还允许我们从本地计算机挂载并从ISO镜像启动,浏览器中提供了一个虚拟控制台。理想状态下,这将是此过程中唯一的手动安装步骤。
步骤 1:在每台机器上安装操作系统
在完成首台目标服务器的部署后,我们继续安装Ubuntu的Metal-as-a-Service(MAAS)软件,以便配置剩余的服务器。通过PXE(预启动执行环境)启动机制和iDRAC的自动化工具,我们通过指令让所有服务器从网络启动,并确保MAAS能够响应PXE启动请求。在执行初始网络启动时,服务器无需在本地存储上安装任何软件,即可通过DHCP(动态主机配置协议)从MAAS获取IP地址并加载初始内核。随后,这个基础系统环境自动用于执行持久的操作系统安装。理论上,我们只需等待首次启动,所有配置工作即可自动完成。然而,在实际操作中,由于MAAS与BMC的集成不够稳定,我们不得不提前通过iDRAC API收集每台服务器的MAC地址(作为唯一的硬件标识符),以便进行后续的管理。
在整个训练周期中,MAAS作为堆栈的组成部分,整体表现稳定可靠。不过,初期阶段,我们在配置上遇到了一些特定障碍。例如&#