Huge and Efficient! 一文了解大规模预训练模型高效训练技术

news2024/11/16 6:33:42

本文分为三部分介绍了大模型高效训练所需要的主要技术,并展示当前较为流行的训练加速库的统计。文章也同步发布在AI Box知乎专栏(知乎搜索 AI Box专栏),欢迎大家在知乎专栏的文章下方评论留言,交流探讨!

引言:随着BERT、GPT等预训练模型取得成功,预训-微调范式已经被运用在自然语言处理、计算机视觉、多模态语言模型等多种场景,越来越多的预训练模型取得了优异的效果。为了提高预训练模型的泛化能力,近年来预训练模型的一个趋势是参数量在快速增大,目前已经到达万亿规模。但如此大的参数量会使得模型训练变得十分困难,于是不少的相关研究者和机构对此提出了许多大模型高效训练的技术。本文将分为三部分来介绍大模型高效训练所需要的主要技术:并行训练技术、显存优化技术和其他技术。文章最后会展示当前较为流行的训练加速库的统计。欢迎大家批评指正,相互交流。

                                                           预训练模型参数量增长趋势<br>

1.『并行训练技术』

并行训练技术主要是如何使用多块显卡并行训练模型,主要可以分为三种并行方式:数据并行(Data Parallel)、张量并行(Tensor Parallel)和流水线并行(Pipeline Parallel)。

数据并行(Data Parallel)

数据并行是目前最为常见和基础的并行方式。这种并行方式的核心思想是对输入数据按 batch 维度进行划分,将数据分配给不同GPU进行计算。在数据并行里,每个GPU上存储的模型、优化器状态是完全相同的。当每块GPU上的前后向传播完成后,需要将每块GPU上计算出的模型梯度汇总求平均,以得到整个batch的模型梯度。

数据并行(图片来自 Colossal-AI 的文档)
目前 PyTorch 已经支持了数据并行 [1]:https://pytorch.org/docs/stable/generated/torch.nn.parallel.DistributedDataParallel.html

张量并行(Tensor Parallel)

在训练大模型的时候,通常一块GPU无法储存一个完整的模型。张量并行便是一种使用多块GPU存储模型的方法。与数据并行不同的是,张量并行是针对模型中的张量进行拆分,将其放置到不同的GPU上。比如说对于模型中某一个线性变换Y=AX,对于矩阵A有按列拆解和按行拆解两种方式:

我们可以将矩阵A1和A2分别放置到两块不同的GPU上,让两块GPU分别计算两部分矩阵乘法,最后再在两张卡之间进行通信便能得到最终的结果。同理也可以将这种方法推广到更多的GPU上,以及其他能够拆分的算子上。

下图是 Megatron-LM [2] 在计算 MLP 的并行过程,它同时采用了这两种并行方式:

整个MLP的输入X先会复制到两块GPU上,然后对于矩阵A采取上面提到的按列划分的方式,在两块GPU上分别计算出第一部分的输出Y1和Y2。接下来的 Dropout 部分的输入由于已经按列划分了,所以对于矩阵B则采取按行划分的方式,在两块GPU上分别计算出Z1和Z2。最后在两块GPU上的Z1和Z2做All-Reduce来得到最终的Z。

以上方法是对矩阵的一维进行拆分,事实上这种拆分方法还可以扩展到二维甚至更高的维度上。在Colossal-AI 中,他们实现了更高维度的张量并行:

https://arxiv.org/abs/2104.05343 https://arxiv.org/abs/2105.14500

https://arxiv.org/abs/2105.14450

对于序列数据,尤洋团队还提出了Sequence Parallel来实现并行:

https://arxiv.org/abs/2105.13120

流水线并行(Pipeline Parallel)

和张量并行类似,流水线并行也是将模型分解放置到不同的GPU上,以解决单块GPU无法储存模型的问题。和张量并行不同的地方在于,流水线并行是按层将模型存储的不同的GPU上。比如以Transformer为例,流水线并行是将连续的若干层放置进一块GPU内,然后在前向传播的过程中便按照顺序依次计算hidden state。反向传播也类似。下图便是流水线并行的示例:

但朴素的流水线并行实现会导致GPU使用率过低(因为每块GPU都要等待之前的GPU计算完毕才能开始计算),使流水线中充满气泡,如下图所示:

有两种比较经典的减少气泡的流水线并行算法:GPipe [7] 和 PipeDream [8]

