大模型训练:如何解决GPU万卡互联挑战?

如何解决GPU万卡互联的挑战

81bacb8b0d4014874913b97aaedcf5ef.jpeg

近日,字节跳动携手北京大学研究团队发布重磅论文,揭示了一项革命性技术:将大型语言模型训练扩展至超10,000块GPU的生产系统。此系统不仅解决了万卡集群训练大模型时的效率和稳定性难题,更标志着人工智能领域的一大步跨越,为未来的智能世界奠定坚实基础。

本论文详尽阐述了系统的设计、实现与部署流程,并深入探讨了万卡级别集群规模的挑战与应对策略,为相关领域提供了宝贵参考。

01 万卡集群的两大挑战

大模型时代,算力即生产力,模型与数据的大小决定其能力。市场巨头们以数万GPU构建AI集群,以训练LLM。然而,当GPU集群规模达万卡,高效稳定的训练成为挑战。我们深知,在算力与模型的双重考验下,唯有掌握核心技术与创新方法,方能引领大模型时代,实现生产力的飞跃。

大规模高效训练是首要挑战。模型浮点运算利用率(MFU)作为评估训练效率的通用指标,直观反映训练速度。在训练大型语言模型(LLM)时,需将模型分布至多个GPU,并确保GPU间高效通信。然而,通信仅是冰山一角,操作符优化、数据预处理及GPU内存消耗等因素亦对MFU产生深远影响。优化这些因素,方能提升训练效率,迎接大规模高效训练的挑战。

第二个挑战在于确保大规模训练过程中的高稳定性与高效率。在大模型训练中,稳定性至关重要,因为失败和延迟虽然常见,但代价高昂。缩短故障恢复时间刻不容缓,因为一旦有掉队者,不仅影响个人进度,更可能导致数万GPU的整体作业受阻。我们需精心优化,确保训练稳定高效,以应对这一挑战。

面对挑战,字节跳动创新推出MegaScale超大规模系统,并已成功应用于自家数据中心。究竟字节如何攻克难题?揭秘其解决方案,展现技术实力,引领行业新风尚。


02 如何实现大模型的高效训练?

要在保证模型精准度的基础上应对计算需求的激增,需运用尖端算法优化、通信策略、数据流水线管理以及网络性能调优技术。本文深入剖析大型模型训练优化方法,助力实现大规模高效训练,确保性能与效率双赢。

算法优化

经过算法层面的精心优化,我们在确保准确性的基础上,显著提升了训练效率。此次优化涵盖了并行Transformer块、滑动窗口注意力(SWA)以及LAMB优化器等关键技术,为您带来更高效、更稳定的计算体验。

并行Transformer块革新计算模式,摒弃传统序列化公式,实现注意力块与MLP块的并行运算,大幅缩短计算时间。研究表明,此改进不仅未损害数千亿参数模型的质量,反而提升了处理效率。这项创新将引领深度学习领域迈向更高效、更快速的新纪元。

滑动窗口注意力(SWA)是一种高效稀疏注意力机制,通过固定大小窗口聚焦输入序列的每个标记,显著优于全自注意力。堆叠SWA层,模型轻松捕获广泛上下文,构建大感受野,既确保准确性又提升训练速度。SWA,让注意力更集中,训练更高效。

b6168047fe4730cecbcf7aaf9671e55b.jpeg

LAMB优化器突破了大规模高效训练中的批量大小限制难题。即便增加批量大小,它也能确保模型收敛不受影响。这一创新使得BERT的训练批量大小能够扩展至惊人的64K,同时维持了训练准确性,为深度学习领域带来了革命性的提升。

3D并行中的通信重叠

3D并行指张量并行、流水线并行和数据并行。

