万字干货!手把手教你如何训练超大规模集群下的大语言模型

news2024/11/15 15:53:15

分布式训练的主要难点

简单介绍一下混合并行中经典的三种并行方案。首先是数据并行,简称 DP。正如其名,数据并行是将数据分割到不同的计算设备上,然后由这些设备完成各自的计算任务。第二种是张量并行,简称 TP。张量并行是将模型中某些层的参数分散到不同的设备上,每个设备负责完成部分的计算工作。第三种是流水并行,简称 PP。流水并行是将模型的不同层切分到不同的计算设备上,类似于流水线的工作方式,各个设备协同完成整个模型的计算过程。

大模型训练在超大规模集群下

的挑战与解决方案

随着模型规模和集群规模的扩大,通信在训练过程中的占比越来越大。为了更直观地展示这一现象,我提供了两张时间线图,它们没有应用计算通信重叠技术。第一张图突出显示了在实现 DP 重叠前的数据并行通信状态,第二张图则突出显示了在实现 TP 重叠前的张量并行通信情况。

从图中我们可以看到,在端到端的训练过程中,DP 的通信占比实际上超过了 15%,而 TP 的通信时间占比也超过了 30%。因此,减少通信对训练的影响,对提升训练效率至关重要。

DP Overlap

DP overlap 的方案在理论上看起来非常吸引人,但实际应用中,我们真的能显著提升训练效率吗?在进行 DP overlap 优化时,我们遇到了三个主要问题。首先,是通信和计算资源之间的竞争问题。当通信和计算操作同时进行时,它们会争夺有限的硬件资源,这可能会影响整体的系统性能。其次,在混合并行场景下,DP overlap 还可能带来 PP bubble 的问题。第三,不同通信资源的争抢还可能导致网络拥塞。

DP overlap 引入的 PP bubble 问题。在前面,我们讨论了通信对计算效率的影响。如果我们模仿 ZeRO 的调度策略,由于 overlap 计算的时间会长于 none overlap 计算的时间,这种负载不均衡会导致 PP bubble 的产生。即图中的 Micro batch 2 的前向传播和 Micro batch 1 的反向传播较长的现象,这展示了负载不均的情况。我们提出的解决方案是通信时机的纵向对齐,这样可以极大地缓解 PP bubble 的问题。同时需要强调的是,从计算 overlap 部分移出来的通信都被放在了 PP bubble 上,因此它不会产生任何额外的影响。这种策略有助于平衡负载,减少因通信和计算不匹配而产生的效率损失。

下图展示了我们最终优化后的 timeline。在这个优化版本中,我们实现了 reduce-scatter 与反向传播的 overlap,同时 all-gather 操作与前向传播也实现了 overlap。此外,我们通过分桶通信、网络预测控制、通信 CHANNEL 调优以及通信时机的纵向对齐等方法,大幅优化了 DP 的通信开销。这些优化措施共同作用,提高了整体的训练效率,减少了因通信而产生的延迟和资源浪费。

TP Overlap

然后我们可以将这种策略推广到四个 rank 的场景中。为了简化表述,我们将计算的 stream 都合并到了一起。对于 all-gather overlap GEMM,我们会特别关注第一个 rank。第一步,我们使用自己持有的那部分输入来进行计算,同时将自己持有的内容也发送给其他 rank,并接收其他 rank 中持有的那部分输入。接下来的第二步、第三步、第四步都是按照相同的原理进行。通过这种方式,我们就可以得到一个 all-gather 的 overlap 流程。这样,每个 rank 都在进行本地计算的同时,与其他 rank 进行数据交换,实现了计算与通信的重叠。这种策略可以有效地减少等待时间,提高资源利用率,从而提升整体的并行计算效率。

Reduce scatter 的操作也是类似的。我们可以首先关注 rank 4 在整个计算结果流程中的作用。在第一步中,rank 4 的计算结果被放置在 rank 1 上。rank 1 完成自己的计算后,在第二步中,它会将这个结果发送给 rank 2。rank 2 在接收到来自 rank 1 的结果后,会将其与自己的计算结果进行累加,然后继续进行下一步的计算。接着,在第三步和第四步中,流程与前两步相同。rank 3 和 rank 4 也会按照这个顺序接收之前 rank 传递的结果,并与自己的计算结果进行累加。最终,在流程的最后, rank 4 将拿到汇总后的最终结果。