GPipe 方法的核心思想便是输入的minibatch划分成更小的 micro-batch,让流水线依次处理多个 micro batch,达到填充流水线的目的,进而减少气泡。GPipe 方法的流水线如下所示:

PipeDream 解决流水线气泡问题的方法则不一样,它采取了类似异步梯度更新的策略,即计算出当前 GPU 上模型权重的梯度后就立刻更新,无需等待整个梯度回传完毕。相较于传统的梯度更新公式:

PipeDream 的更新公式为:

由于这种更新方式会导致模型每一层使用的参数更新步数不一样多,PipeDream 对上述方法也做出了一些改进,即模型每次前向传播时,按照更新次数最少的权重的更新次数来算,即公式变为:

PipeDream 方法的流水线如下所示:

对比总结

下面是对这三种并行技术从通用性、计算效率、显存开销和通信量这几个方面进行对比。可以看出数据并行的优势在于通用性强且计算效率、通信效率较高,缺点在于显存总开销比较大;而张量并行的优点是显存效率较高,缺点主要是需要引入额外的通信开销以及通用性不是特别好;流水线并行的优点除了显存效率较高以外,且相比于张量并行的通信开销要小一些,但主要缺点是流水线中存在气泡。

2.『显存优化技术』

在模型训练的过程中,显存主要可以分为两大部分:常驻的模型及其优化器参数,和模型前向传播过程中的激活值。显存优化技术主要是通过减少数据冗余、以算代存和压缩数据表示等方法来降低上述两部分变量的显存使用量,大致可分为四大类:ZeRO技术、Offload技术、checkpoint技术以及一些节约显存的优化器。

ZeRO 技术

ZeRO [9] 技术是微软的 DeepSpeed 团队解决数据并行的中存在的内存冗余问题所提出的解决方法。常驻在每块GPU上的数据可以分为三部分:模型参数,模型梯度和优化器参数。注意到由于每张 GPU 上都存储着完全相同的上述三部分参数,我们可以考虑每张卡上仅保留部分数据,其余的可以从其他 GPU 上获取。即假如有N张卡,我们可以让每张卡上只保存其中1/N的参数,需要的时候再从其他 GPU 上获取。ZeRO 技术便是分别考虑了上述三部分参数分开存储的情况,下图中的Pos、Pos+g和Pos+g+p就分别对应着将优化器参数分开存储、将优化器参数和模型梯度分开存储以及三部分参数都分开存储三种情况。论文里不仅分析了三种情况可以节省的内存情况,还分析出了前两种优化方法不会增加通信开销,第三种情况的通信开销只会增加50%。

目前Pytorch也已经支持了类似的技术:

https://engineering.fb.com/2021/07/15/open-source/fsdp/

https://pytorch.org/docs/stable/fsdp.html

Offload 技术

ZeRO-Offload [10] 技术主要思想是将部分训练阶段的模型状态 offload 到内存,让 CPU 参与部分计算任务。为了避免 GPU 和 CPU 之间的通信开销,以及 CPU 本身计算效率低于 GPU 这两个问题的影响。Offload 的作者在分析了 adam 优化器在 fp16 模式下的运算流程后,考虑只将模型更新的部分下放至 CPU 计算,即让 CPU 充当 Parameter Server 的角色。如下图所示:

同时为了提高效率,Offload 的作者提出可以将通信和计算的过程并行起来,以降低通信对整个计算流程的影响。具体来说,GPU 在反向传播阶段,可以待梯度值填满bucket后,一边计算新的梯度一边将bucket传输给CPU;当反向传播结束,CPU基本上获取了最新的梯度值。同样的,CPU在参数更新时也同步将已经计算好的参数传给GPU,如下图所示:

最后作者也分析了多卡的情况,证明了他提出的方案具有可扩展性。

Checkpoint 技术

在模型前向传播的过程中,为了反向传播计算梯度的需要,通常需要保留一些中间变量。例如对于矩阵乘法

A和B的梯度计算公式如下所示

可以看出要想计算A和B的梯度就必须在计算过程中保留A和B本身。这部分为了反向传播所保留的变量会占用不小的空间。Checkpoint技术的核心是只保留checkpoint点的激活值,checkpoint点之间的激活值则在反向传播的时候重新通过前向进行计算。可以看出,这是一个以算代存的折中方法。最早是陈天奇将这个技术引入机器学习中 [11]:

https://arxiv.org/abs/1604.06174

目前该方法也以及被 PyTorch 所支持。

https://pytorch.org/docs/stable/checkpoint.html