在数据并行中有两个主要通信操作:all-gather操作和reduce-scatter操作。在3D并行中,单个设备可能承载多个模型块。重叠是基于模型块实现的,以最大化带宽利用。all-gather操作在模型块的前向传递之前触发,reduce-scatter操作在它的后向传递之后开始。这导致第一个all-gather操作和最后一个reduce-scatter操作无法隐藏。受到PyTorch FSDP的启发,初始的all-gather操作在每次迭代的开始时被预取,允许它与数据加载操作重叠,有效地将减少了通信时间。

f65c35f2bc7c54fcf3f1563dffc91a08.jpeg

MegaScale在流水线并行中,运用独特的交错1F1B调度方法,有效重叠通信,提升效率。热身阶段,前向传递摆脱了对先前接收的依赖,实现发送与接收的解耦,使发送操作与计算并行进行。在张量/序列并行方面,我们采取融合通信与计算等创新策略,更将GEMM内核精细划分,与通信流程协同流水线执行,最大化提升并行性能。

高效操作符

MegatronLM虽然已优化GEMM操作符,但其他操作符仍有待增强。注意力部分采用FlashAttention-2,优化了线程块和warp间的工作分配。LayerNorm和GeLU由细粒度内核构成,通过融合这些内核,减少了启动多个内核的开销,优化了内存访问模式,从而显著提升性能。我们致力于深入挖掘各操作符的潜力,力求在MegatronLM中实现更出色的整体性能。

数据流水线优化

数据预处理与加载虽常被忽略,却在训练之初引发显著的GPU空闲。优化这些关键步骤,对于提升训练效率至关重要,不容忽视,是确保模型性能优化的关键环节。

异步数据预处理能够优化计算流程,使数据预处理与GPU工作器同步梯度互不干扰。在训练步骤间隙,预处理工作悄然进行,巧妙隐藏了开销,提升了整体训练效率。

消除冗余数据加载器。在分布式训练的典型数据加载阶段,每个GPU工作器都配备了自己的数据加载器,负责将训练数据读入CPU内存,然后转发到GPU。这导致工作线程之间为争夺磁盘读取带宽,因此产生了瓶颈。我们观察到,在LLM训练设置中,同一台机器内的GPU工作器处于相同的张量并行组。因此,它们每次迭代的输入本质上是相同的。基于这一观察,我们采用了两层树状的方法,在每台机器上使用一个专用的数据加载器将训练数据读入共享内存。随后,每个GPU工作器负责将必要的数据复制到自己的GPU内存中。这就消除了冗余读取,并显著提高了数据传输的效率。

集体通信群初始化

在分布式训练中,初始化阶段需构建GPU工作器间的NVIDIA集体通信库(NCCL)通信组。小规模场景下,此开销微不足道,故常选torch.distributed。然而,当GPU数量飙升破万,传统方法的开销骤增,变得不堪重负。因此,高效优化分布式训练初始化阶段,对于大规模GPU集群的性能提升至关重要。

torch.distributed初始化耗时过久,主要有两大原因。其一,同步步骤中的每个进程在完成特定通信组初始化后,均需执行屏障操作,而此操作基于TCPStore,采用单线程、阻塞的读写模式。为解决这一问题,我们可以采用非阻塞、异步的Redis来替代TCPStore。其二,全局屏障的不当使用也是导致耗时过长的因素之一。在初始化通信组后,每个进程均会执行全局屏障操作。为改善此情况,我们优化了通信组的初始化顺序,减少了全局屏障的使用频率,从而大幅降低了初始化时间复杂度。

未经优化的2048张GPU集群初始化需1047秒,经优化后骤减至5秒内;万卡GPU集群的初始化时间更是锐减至30秒以下,显著提升集群性能,加速计算效率。

网络性能调优

经过对3D并行中机器间流量的深入分析,我们精心设计了技术方案,旨在优化网络性能。方案涵盖网络拓扑优化、ECMP哈希冲突减少、高效拥塞控制及重传超时精准设置,全面提升网络效能。

