基础知识
显存
定义:显存是显卡上的专用高速缓存,用于存储图形处理器(GPU)在处理图像和视频数据时所需的临时数据。
功能:显存的主要作用是提供GPU快速访问的数据存储,支持图形渲染和并行计算任务。
内存
定义:内存(RAM)是计算机系统中的一种易失性存储器,用于存储CPU执行程序时所需的临时数据。
功能:内存为CPU提供快速访问的数据存储,支持程序的运行和数据的处理。它是外存与CPU进行沟通的桥梁,计算机中所有程序的运行都在内存中进行。
CPU
定义:CPU(Central Processing Unit)是计算机系统的核心处理器,负责执行程序中的指令,处理数据。
功能:CPU通过读取内存中的数据,执行指令,完成计算和控制任务。它是信息处理和程序运行的最终执行单元。
GPU
定义:GPU(Graphics Processing Unit)是图形处理器,专门用于处理图形和图像数据,以及进行并行计算。
功能:GPU通过其大量的核心和高速显存,能够高效地处理图形数据,同时支持深度学习等并行计算任务。
显卡
定义:显卡(Graphics Card)是一种专门用于处理图像和视频数据的硬件设备。
功能:显卡的主要作用是将计算机中的数字信号转换为可以在显示器上显示的图像信号。它通常由处理器(GPU)、显存、电路板等部分组成。
大模型参数和数据量的单位
参数量的单位
参数量指的是模型中所有权重和偏置的数量总和。在大模型中,参数量的单位通常以"百万"(M)或"亿"(B,也常说十亿)来表示。
- 百万(M):表示一百万个参数。例如,如果一个模型有110M个参数,那么它实际上有110,000,000(即1.1亿)个参数。
- 亿(B):表示十亿个参数。例如,GPT-3模型有175B个参数,即175,000,000,000(即1750亿)个参数。
数据量的单位
在大数据和机器学习的语境下,数据量通常指的是用于训练或测试模型的数据的大小。数据量的单位可以是字节(Byte)、千字节(KB)、兆字节(MB)、吉字节(GB)等。
- 字节(Byte):是数据存储的基本单位。一个字节由8个比特(bit)组成。
- 千字节(KB):等于1024个字节。
- 兆字节(MB):等于1024个千字节,也常用于表示文件或数据的大小。
- 吉字节(GB):等于1024个兆字节,是较大的数据存储单位。
在大模型中,由于模型参数通常是以浮点数(如float32)存储的,因此可以通过模型参数量来计算模型所需的存储空间大小。例如,如果一个模型有1.1亿个参数,并且每个参数用float32表示(即每个参数占4个字节),那么该模型所需的存储空间大约为44MB(1.1亿×4字节/1024/1024)。
分布式训练(Distributed Training)
是指将机器学习或深度学习模型训练任务分解成多个子任务,并在多个计算设备上并行地进行训练。这里计算设备可以是中央处理器(Central Processing Unit,CPU)、图形处理器(Graphics Processing Unit,GPU)、张量处理器(Tensor Processing Unit,TPU)也可以是神经网络处理器(Neural network Processing Unit,NPU)。
单设备计算速度 主要由单块计算加速芯片的运算速度和数据 I/O 能力来决定,对单设备训练效率进行优化,主要的技术手段有混合精度训练、算子融合、梯度累加等
分布式训练系统中计算设备数量越多,其理论峰值计算速度就会越高,但是受到通讯效率的影响,计算设备数 量增大则会造成加速比急速降低;
多设备加速比 则是由计算和通讯效率决定,需要结合算法和网络拓扑结构进行优化.
分布式训练并行策略主要目标就是提升分布式训练系统中的多设备加速比。
分布式训练系统仍然需要克服计算墙、显存墙、通信墙等多种挑战,以确保集群内的所有资源得到充分利用,从而加速训练过程并缩短训练周期。
• 计算墙:单个计算设备所能提供的计算能力与大语言模型所需的总计算量之间存在巨大差异。
• 显存墙:单个计算设备无法完整存储一个大语言模型的参数。
• 通信墙:分布式训练系统中各计算设备之间需要频繁地进行参数传输和同步。由于通信的延迟和带宽限制,这可能成为训练过程的瓶颈。
计算墙和显存墙源于单计算设备的计算和存储能力有限,与模型对庞大计算和存储需求之间存在 矛盾。这个问题可以通过采用分布式训练方法来解决,但分布式训练又会面临通信墙的挑战。在 多机多卡的训练中,这些问题逐渐显现。随着大模型参数的增大,对应的集群规模也随之增加,这些问题变得更加突出。同时,在大型集群进行长时间训练时,设备故障可能会影响或中断训练过 程,对分布式系统的问题性也提出了很高要求。
AI集群
集群就是指一组(若干个)相互独立的计算机,利用高速通信网络组成的一个较大的计算机服务系统,每个集群节点(即集群中的每台计算机)都是运行各自服务的独立服务器。这些服务器之间可以彼此通信,协同向用户提供应用程序,系统资源和数据,并以单一系统的模式加以管理。当用户请求集群系统时,集群给用户的感觉就是一个单一独立的服务器,而实际上用户请求的是一组集群服务器。
硬件组成:AI集群通常包括高性能的CPU和GPU,以及大量的RAM和存储空间。其中,GPU尤其重要,因为它们能够并行处理大量数据,加速深度学习模型的训练过程。此外,还需要集群网络,RDMA(远程直接数据存取)网络是集群网络的首选,这是一种高带宽低延迟的大规模通信网络,非常适用于AI算力集群。
软件架构:集群需要运行特定的软件,如分布式计算框架(如TensorFlow、PyTorch等),这些框架能够协调不同节点上的计算任务。
从设备数上优化计算速率
分布式训练需要使用由多台服务器组成的计算集群完成,分布式训练集群属于高性能计算集群,集群的架构主要有两种常见架构:参数服务器架构 (Parameter Server,PS)和去中心化架构(Decentralized Network)。
高性能计算集群的硬件组成
AI集群通信中的软硬件介绍-腾讯云开发者社区-腾讯云 (tencent.com)
带宽:每一秒通信多少数据;延迟:通信的快慢
分布式训练服务器集群架构
AI集群P/S服务器架构
参数服务器Parameter Server(P/S架构)已经成为现在AI集群、AI服务器中最常用的组网架构,有了参数服务器PS架构之后,训练大模型就需要解决模型参数同步的问题,于是出现了各种各样的物理网络互联方式,通过集合通信进行网络数据传输。而环是一种较优的网络拓扑,通过Ring All Reduce算法可以有效地解决参数服务器之间的数据同步问题。
区别在于:CPU完成2、3;GPU0完成2、3;每一个GPU完成2、3。
参数服务器架构分布式训练过程可以细分为同步训练和异步训练。
同步并行
白色的部分叫bubble
异步并行
橘色是反向传播,蓝色是正向传播,可以看到device 1在device 2还没有开始反向时候就已经进行了下一步的前向传播,这样就会导致冲突。
环同步(Ring Sychronization)
GPU和GPU之间是通过NVLink来连接的,不同的GPU之间有环连接。
百度提出的Scatter-reduce and all gather
去中心化架构
去中心化架构没有中央服务器或控制节点,而是由节点之间进行直接通信和协调,这种架构的好处是可以减少通信瓶颈,提高系统的可扩展性。可以减少通信墙的影响。其通常采用集合通信(CC)实现。常见通信原语有:
Broadcast
Scatter
Reduce
All-Reduce
Gather
All-Gather
Reduce-Scatter
All-to-All
Pytorch - 分布式通信原语(附源码) - 知乎 (zhihu.com)
从设备间加速比优化计算速率
数据并行
DataParallel(DP)
DP里面只有一个优化器Optimizer,这个优化器Optimizer只在Master GPU上进行参数更新,当环境不再不在改变的时候,其它GPU选择了躺平,当GPU:0忙前忙后去分发数据、汇总梯度,更新参数的时候,其它GPU就静静躺着。
DistributedDataParallel(DDP)
DDP采用多进程架构,赋予了每个GPU更多的自由,支持多机多卡分布式训练。每个进程都拥有自己的优化器Optimizer,可独立优化所有步骤。每个进程中在自己的GPU上计算loss,反向计算梯度。
模型并行MP
1.按模型的「layer层切分」**到不同设备;**流水线并行
朴素流水线并行:计算图中的下游设备(Downstream Device)需要长时 间持续处于空闲状态,等待上游设备(Upstream Device)的计算完成,才能开始计算自身的任务。这种情况导致了设备的平均使用率大幅降低,形成了模型并行气泡。
2.将参数切分到不同设备,张量并行
混合并行
BLOOM 使用了 Megatron-DeepSpeed 框架进行训练,主要包含两个部分:Megatron-LM 提供张量并行能力和数据加载原语;DeepSpeed 提供 ZeRO 优化器、模型流水线以及常规的分布式训练组件。通过这种方式可以实现数据、张量和流水线三维并行。
DeepSpeed 实践
这个博客介绍的非常清晰:一文读懂deepSpeed:深度学习训练的并行化-CSDN博客
目前训练超大规模语言模型技术路线:GPU + PyTorch + Megatron-LM + DeepSpeed
DeepSpeed 提供了分布式计算框架,几个重要的基础的概念:节点编号、全局进程编号、局部进程编号、全局总进程数和主节点。DeepSpeed 主节点(master_ip+master_port)负责协调所有其他节点和进程的工作,由主节点所在服务器的 IP 地址和主节点进程的端口号来确定 主节点。主节点还负责监控系统状态、处理任务分配和结果汇总等任务,因此是整个系统的关键 部分。节点编号(node_rank)是系统中每个节点的唯一标识符,用于区分不同计算机之间的通信。 全局进程编号(rank)是整个系统中的每个进程的唯一标识符,用于区分不同进程之间的通信。局部进程编号(local_rank):是单个节点内的每个进程的唯一标识符,用于区分同一节点内的不同 进程之间的通信。全局总进程数(word_size)是整个系统中运行的所有进程的总数,用于确定可 以并行完成多少工作以及需要完成任务所需的资源数量。
ZeRO(Zero Redundancy Optimizer)
内存优化技术,ZeRO将模型的参数、梯度和优化器状态进行分片,平均分配到所有的GPU中,这样每个GPU只存储一部分数据,从而减少了单个设备的内存需求。