节约显存的优化器

比较早期的工作是如 Adafactor [12] 主要是针对 Adam 进行优化的,它取消了 Adam 中的动量项,并使用矩阵分解方法将动量方差项分解成两个低阶矩阵相乘来近似实现 Adam 的自适应学习率功能。后来也有使用低精度量化方式存储优化器状态的优化器,如 8 bit Optimizer [13],核心思想是将优化器状态量化至 8 bit 的空间,并通过动态的浮点数表示来降低量化的误差。还有更加激进的使用 1 bit 量化优化器的方法,如 1-bit Adam [14] 和 1-bit LAMB [15]。他们主要是使用压缩补偿方法的来减少低精度量化对模型训练的影响。

3.『其他优化技术』

大批量优化器

在目前模型训练的过程中,直接使用大批量的训练方式可能导致模型训练不稳定。最早有 Facebook 的研究 [16] 表明,通过线性调整学习率,并配合 warmup 等辅助手段,让学习率随 batch 的增大而线性增大,即可在ResNet-50上将 batch size 增大至 8K 时仍不影响模型性能。但该方法在 AlexNet 等网络失效,在 LARS [17] 优化器这篇论文中,作者尤洋在实验中发现不同层的权值和其梯度的 2 范数的比值差异很大,据此基于带动量的SGD优化器提出LARS优化器。核心算法如下图所示:

基于以上的思路,尤洋将上述方法扩展到Adam优化器,提出了LAMB [18] 优化器:

FP16

FP16 [19] 基本原理是将原本的32位浮点数运算转为16位浮点数运算。一方面可以降低显存使用,另一方面在 NVIDIA 的显卡上 fp16 的计算单元比 fp32 的计算单元多,可以提升计算效率。在实际的训练过程中,为了保证实际运算过程中的精度,一般还会配合动态放缩技术。目前的主流框架都已实现该功能。

算子融合

算子融合实际上是将若干个 CUDA 上的运算合成一个运算,本质上是减少了 CUDA 上的显存读写次数。举个例子,对于一个线性层 + batch norm + activation 这个组合操作来说:

直接使用 PyTorch 实现的会在计算y1, y2, y3的过程中分别产生一次显存的读和写操作,即3次读和写。如果将其按下面的公式合并成一个算子进行计算,那么中间的结果可以保留在 GPU 上的寄存器或缓存中,从而将显存读写次数降低至1次。

目前 PyTorch 可以使用 torch.jit.script 来将函数或 nn.Module 转化成 TorchScript 代码,从而实现算子融合。

https://pytorch.org/docs/stable/generated/torch.jit.script.html

设备通信算法

在之前介绍的模型分布式训练中,通常需要在不同 GPU 之间传输变量。在 PyTorch 的 DataParallel 中,使用的是Parameter Server架构,即存在一个中心来汇总和分发数据:

但上述方式的缺点是会导致 Parameter Server 成为通信瓶颈。之后PyTorch的Distributed DataParallel则使用了Ring All-Reduce [20] 方法,将不同的GPU构成环形结构,每个GPU只用与环上的邻居进行通信:

稀疏attention

稀疏Attention技术最开始是运用在长序列的Transformer建模上的,但同时也能有效的降低模型计算的强度。稀疏Attention主要方法可以分为以下五类 [21]:

目前DeepSpeed已经集成了这个功能:https://www.deepspeed.ai/tutorials/sparse-attention/

自动并行

目前并行训练技术在大模型训练中已被广泛使用,通常是会将前面介绍的三种并行方法结合起来一起使用,被称之为 3D 并行。但这些并行方式都有不少的训练超参数,之前的一些研究者是使用手动的方式来设置这些超参数。目前也出现了不少自适应的方法来设置超参数,被称为自动并行技术。这些方法包括动态规划、蒙特卡洛方法、强化学习等。下面的 GitHub 仓库整理了一些自动并行的代码和论文:

https://github.com/ConnollyLeon/awesome-Auto-Parallelism

4.『训练加速库概览』

下面是本人对当下比较流行的训练加速库的统计,可供大家进行参考。

参考文献

 [1] PyTorch Distributed: Experiences on Accelerating Data Parallel Training