通过上述步骤,我们得到了一个完整的解决方案,适用于处理通信和计算存在依赖关系时的通信计算重叠问题。

这是 TP overlap 的整体解决方案,对于计算通信没有依赖的情况,这里是指 column-wise linear 的反向传播。由于这部分操作没有数据依赖关系,我们采用了 bulk overlap 技术。对于其余的通信和计算,因为它们之间存在依赖关系,我们采用了 split pipeline overlap 的方法。

下图展示了实现 TP overlap 后的 timeline,我们可以看到 TP 的通信和计算重叠在了一起。同时,我们进行了两项优化措施:第一项是使用了 peer-to-peer memory copy,以此来减轻通信对 SM 的消耗。第二项优化是将计算分散到不同的 stream 上,这样计算也可以实现部分的重叠。

超长文本场景解决方案

针对 TP 作为通信换显存的两大弊端——在 h 维度上切分导致的不可扩展性以及方案本身的通信量大,我们希望找到一种在 s 维度上可以切分并且通信量相比 TP 小一些的方案。为此,我们实现了上下文并行(context parallel,简称 CP)。

在 CP 场景下,整个模型的 activation 从始至终都在 s 维度上保持着切分状态。之前无法解决的问题,通过 CP=4 就可以解决。我们可以计算这个方案的通信开销,CP 引入的通信开销仅有 KV 前向时的 all-gather 和反向时的 all-gather 以及 reduce-scatter。同时,我们改变了 QKV 的计算顺序,使得 K 的通信可以与 V 的计算重叠,V 的计算可以与 Q 的计算重叠。因此,我们可以得出下述两个结论。

  1. CP 的通信量与 KV 的 activation 大小成正比。在混合并行场景下,利用了 TP 可以减少 activation 大小的特点,使得 CP 的通信量相比于直接扩大 TP 可以减少 TP 倍。

  2. 由于 CP 的通信可以与计算进行重叠,因此进一步减少了对训练的影响。同时,由于 CP 的切分维度在 s 上,理论上如果有足够的机器,CP 可以解决任意大小的上下文窗口问题。

CP 与其他技术结合时,会带来一些额外的好处和挑战。首先是计算负载均衡问题,这个问题的背景是大语言模型采用了 Decoder Only 架构,并且在 attention 中使用了 causal mask,这导致 CP 会引入计算负载不均的问题。从下面的左图中可以看到,rank 0 的计算负载明显低于 rank 1。

为了解决这个问题,我们采用了类似高斯求和的方法,让每个设备负责一大一小两个 attention 的计算,以此来缓解负载不均的问题。由于同一个设备上的这两个 attention 计算之间不存在依赖关系,为了进一步提升硬件利用率,我们仿照 TP overlap,使用了不同的 CUDA stream 来 launch 两个 kernel。借助 CUDA 的 runtime 调度,我们实现了更高效的并行计算。

结合 CP 还有一些额外的好处。GQA(Grouped Query Attention)是在长上下文场景下几乎必选的技术。与原来的 Multihead attention 相比,GQA 将多个 query 作为一个 group,每个 group 对应一个 K 和 V。可以发现,GQA 可以极大地减少 KV activation 的大小。正如之前提到的,CP 的通信量与 KV 的 activation 大小成正比。因此在 GQA 的场景下,我们可以进一步减少 CP 的通信量,这是结合使用 CP 和 GQA 技术的一个显著优势。

下面是关于计算换显存的方案,其中 recomputing 是一个非常经典的技术。首先,让我们对 recomputing 做一个介绍。下图展示了一个正常的模型训练过程中的数据流。由于反向传播计算对前向传播计算结果存在数据依赖,因此在前向计算完成后,计算结果并不会立即释放,而是要等到反向计算完成后才释放。

右侧的图展示了使用 recomputing 方案的情况。可以看到,在 0 到 3 层的中间结果被释放了,只有 recomputing block 的输入,也就是 layer 0 的 input 被保存了下来。在反向传播过程中,我们会使用保存下来的 input 重新计算 0 到 3 层的前向传播结果,然后再进行反向计算,从而达到节省显存的目的。这个方案从理论上看起来非常理想,但在实际应用中也会遇到一些问题。

