用通俗易懂的方式讲解大模型分布式训练并行技术:概述

news2024/12/28 11:01:01

近年来,随着Transformer、MOE架构的提出,使得深度学习模型轻松突破上万亿规模参数,传统的单机单卡模式已经无法满足超大模型进行训练的要求。因此,我们需要基于单机多卡、甚至是多机多卡进行分布式大模型的训练。

而利用AI集群,使深度学习算法更好地从大量数据中高效地训练出性能优良的大模型是分布式机器学习的首要目标。为了实现该目标,一般需要根据硬件资源与数据/模型规模的匹配情况,考虑对计算任务、训练数据和模型进行划分,从而进行分布式存储和分布式训练。因此,分布式训练相关技术值得我们进行深入分析其背后的机理。

下面主要对大模型进行分布式训练的并行技术进行讲解,本系列大体分九篇文章进行讲解。

本文为分布式训练并行技术的第一篇,对大模型进行分布式训练常见的并行技术进行简要介绍。

技术交流

技术要学会分享、交流,不建议闭门造车。一个人可以走的很快、一堆人可以走的更远。

相关资料、数据、技术交流提升,均可加我们的交流群获取,群友已超过2000人,添加时最好的备注方式为:来源+兴趣方向,方便找到志同道合的朋友。

方式①、添加微信号:mlc2060,备注:来自CSDN + 技术交流
方式②、微信搜索公众号:机器学习社区,后台回复:加群

数据并行

数据并行是最常见的并行形式,因为它很简单。在数据并行训练中,数据集被分割成几个碎片,每个碎片被分配到一个设备上。这相当于沿批次(Batch)维度对训练过程进行并行化。每个设备将持有一个完整的模型副本,并在分配的数据集碎片上进行训练。在反向传播之后,模型的梯度将被全部减少,以便在不同设备上的模型参数能够保持同步。典型的数据并行实现:PyTorch DDP。

图片

模型并行

在数据并行训练中,一个明显的特点是每个 GPU 持有整个模型权重的副本。这就带来了冗余问题。另一种并行模式是模型并行,即模型被分割并分布在一个设备阵列上。

通常有两种类型的模型并行:张量并行和流水线并行。

  • 张量并行是在一个操作中进行并行计算,如:矩阵-矩阵乘法。

  • 流水线并行是在各层之间进行并行计算。

因此,从另一个角度来看,张量并行可以被看作是层内并行,流水线并行可以被看作是层间并行。

张量并行

张量并行训练是将一个张量沿特定维度分成 N 块,每个设备只持有整个张量的 1/N,同时不影响计算图的正确性。这需要额外的通信来确保结果的正确性。

以一般的矩阵乘法为例,假设我们有 C = AB。我们可以将B沿着列分割成 [B0 B1 B2 … Bn],每个设备持有一列。然后我们将 A 与每个设备上 B 中的每一列相乘,我们将得到 [AB0 AB1 AB2 … ABn] 。此刻,每个设备仍然持有一部分的结果,例如,设备(rank=0)持有 AB0。为了确保结果的正确性,我们需要收集全部的结果,并沿列维串联张量。通过这种方式,我们能够将张量分布在设备上,同时确保计算流程保持正确。

图片

典型的张量并行实现:Megatron-LM(1D)、Colossal-AI(2D、2.5D、3D)。

流水线并行

流水线并行的核心思想是,模型按层分割成若干块,每块都交给一个设备。

  • 在前向传播过程中,每个设备将中间的激活传递给下一个阶段。

  • 在后向传播过程中,每个设备将输入张量的梯度传回给前一个流水线阶段。

这允许设备同时进行计算,从而增加训练的吞吐量。

图片

image.png

流水线并行训练的一个明显缺点是训练设备容易出现空闲状态(因为后一个阶段需要等待前一个阶段执行完毕),导致计算资源的浪费,加速效率没有数据并行高。

图片

典型的流水线并行实现:GPipe、PipeDream、PipeDream-2BW、PipeDream Flush(1F1B)。