我们的数据中心网络采用了Broadcom Tomahawk 4芯片构建的高性能交换机,每颗芯片总带宽高达25.6Tbps,拥有64×400Gbps端口。通过CLOS类似的三层交换机拓扑连接,轻松驾驭超过10000个GPU的庞大规模。每层交换机实现1:1的下行与上行链路带宽比,即32端口下行,32端口上行,确保数据流畅无阻。该网络设计精巧,直径小,带宽高,每个节点均可在极短的跳数内与其他节点畅通交流,为数据的高效传输提供有力保障。

我们专注于优化网络性能,通过精心设计网络拓扑与精准调度网络流量,显著减少ECMP哈希冲突。创新性地,在机架ToR交换机上将上行与下行链路分离,并将400G下行链路端口巧妙地通过特定AOC电缆划分为两个200G端口,这一举措有效降低了冲突率,提升了网络整体效率。

在分布式训练中,大规模应用默认的DCQCN协议时,all-to-all通信常引发拥塞,导致PFC级别攀升,过度使用更可能诱发头部阻塞(HoL),从而大幅削减网络吞吐量。为解决此问题,我们精心研发了一种融合Swift与DCQCN精髓的算法。该算法巧妙结合往返时间(RTT)的精准测量与显式拥塞通知(ECN)的迅速响应,不仅大幅提升了吞吐量,更是有效降低了与PFC相关的拥塞现象,为分布式训练中的网络通信保驾护航。

重传超时设置是NCCL中的关键参数,能够灵活控制重传定时器和重试次数。我们针对链路抖动,精细调整这些参数,确保快速恢复。同时,NIC上的adap_retrans功能进一步助力,支持更短间隔内的重传,尤其在抖动周期短时,能显著加速传输恢复,保障数据传输的高效稳定。


03 容错性

随着训练集群规模迅速扩大至数万GPU,软硬件故障频发成常态。我们针对LLM训练,精心打造了一个强健的训练框架,可自动识别故障并迅速恢复,实现高效容错,最大程度减少人为干预与对训练任务的影响,确保训练持续稳定进行。

77cbb97f0497faf3484f5d32e79e2504.jpeg

如图所示,一旦接收到训练任务,驱动程序进程便与自定义Kubernetes接口高效互动,精准分配计算资源,并为每个执行器迅速启动相应的Pod。执行器独立管理单个节点,初始化完成后,它会在每个GPU上迅速创建训练进程,并启动一个强大的训练守护进程。该进程定时向驱动程序发送heartbeat,确保实时异常检测与预警。一旦检测到异常或预定时间内未收到状态报告,故障恢复程序将立即启动,暂停所有训练任务,并指令它们进行自我检查诊断,确保系统稳定高效运行。

一旦识别出问题节点,驱动程序会迅速向Kubernetes提交相关IP地址及运行的Pod信息,Kubernetes随即驱逐故障节点,无缝切换至健康节点。同时,我们还提供直观的用户界面,便于手动清除问题节点。训练恢复时,驱动程序从最新checkpoint无缝衔接,我们对此过程进行了深度优化,以最大程度减少训练进度的损失,确保系统稳定高效运行。

为强化训练稳定性与性能监控,我们精心研发毫秒级精度监控系统,通过多级监控精准追踪各项指标。同时,分享checkpoint快速恢复、训练故障排查及MegaScale部署运营的实战经验。渴望深入探索的读者,可下载论文,一窥究竟。诚邀您共襄盛举,共创智能未来!

04 结论

本文深度剖析MegaScale的设计、实现及部署流程。它采用算法与系统协同设计策略,显著提升训练效率。在12288个GPU上训练175B LLM模型时,MegaScale实现了高达55.2%的MFU,相比Megatron-LM,性能提升达1.34倍。MegaScale展现出的卓越性能,无疑将引领大规模模型训练的新篇章。

a68672282b6dde7b5f4d68c3718353ee.jpeg