首先,主流的框架都采用了 full computing,这导致每次反向计算都会执行一次完整的 forward pass,引入了大量的无效计算。在大模型时代,这种情况是不可接受的。其次,目前的开源框架 Megatron-LM 对 attention 部分实现了 selective recomputing。然而,在 flash attention 时代,这个方案的效率已经不如以前了。

经过观察,我发现某些 kernel,例如 GEMM,其反向计算实际上并不依赖于前向传播的输出结果。例如,对于公式 𝑌=𝑋𝑊,𝑑𝑋 和 𝑑𝑊 的计算并不依赖于前向传播的结果 𝑌。如果我们将这类算子作为 recomputing block 中的最后一个算子,就无需对它们进行重计算。

大家可以看下图右侧。假设层 3 是一个 GEMM 操作,那么 layer 3 的反向计算只依赖于层 3 的输入,而不是层 3 的输出。这样,在重计算时,我们可以省去 layer 3 的前向计算。我将这种重算策略称为 GEMM last recomputing。

我们将 GEMM last recomputing 策略实施到大语言模型的训练中,发现只需要对计算量较小的算子进行重算。相比于没有采用 recomputing 的方案,我们的策略在增加了不到 1.5% 的计算量的情况下,减少了 40% 的显存开销。这是一个在保持计算效率的同时显著减少显存需求的有效方法。

接下来是内存换显存的方案。我最初产生这个想法的原因是,在训练过程中,显存资源已经非常紧张,然而内存资源在训练状态下却几乎处于闲置状态,这为我们提供了一定的操作空间。其次,随着硬件的升级,PCIe 已经升级到第五代,每张卡分配到的 x16 带宽达到了 64GB/s。同时,由于 H2D(Host to Device)和 D2H(Device to Host)是 memory copy 操作,它们对计算的影响几乎可以忽略不计。在混合并行场景下,每次前向计算产生的 activation 并不会立即被使用,而是至少要间隔一个完整的虚拟 pipeline stage 计算,因此混合并行架构也为我们提供了足够的时间窗口。

我们的解决方案是,将每个虚拟 pipeline stage 前一个 micro batch 的 activation H2D 和 D2H 的通信操作与下一个 micro batch 的计算进行 overlap,这样可以极大减少 offload 对关键路径上计算的影响。通过这个 offload 方案,我们能够在几乎不影响计算性能的情况下实现内存换显存的效果,上下文窗口大小提升了 2.5 倍。

接下来展示的是这个解决方案的整体成果。我们在 H800 集群上进行的测试显示,在吞吐量上,与现有的最先进开源方案相比,我们在** 任意上下文窗口下都能实现超过 30% 的性能提升。** 能达到这样的性能提升主要归功于两点原因:

  • 第一,我们采用了通信代价更小的 CP 来替代 TP,从而降低了为解决显存问题而引入的通信开销;

  • 第二,我们采用了 GEMM last recomputing 和 pipeline aware offloading 这两种更具成本效益的显存问题解决方案,减少了以通信换取显存的需求,进一步实现了训练吞吐量的提高。

在支持的序列长度上限方面,首先,我们通过内存换显存、通信换显存、计算换显存的方法,大幅提升了单个设备支持的上下文窗口。同时,由于该方案还具有极强的可扩展性,因此在设备资源充足的情况下,我们可以支持无限大的上下文窗口。

接下来是 cost model(成本模型)的介绍。在进行大模型训练时,参数调整是一个非常痛苦的过程,因为模型有大量的参数,并且这些参数之间相互影响,比如 TP、CP、DP 的大小,以及 offload 的比例,还有网络设置中的 CTS。如果对所有参数都进行实际运行测试,将会消耗大量的计算资源。然而,如果不进行实际运行,仅仅通过比例和一些基于 FLOPs 理论算力的简单折算来预测,会导致预测极其不准确。因此,这样的成本模型是不可行的。

为了解决这个问题,我们对 TP、CP、PP 等一系列可能影响性能的因素进行了细致的建模。我们将所需信息分为与模型相关的信息,比如不同组合下单层前向和反向传播的时间;以及与集群相关的信息,比如跨机器的集群通信带宽或者 H2D 的带宽等。整体的测量耗时可以在一个小时内完成,并且这些信息可以多次复用。