优化器相关的并行

目前随着模型越来越大,单个GPU的显存目前通常无法装下那么大的模型了。那么就要想办法对占显存的地方进行优化。

通常来说,模型训练的过程中,GPU上需要进行存储的参数包括了模型本身的参数、优化器状态、激活函数的输出值、梯度以及一些零时的Buffer。各种数据的占比如下图所示:

图片

可以看到模型参数仅占模型训练过程中所有数据的一部分,当进行混合精度运算时,其中模型状态参数(优化器状态 + 梯度+ 模型参数)占到了一大半以上。因此,我们需要想办法去除模型训练过程中的冗余数据。

而优化器相关的并行就是一种去除冗余数据的并行方案,目前这种并行最流行的方法是 ZeRO(即零冗余优化器)。针对模型状态的存储优化(去除冗余),ZeRO使用的方法是分片,即每张卡只存 1/N 的模型状态量,这样系统内只维护一份模型状态。ZeRO有三个不同级别,对模型状态进行不同程度的分片:

  • ZeRO-1 : 对优化器状态分片(Optimizer States Sharding)

  • ZeRO-2 : 对优化器状态和梯度分片(Optimizer States & Gradients Sharding)

  • ZeRO-3 : 对优化器状态、梯度分片以及模型权重参数分片(Optimizer States & Gradients & Parameters Sharding)

图片

image.png

异构系统并行

上述的方法中,通常需要大量的 GPU 来训练一个大型模型。然而,人们常常忽略一点,与 GPU 相比,CPU 的内存要大得多。在一个典型的服务器上,CPU 可以轻松拥有几百GB甚至上TB的内存,而每张 GPU 卡通常只有 48 或 80 GB的内存。这促使人们思考为什么 CPU 内存没有被用于分布式训练。

而最近的进展是依靠 CPU 甚至是 NVMe 磁盘来训练大型模型。主要的想法是,在不使用张量时,将其卸载回 CPU 内存或 NVMe 磁盘。

通过使用异构系统架构,有可能在一台机器上容纳一个巨大的模型。

图片

多维混合并行

多维混合并行指将数据并行、模型并行和流水线并行等多种并行技术结合起来进行分布式训练。

图片

image.png

通常,在进行超大规模模型的预训练和全参数微调时,都需要用到多维混合并行。

图片

为了充分利用带宽,通常情况下,张量并行所需的通信量最大,而数据并行与流水线并行所需的通信量相对来说较小。因此,同一个服务器内使用张量并行,而服务器之间使用数据并行与流水线并行。

图片

自动并行

上面提到的数据并行、张量并行、流水线并行等多维混合并行需要把模型切分到多张AI加速卡上面,如果让用户手动实现,对开发者来说难度非常大,需要考虑性能、内存、通信、训练效果等问题,要是能够将模型按算子或者按层自动切分到不同的加速卡上,可以大大的降低开发者的使用难度。因此,自动并行应运而生。

图片

MOE并行 / 专家并行

通常来讲,模型规模的扩展会导致训练成本显著增加,计算资源的限制成为了大规模密集模型训练的瓶颈。为了解决这个问题,一种基于稀疏 MoE 层的深度学习模型架构被提出,即将大模型拆分成多个小模型(专家,expert), 每轮迭代根据样本决定激活一部分专家用于计算,达到了节省计算资源的效果;并引入可训练并确保稀疏性的门( gate )机制,以保证计算能力的优化。

使用 MoE 结构,可以在计算成本次线性增加的同时实现超大规模模型训练,为恒定的计算资源预算带来巨大增益。而 MOE 并行,本质上也是一种模型并行方法。下图展示了一个有六个专家网络的模型被两路专家并行地训练。其中,专家1-3被放置在第一个计算单元上,而专家4-6被放置在第二个计算单元上。

图片

结语

本文针对大模型进行分布式训练常见的并行技术进行了简要的介绍。后续章节将针对常见并行技术的不同方案进行详细的讲解。