[2] Megatron-LM: Training Multi-Billion Parameter Language Models Using Model Parallelism
[3]An Efficient 2D Method for Training Super-Large Deep Learning Models
[4] 2.5-dimensional distributed model training
[5] Maximizing Parallelism in Distributed Training for Huge Neural Networks
[6] Sequence Parallelism: Long Sequence Training from System Perspective
[7] GPipe: Efficient Training of Giant Neural Networks using Pipeline Parallelism
[8] PipeDream: Fast and Efficient Pipeline Parallel DNN Training
[9] ZeRO: memory optimizations toward training trillion parameter models
[10] ZeRO-Offload: Democratizing Billion-Scale Model Training
[11] Training Deep Nets with Sublinear Memory Cost
[12] Adafactor: Adaptive Learning Rates with Sublinear Memory Cost
[13] 8-bit Optimizers via Block-wise Quantization
[14] 1-bit Adam: Communication Efficient Large-Scale Training with Adam's Convergence Speed
[15] 1-bit LAMB: Communication Efficient Large-Scale Large-Batch Training with LAMB's Convergence Speed
[16] Accurate, Large Minibatch SGD: Training ImageNet in 1 Hour
[17] Large Batch Training of Convolutional Networks
[18] Large Batch Optimization for Deep Learning: Training BERT in 76 minutes
[19] Mixed Precision Training
[20] Bringing HPC Techniques to Deep Learning
[21] A Survey of Transformers  

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

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

相关文章

计算机图形学十四路径追踪与渲染方程

路径追踪&#xff08;Path Tracing&#xff09;与渲染方程&#xff08;Render Equation&#xff09; 简介 利用路径追踪我们可以实现比whitted-style ray tracing更好的全局光照&#xff08;GI&#xff09;效果。它的理论基础是渲染方程&#xff0c;最开始由吉姆卡吉亚&#…

066、故障处理之热点问题

为什么要解决热点 分布式架构中各个组件的理想状态&#xff1a;资源利用率相对均衡 形成写热点的原因 高频访问的小表SQL执行计划不合理具有顺序增长属性的索引扫描 数据组织模型 例如数据是序列递增&#xff0c;则有可能数据全部都集中一个region上 &#xff0c;或者集中…

什么是等保定级?

TOC 一、等保评测介绍 1.1 等保定级目的 网络安全等级保护介绍&#xff1a;目的就是涉及民生问题的信息系统&#xff0c;要按照影响&#xff0c;提前划定等级 实施网络安全保护 信息系统&#xff1a;就是保护的系统&#xff0c;比如 魔幻的 健康码系统安全产品&#xff1a;健…

【lesson5】linux常见权限问题

文章目录 目录权限umask粘滞位 目录权限 先来思考一个问题: 进入一个目录需要什么权限呢&#xff1f; 由上图我们可以得知&#xff0c;进入目录需要x权限&#xff0c;那么没有r和w权限是什么情况呢&#xff1f; 从图中我们可以得知没有r权限不能查看目录里面的内容&#xff…

基于STM32设计的智能教室管理系统

前言 本文介绍了一个智慧教室的设计,该设计由电器设备控制系统、环境检测系统和考勤系统三大模块构成。通过使用STM32微处理器和物联网电器设备控制中心,实现对教室内风扇、照明灯和窗帘等电器设备的智能化统一控制与运行。同时,环境检测系统可以实时监测环境光强、温度、湿…

模型调参及优化

调参 调权重参数&#xff0c;偏置参数 训练数据集用来训练参数w&#xff0c;b 调超参数 验证数据集用来选择超参数学习率lr&#xff0c;隐藏层大小等 如何调参 当泛化误差和训练误差都没有降下去说明欠拟合&#xff1b;当训练误差降下去&#xff0c;但泛化误差出现上升形式&…

33. 本地记事本