我们专注于打造具备容错能力的训练流程,特此推出定制的健壮训练框架,能够智能定位并修复故障。同时,我们提供了一套全面的监控工具,深入洞察系统组件与事件,助力精准识别复杂异常的根源。我们的工作旨在为LLM训练者提供宝贵见解,并为这一迅猛发展的领域探索未来研究之路,奠定坚实基础。


-对此,您有什么看法见解?-

-欢迎在评论区留言探讨和分享。-

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/805993.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用dbms_shared_pool.purge清除执行计划

1.Oracle 11g如何清除share pool中某条SQL的执行计划 以前在Oracle 10g数据库上,如果遇到绑定窥探导致执行计划慢的情况,想要清除某条SQL的执行计划,让它硬解析,找了很久都没有找到直接操作share pool的方法(总不能alter system flush shared_pool),只能…

rocketmq和rabbitmq总是分不清?

1. 官方解答 摘自百度搜索: 2. 通俗易懂的回答

【Gem5】获取构建教程

gem5-tutorial-hpca-2023 1 介绍 1.1 Gem5是什么1.2 Gem5可以用来做什么1.3 获取并构建gem5 gem5-tutorial-hpca-2023 打开网址: github 创建教程代码空空间 “Code” -> “Codespaces” -> “Create Codespace on master” GitHub Codespaces 是一个由…

最坏情况为线性时间的第k大元素

在统计和数据分析中,我们经常会遇到求最大值、最小值、中位数、四分位数、Top K等类似需求,其实它们都属于顺序统计量,本文将对顺序统计量的定义和求解算法进行介绍,重点介绍如何在最差时间复杂度也是线性的情况下求解第k大元素。…

在Debian 12系统上安装Docker

Docker 在 Debian 12 上的安装 安装验证测试更多信息引言 在现代的开发环境中,容器技术发挥着至关重要的作用。Docker 提供了快速、可靠和易于使用的容器化解决方案,使开发人员和 DevOps 专业人士能够以轻松的方式将应用程序从一个环境部署到另一个环境。 Docker 的安装过程在…

实用运维工具(转载)

1、查看进程占用带宽情况-Nethogs Nethogs 是一个终端下的网络流量监控工具可以直观的显示每个进程占用的带宽。 下载:http://sourceforge.net/projects/nethogs/files/nethogs/0.8/nethogs-0.8.0.tar.gz/download [rootlocalhost ~]#yum -y install libpcap-deve…

C语言—每日选择题—Day68

第一题 1、运行以下C语言代码&#xff0c;输出的结果是&#xff08;&#xff09; #include <stdio.h> int main() {char *str[3] {"stra", "strb", "strc"};char *p str[0];int i 0;while(i < 3){printf("%s ",p);i;} retur…

在win10上虚拟一个LoongOS系统(类似虚拟机)作为开发环境

文章目录 1.安装1.1.下载这三个东西1.2.安装好qemu。1.3.创建一个启动脚本startup_mate.bat&#xff0c;然后把三部分东西放到一起1.4.然后双击startup.bat就可以启动了。 2.文件的传输2.1.使能虚拟机系统的ssh2.2.连接ssh 3.Qt相关安装Qt安装opencv 1.安装 注意&#xff0c;一…

ClickHouse--17--argMin() 和argMax()函数

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 argMin() 和argMax()函数业务场景使用案例1.准备表和数据&#xff1a;业务场景一&#xff1a;查看salary 最高和最小的user业务场景二&#xff1a;根据更新时间获取…

再也不怕面试官问 OOM了,一次生产环境 Metaspace OOM 排查流程实操!

问题背景 小奎公司的运维同时今天反映核心业务一个服务目前 CPU 的使用率、堆内存、非堆内存的使用率有点高。刚反映没有过多久该服务就直接 OOM 了&#xff0c;以下是生产监控平台监控信息。 CPU 使用率监控 堆内存和非堆内存使用率 OOM 产生的日志报错信息 问题分析 根…