如果觉得我的文章能够能够给您带来帮助,期待您的点赞收藏加关注~~

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

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

相关文章

vue中实现签名画板

特意封装成了一个组件&#xff0c;签名之后会生成一张图片 signBoard.vue <template><el-drawer title"签名" :visible.sync"isShowBoard" append-to-body :show-close"false" :before-close"closeBoard" size"50%&quo…

一文1000字彻底搞懂Web测试与App测试的区别

总结分享一些项目需要结合Web测试和App测试的工作经验给大家&#xff1a; 从功能测试区分&#xff0c;Web测试与App测试在测试用例设计和测试流程上没什么区别。 而两者的主要区别体现在如下几个方面&#xff1a; 1 系统结构方面 Web项目&#xff0c;B/S架构&#xff0c;基于…

网络请求流程简述

二层通信 通过 ARP 获取 MAC通过 MAC 确定目标进行通信 相同 vlan&#xff0c;不跨交换机 相同 vlan&#xff0c;跨交换机 不同 vlan

二进制搭建kubernetes

二进制搭建kubernetes 一、常见的K8S部署方式1.Minikube2.Kubeadmin3.二进制安装部署 二、二进制搭建K8S(单台master)1.部署架构规划2.系统初始化配置3.部署 docker引擎4.部署 etcd 集群4.部署 Master 组件5.部署 Worker Node 组件6.部署网络组件 三、负载均衡部署1.配置load b…

44、Flink之module模块介绍及使用示例和Flink SQL使用hive内置函数及自定义函数详细示例--网上有些说法好像是错误的

Flink 系列文章 1、Flink 部署、概念介绍、source、transformation、sink使用示例、四大基石介绍和示例等系列综合文章链接 13、Flink 的table api与sql的基本概念、通用api介绍及入门示例 14、Flink 的table api与sql之数据类型: 内置数据类型以及它们的属性 15、Flink 的ta…

免费教学自制产品图册的方法

制作一个精美的产品图册可以帮助我们更好地展示产品的特点和优势&#xff0c;吸引潜在客户的注意力。而使用免费的工具和资源来制作图册&#xff0c;不仅可以节省成本&#xff0c;还能提高效率。 首先&#xff0c;我们需要选择一个适合的设计工具。例如FLBOOK在线制作电子杂志平…

包管理工具--》yarn的配置及使用

包管理工具系列文章目录 一、包管理工具--》npm的配置及使用&#xff08;一&#xff09; 二、包管理工具--》npm的配置及使用&#xff08;二&#xff09; 目录 &#x1f31f;yarn 简介 &#x1f31f;yarn 的核心命令 初始化 安装 脚本和本地CLI 查询 更新 卸载 &…

Redis:StringRedisTemplate简介

&#xff08;笔记总结自b站黑马程序员课程&#xff09; 为了在反序列化时知道对象的类型&#xff0c;JSON序列化器会将类的class类型写入json结果中&#xff0c;存入Redis&#xff0c;会带来额外的内存开销。 为了减少内存的消耗&#xff0c;我们可以采用手动序列化的方式&am…

Python之列表操作和内存模型

Python之列表操作和内存模型 列表list 一个排列整齐的队伍&#xff0c;Python采用顺序表实现 列表内的个体称作元素&#xff0c;由若干元素组成 列表 元素可以是任意对象(数字、字符串、对象、列表等) 列表内元素有顺序&#xff0c;可以使用索引 线性的数据结构 使用 [ ] …

Spring - Cloud (微服务)

SpringCloud 和 SpringBoot 版本选择对应&#xff1a; 版本对应&#xff1a;https://start.spring.io/actuator/info Cloud官网&#xff1a;Spring Cloud 中文网&#xff1a;Spring Cloud中文网-官方文档中文版 在官网可以查看 当前Cloud 推荐的Boot版本&#xff1a; 当前技术…

Yolov8-pose关键点检测:模型轻量化创新 | 轻量级Slim-Neck