本地记事本 html部分 <button class"add"><i class"iconfont icon-jiahao"></i> </button>css部分 *{margin: 0;padding: 0; } body{background-color: #7bdaf3;display: flex;padding-top: 3rem;flex-wrap: wrap; } .add{pos…

Vue2基础一、快速入门

零、文章目录 Vue2基础一、快速入门 1、Vue 概念 &#xff08;1&#xff09;为什么学 前端必备技能 岗位多&#xff0c;绝大互联网公司都在使用Vue 提高开发效率 高薪必备技能&#xff08;Vue2Vue3&#xff09; &#xff08;2&#xff09;Vue是什么 **概念&#xff1a;…

第二届“鼎信杯”榜单发布,麒麟信安荣获“优秀技术支撑奖”

由中国电子信息产业发展研究院、北京市海淀区人民政府主办&#xff0c;中国软件评测中心&#xff08;工业和信息化部软件与集成电路促进中心&#xff09;、中关村科学城管委会和北京市国际技术贸易协会承办的“2023 鼎信杯信息技术发展论坛”日前在北京举办。麒麟信安受邀参加主…

和鲸 ModelWhale 与麒麟系统适配认证,打造自主安全、性能可靠的信创 AI 基础软件

发展信创&#xff0c;解决核心技术的自主可控问题&#xff0c;是我国产业升级和数字经济发展过程中的重要命题。信创产业链主要由基础硬件、基础软件、应用软件、信息安全及云计算平台等几部分组成&#xff0c;拥抱信创国产化需要各厂商聚力共创生态&#xff0c;增强自身产品的…

JSONPath提取器案例详解

jsonpath语法 $ 表示根节点&#xff0c;也是所有jsonpath表达式的开始 . 表示获取子节点 .. 表示获取所有符合条件的内容 * 代表所有的元素节点 [] 表示迭代器的标示&#xff08;可以用于处理下标等情况&#xff09; [,] 表示多个结果的选择 ?() 表示过滤操作 表示当前节点一…

【QT】Day1

1. 收到实现登录框 要求&#xff1a; 1、登录窗口更改标题、图标 2、设置固定尺寸、并给定一定的透明度 widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QDebug> //信息调试类&#xff0c;用于打印输出的 #include <QIcon>…

windows命令行

参考:https://blog.csdn.net/u014419722/article/details/130427423 1、 创建文件夹&#xff08;mkdir或md&#xff09; 创建单个文件&#xff1a;mkdir cmd_test 创建二级文件&#xff1a;mkdir cmd_test\456\123 创建多个文件&#xff1a;mkdir cmd_test\000 cmd_test\111 2…

【js】javascript中base64转file、file压缩图片:

文章目录 一、效果图:二、实现代码: 一、效果图: 二、实现代码: /*** base64转file* param {string} urlData base64格式图片* returns */ export function base64ConvertFile(urlData) {if (typeof urlData ! string) {this.$toast("urlData不是字符串")return;}va…

IDEA 模块不加载依旧是灰色 没有变成小蓝色的方块

Settings > Build, Execution, Deployment > Build Tools > Maven > Ignored Files下降对应的模块勾选掉 但通常在Maven的配置中&#xff0c;您会找到一个名为“ignoredFiles”的列表&#xff0c;其中包含被忽略的文件和目录。您可以通过取消选中所需的文件或目录…

腾讯云—自动挂载云盘

腾讯云&#xff0c;稍微麻烦了点。 腾讯云服务器&#xff0c;镜像为opencloudos 8。 ### 1、挂载云盘bash #首先通过以下命令&#xff0c;能够看到新的数据盘&#xff0c;如果不能需要通过腾讯云控制台卸载后&#xff0c;重新挂载&#xff0c;并重启服务器。 fdisk -l#为 /dev…

【iVX】低代码未来发展趋势

未来低代码开发将更加注重用户体验、集成能力、自动化水平和移动支持。同时&#xff0c;应用场景也将进一步扩展&#xff0c;安全与可靠性也将得到更大程度的关注和加强。这些发展方向将进一步推动低代码开发在各个行业和领域的广泛应用和发展。 增强设计能力&#xff1a;低代码…

RFID技术如何赋能化工行业?

化工生产是指在化工行业中&#xff0c;将原材料经过一系列的物理、化学或生物过程转化为最终产品的过程。RFID技术在化工行业中提供了实时跟踪、自动化控制、安全监测和环境管理等方面的帮助&#xff0c;对于提高生产效率、质量控制和安全性具有重要的意义。我们通过典型的化工…

【100天精通python】Day18:python程序异常与调试_常用程序调试方式与技巧,如何将调试代码与正式代码分开

一 程序调试 在Python中&#xff0c;调试是指识别和修复程序中的错误和问题。 调试是程序开发过程中必不可少的一部分&#xff0c;合理利用调试工具和技术可以提高程序开发的效率和质量。Python提供了几种用于调试的工具和技术&#xff0c;帮助开发者找出程序中的bug并进行修复…

论文笔记:Fine-Grained Urban Flow Prediction

2021 WWW 1 intro 细粒度城市流量预测 两个挑战 细粒度数据中观察到的网格间的转移动态使得预测变得更加复杂 需要在全局范围内捕获网格单元之间的空间依赖性单独学习外部因素&#xff08;例如天气、POI、路段信息等&#xff09;对大量网格单元的影响非常具有挑战性——>论…