在 175b 的案例中,我们建模的预测值和实测值之间的误差控制在 2% 以内。在实际使用过程中,我们的成本模型的误差与实测值的对比也不超过 5%,其中大部分误差来源于网络的不稳定性。下图右边展示了我们的成本模型给出的参数配置表。通常情况下,搜索完成后,我们可以根据 MFU 的前 5 名进行实际测试,最终得到我们的训练配置。这种方法大大提高了参数调整的效率和准确性。

如何学习AI大模型?

大模型时代,火爆出圈的LLM大模型让程序员们开始重新评估自己的本领。 “AI会取代那些行业?”“谁的饭碗又将不保了?”等问题热议不断。

不如成为「掌握AI工具的技术人」,毕竟AI时代,谁先尝试,谁就能占得先机!

但是LLM相关的内容很多,现在网上的老课程老教材关于LLM又太少。所以现在小白入门就只能靠自学,学习成本和门槛很高

针对所有自学遇到困难的同学们,我帮大家系统梳理大模型学习脉络,将这份 LLM大模型资料 分享出来:包括LLM大模型书籍、640套大模型行业报告、LLM大模型学习视频、LLM大模型学习路线、开源大模型学习教程等, 😝有需要的小伙伴,可以 扫描下方二维码领取🆓↓↓↓

👉[CSDN大礼包🎁:全网最全《LLM大模型入门+进阶学习资源包》免费分享(安全链接,放心点击)]()👈

学习路线

在这里插入图片描述

第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;

第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;

第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;

第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;

第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;

第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;

第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。

在这里插入图片描述

👉学会后的收获:👈

• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;

• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;

• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;

• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。

在这里插入图片描述

1.AI大模型学习路线图
2.100套AI大模型商业化落地方案
3.100集大模型视频教程
4.200本大模型PDF书籍
5.LLM面试题合集
6.AI产品经理资源合集

👉获取方式:
😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓

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

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

相关文章

Swift concurrency 5 — async let的理解与使用

在前面的文章中,我们介绍过async/await这两个关键字,也了解了异步方法,在一个Task中,多个加了await的异步方法是顺序执行的,一个接着一个,这个在有些情况下是很好的,比如用户登录,获…

element-ui 表单Cannot read property ‘indexOf‘ of undefined

在使用resetField 报错Cannot read property ‘indexOf’ of undefined 复现说明 报错展示 解决方案 用clearValidate()替换resetFields()

Mysql基础练习题 183.找出所有从不点任何东西的顾客 (力扣)

183.找出所有从不点任何东西的顾客 建表插入数据: #插入数据,顾客表和订单表 Create table If Not Exists Customers (id int, name varchar(255)) Create table If Not Exists Orders (id int, customerId int) Truncate table Customers insert into…

Java面试宝典-java基础09

Java面试宝典-java基础09 81、String,Stringbuffer,StringBuilder 的区别82、Comparator 与 Comparable 有什么区别83、说说反射用途及实现原理,Java 获取反射三种方法84、&和&&的区别85、Java 创建对象有几种方式86、如何将 GB2312 编码字符串转换为 ISO-8859-…

一起学Java(11)-[日志篇]教你分析SLF4J源码,掌握Logger接口实现类加载原理