Go第三方框架--ants协程池框架

1. 背景介绍 1.1 goroutine ants是站在巨人的肩膀上开发出来的&#xff0c;这个巨人是goroutine&#xff0c;这是连小学生都知道的事儿&#xff0c;那么为什么不继续使用goroutine(以下简称go协程)呢。这是个思考题&#xff0c;希望讲完本文大家可以有个答案。 go协程只涉及用…

Docker部署minio集群

1.基本定义 由于是非常轻量级的软件&#xff0c;所以架构上也没有这么复杂&#xff0c;他使用操作系统的文件系统作为存储介质&#xff0c;我们在向任意节点写数据的时候&#xff0c;minio会自动同步数据到另外的节点&#xff0c;而机制叫做erasure code&#xff08;纠删码&am…

linux内核驱动-在内核代码里添加设备结点

linux中&#xff0c;一切皆文件 我们在用户层用一些系统函数&#xff08;如&#xff1a;fopen等等&#xff09;时&#xff0c;会进入内核&#xff0c;内核会在字符注册了的设备号链表中查找。如果找到就运行我们写的设备文件的&#xff08;驱动&#xff09;函数 我们在前面已经…

RuoYi-Vue若依框架-vue前端给对象添加字段

处理两个字段的时候有需求都要显示在下拉框的同一行&#xff0c;这里有两种解决方案&#xff0c;一是后端在实体类添加一个对象&#xff0c;加注解数据库忽略处理&#xff0c;在接口处拼接并传给前端&#xff0c;二是在前端获取的数据数组内为每个对象都添加一个字段&#xff0…

cannal的使用

搭建MySQL 安装canal 1.新建文件夹logs, 新建文件canal.properties instance.properties docker.compose.yml instance.properties ################################################# ## mysql serverId , v1.0.26 will autoGen # canal.instance.mysql.slaveId0# enable g…

06 Php学习:字符串

PHP 中的字符串变量 在 PHP 中&#xff0c;字符串是一种常见的数据类型&#xff0c;用于存储文本数据。字符串变量可以包含字母、数字、符号等字符&#xff0c;并且可以进行各种操作和处理。以下是关于 PHP 中字符串变量的一些重要信息&#xff1a; 定义字符串变量&#xff1…

【SpringBoot3】Bean管理

1.Bean扫描 1.1传统Spring 标签&#xff1a;<context:component-scan base-package"com. example "/>注解&#xff1a;ComponentScan(basePackages "com.example") 1.2SpringBoot SpringBoot默认扫描启动类所在的包及其子包 2.Bean注册 如果要注…

SQL注入sqli_labs靶场第五、六题

第五题 根据报错信息&#xff0c;判断为单引号注入 没有发现回显点 方法&#xff1a;布尔盲注&#xff08;太耗时&#xff0c;不推荐使用&#xff09; 1&#xff09;猜解数据库名字&#xff1a;&#xff08;所有ASCII码值范围&#xff1a;0~127&#xff09; ?id1 and length…

TDengine too many open files

too many open files 是比较常见的报错&#xff0c;尤其使用TDengine 3.0 集群时&#xff0c;大概率会遇到。这个报错很简单&#xff0c;但要想顺利解决&#xff0c;却涉及到很多知识点。 目录 知识点&#xff1a;fs.nr_open知识点&#xff1a;file-max & fs.file-nr知识点…

Linux多进程通信(4)——消息队列从入门到实战!

Linux多进程通信总结——进程间通信看这一篇足够啦&#xff01; 1.基本介绍 1&#xff09;消息队列的本质其实是一个内核提供的链表&#xff0c;内核基于这个链表&#xff0c;实现了一个数据结构&#xff0c;向消息队列中写数据&#xff0c;实际上是向这个数据结构中插入一个…