💡💡💡本文解决什么问题:轻量级Slim-Neck,缓解 DSC 缺陷对模型的负面影响,并充分利用深度可分离卷积 DSC 的优势。 Slim-Neck | mAP50从0.921提升至0.93, mAP50从0.697提升至0.829 Yolov8-Pose关键点检测专栏介绍:https://blog.csdn.net/m0_63774211/category_1…

从0到1构建界面设计系统思维

用户界面&#xff08;UI&#xff09;是人与机器之间发生交互的载体&#xff0c;也是用户体验&#xff08;UX&#xff09;的一个组成部分。用户界面由两个主要部分组成&#xff1a;视觉设计&#xff08;即传达产品的外观和感觉&#xff09;和交互设计&#xff08;即元素的功能和…

超详解| Yolov8模型手把手调参 | 配置 | 模型训练 | 验证 | 推理

YOLOv8是一款前沿、最先进&#xff08;SOTA&#xff09;的模型&#xff0c;基于先前YOLO版本的成功&#xff0c;引入了新功能和改进&#xff0c;进一步提升性能和灵活性。 然而&#xff0c;要充分发挥Yolov8的潜力&#xff0c;合理的参数配置是至关重要的。本文将带您深入了解…

2023年值得推荐的 API 开发工具

数字化时代&#xff0c;应用程序编程接口&#xff08;API&#xff09;的重要性愈发凸显。API 充当着应用程序之间的桥梁&#xff0c;促进数据交换和功能集成。随着 API 的不断增加和复杂化&#xff0c;开发对 API 开发工具的要求也越来越高。 我们一起来盘点下 2023年上半年比…

Ant design table实现单选和点击行选中

实现单选 Antd table实现单选非常方便只需要在rowSelection属性里添加type: radio即可。 实现点击行选中 需要用到onRow属性 在onClick事件里面手动设置selectRowKey&#xff0c;跟Table onChange事件一样 onRow{(record) > ({onClick: () > {console.log(record)…

极智开发 | vscode使用ssh加速git操作

欢迎关注我的公众号 [极智视界],获取我的更多经验分享 大家好,我是极智视界,本文分享一下 vscode使用ssh加速git操作。 邀您加入我的知识星球「极智视界」,星球内有超多好玩的项目实战源码和资源下载,链接:https://t.zsxq.com/0aiNxERDq 之前在 vscode 中主要使用 http …

浅析自动化测试工具的功能与作用

自动化测试工具是一种软件工具&#xff0c;旨在通过脚本或可视化界面自动执行测试任务和验证预期结果。这些工具可以自动识别和执行测试用例&#xff0c;模拟用户操作&#xff0c;比较实际和预期结果&#xff0c;并生成测试报告。自动化测试工具减少了人工干预&#xff0c;提高…

蓝桥杯备赛Day7——算法复杂度分析、前缀和思想

O(nlogn)算法可能达到的最优复杂度。快速排序算法是典型例子。 O(n^2)一个两重循环的算法,复杂度是O(n^2)。例如冒泡排序,是典型的两重循环。 O(n^3)、O(n^4)等等。 O(2n)一般对应集合问题。 例如一个集合中有n个数,要求输出它的所有子集。 O(n!)在集合问题中,如果要求按顺…

算法训练营day42|动态规划 part04(01背包问题基础(两种解决方案)、LeetCode 416.分割等和子集)

文章目录 01背包----二维dp数组01背包----滚动数组416.分割等和子集思路分析背包解法思考总结 有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品只能用一次&#xff0c;求解将哪些物品装入背包里物品价值总和最…

Geek——能力超强的卸载工具

简介 Geek是一款能力超强的卸载工具&#xff0c;旨在帮助用户轻松、彻底地卸载不需要的软件。无论是常见的应用程序、插件还是顽固的垃圾文件&#xff0c;Geek都能够迅速而安全地将其清理殆尽&#xff0c;释放您的存储空间和系统资源。 使用Geek&#xff0c;您可以轻松摆脱不…