最近各种事情很忙,今天继续。在第十篇(一起学Java(10)-为项目引入Log框架(Log篇二-引入SLF4J接口层框架))中,我们为项目(https://github.com/lihongzheshuai/java-all-in-one)引入了SLF4J和Logback框架,按计划通过阅读源码研究下SLF4J的实现原…

如何在忘记密码或 ID 的情况下解锁 iPhone 15

您是否曾经因为忘记了 iPhone 密码而陷入困境,或者您是否多次错误地输入了屏幕时间密码并发现自己被锁定在 iPhone 之外? 被锁定和拒绝访问您的 iPhone 可能很常见,尤其是在您尚未配置 Face ID 的情况下。或者,如果 Face ID 无法正…

【机器学习】广义线性模型和一般线性模型的联系和区别以及如何选择合适的链接函数

引言 广义线性模型(Generalized Linear Models,简称GLM)和一般线性模型(通常指的是线性回归模型)都是统计建模中常用的工具,但它们在假设、适用范围和模型结构上有所不同 文章目录 引言一、广义线性模型和一…

黑马程序员Python机器学习|1机器学习概述

一 人工智能概述 1.机器学习和人工智能,深度学习的关系 2.机器学习可以做什么 翻译,智能客服。 二 什么是机器学习 1.机器学习的定义 从数据中学习,学习后得出的结论是模型(规律),通过这个规律去解决问题&a…

网络安全教程初级简介

随着技术的发展和信息池的增加,信息系统迫切需要建立网络安全措施,以保护输入这些系统的信息。网络安全是任何组织(从小型初创公司到大型跨国组织)的必备条件。 网络安全包括一系列技术、流程和实践,用于保护网络、设…

测试面试题,自动化测试与性能测试篇(附答案)

本系列文章总结归纳了一些软件测试工程师常见的面试题,主要来源于个人面试遇到的、网络搜集(完善)、工作日常讨论等,分为以下十个部分,供大家参考。如有错误的地方,欢迎指正。有更多的面试题或面试中遇到的…

直播电商如何实现精细化运营,破除流量互卷的困境?

在当今电商行业的激烈竞争中,流量的获取与维持已成为品牌和商家关注的焦点。然而,随着市场逐渐饱和,流量成本不断攀升,传统的流量获取方式已不再可持续,精细化运营才是电商企业脱颖而出的关键。 本文将深入探讨电商行…

聚类算法k-means(手撕和调用skl)

定义 K均值聚类(k-means clustering)算法是一种常用的、基于原型的聚类算法,简单、直观、高效。其步骤为: 第一步:根据事先已知的聚类数,随机选择若干样本作为聚类中心,计算每个样本与每个聚类…

大数据及人工智能产品应该如何测试?

当今社会,人工智能的发展非常快,自从2016年AlphaGo战胜了世界围棋冠军李世石之后,人工智能的发展,特别是以深度学习为代表的人工智能的发展到了一个高速发展的阶段。 现在人工智能的发展已经渗透到了我们生活的方方面面&#xff…

如何对 PDF 进行密码保护

保护机密文件非常关键。对 PDF 进行密码保护的策略是在未经授权的访问时增加一层安全保护。在处理高度机密的文档或个人数据时,使用密码保护它们是一个好主意。 也就是说,如果您担心如何在笔记本电脑和台式机上使用密码保护 PDF, 以及您是否…

深入浅出通信原理 | 单位冲激响应和时域卷积定理

微信公众号上线,搜索公众号小灰灰的FPGA,关注可获取相关源码,定期更新有关FPGA的项目以及开源项目源码,包括但不限于各类检测芯片驱动、低速接口驱动、高速接口驱动、数据信号处理、图像处理以及AXI总线等 本节目录 一、单位冲激响应 1、离…

rpm安装出现警告: 密钥 ID f4a80eb5: NOKEY的解决办法

当我们使用rpm安装时有时会出现警告:/mnt/Packages/ethtool-4.8-9.el7.x86_64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID f4a80eb5: NOKEY 这是因为各个软件之间总会存在一些依赖关系,所以才会发出警告,这时候我们只需要在后面加上"–…

C++面向对象高级开发A

一、概述 目标:培养正规、大气的编程习惯;学习面向对象设计 Object Based(基于对象):以良好的方式编写Cclass class without pointer members【示例:Complex类】class with pointer members【示例&#xff…

挂个人-CSDN Java优秀内容博主rundreamsFly抄袭

事件起因 今天点开自己的CSDN博客,发现给我推了一篇文章抄袭我自己昨天18点发的文章。 就是这篇,一字不差,博主昵称是:rundreamsFly,账号是rundreams。 抄袭者文章 发布于2024-8-26 19:37:41秒,比我发布…

C语言穿墙迷宫

目录 开头程序程序的流程图程序游玩的效果下一篇博客要说的东西 开头 大家好&#xff0c;我叫这是我58。 程序 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <stdlib.h> #include <time.h> #include <Windows.h> void printmaze…

Axure团队协作功能详解:从创建到管理的全流程

Axure RP 支持团队协作&#xff0c;通过创建团队项目&#xff0c;多个团队成员可以同时在同一个项目上进行编辑和管理。以下是使用 Axure 进行团队协作的详细步骤&#xff1a; Axure 使用地址 1. 创建团队项目 打开 Axure RP&#xff0c;并在菜单栏中选择 “Team” > “Cr…