WangYu::Space

cat /dev/mind

大语言模型并行策略(一):概览

分类:机器学习标签: LLM创建时间:2026-06-18 22:10:00

为什么需要并行

最近几年,GPU 的计算能力和显存容量都在不断提升,这使得训练和推理更大参数量的模型成为可能。更大参数量的模型通常能带来更好的性能和更强的泛化能力,但更大的模型同时也需要性能更强的 GPU 来支撑训练和推理。这就形成了一个循环,GPU 厂商不断推出更强大的 GPU,而模型研究者也不断提出更大参数量的模型。随着模型参数量的增加,单张 GPU 的显存容量和计算能力已经无法满足训练和推理的需求。为了在可接受的时间内完成更大规模的模型训练和推理,就需要使用多张 GPU 进行并行计算。

2017 年最先进的 GPU 是 NVIDIA 的 Tesla V100,单卡显存为 16GB,而 2018 年 Google 发布的 BERT-Large 模型参数量为 340M,此时单个 GPU 还能完成训练和推理。到了 2020 年,NVIDIA 发布了 A100,单卡显存最大为 80GB;2021 年 OpenAI 发布了 175B 参数的 GPT-3 模型,此时单张 GPU 已经无法完成训练和推理。此后,模型的参数量不断增加:2025 年 DeepSeek 发布的 DeepSeek v3 模型参数量为 671B,2026 年发布的 DeepSeek v4 模型参数量达到 1.6T。而当下 NVIDIA 最新发布的 B300 GPU 单卡显存为 288GB,模型参数量已经远远超过了单张 GPU 的显存容量。

要使用多个 GPU 完成模型的训练和推理,就涉及到如何去将整个模型分布到多个 GPU 中,以及多个 GPU 之间如何协同计算。本文将要介绍的大语言模型中的并行策略,解决的正是大语言模型的分布式训练和推理的问题。

内存占用分析

要理解为什么模型放不进单卡,得先看看训练过程中显存里都装了些什么。大语言模型在训练过程中,内存占用主要包括以下几个部分:

各项的具体情况如下:

项目主要影响因素用途
模型参数参数量、存储精度前向和反向计算
梯度可训练参数量、梯度精度参数更新与数据并行同步
优化器状态参数量、优化器类型记录动量等更新状态
激活值batch size、序列长度、层数、隐藏维度反向传播

其中,模型参数、梯度和优化器状态的内存占用量与模型参数量直接相关,以使用 Adam 优化器为例,内存占用量的估算如下:

项目数据类型内存占用
权重BF16/FP162 B/参数
梯度BF16/FP162 B/参数
优化器状态FP3212 B/参数
合计16 B/参数

其中优化器状态占用的内存量最大,主要是因为 Adam 优化器需要为每个参数维护一个高精度的副本,同时需要维护动量和二阶矩两个状态,而这三者都需要使用 FP32 精度来存储,从而保证训练的稳定性和收敛性。Adam 优化器的状态占用量的计算公式如下:

状态含义精度
权重模型参数的高精度副本FP32
动量(momentum / first moment)梯度的指数移动平均FP32
二阶矩(variance / second moment)梯度平方的指数移动平均FP32

下面是不同模型参数量下,参数、梯度和优化器状态的内存占用量的估算:

参数量参数(GB)梯度(GB)优化器状态(GB)总计(GB)
1B2 GB2 GB12 GB16 GB
7B14 GB14 GB84 GB112 GB
70B140 GB140 GB840 GB1.12 TB

激活值是指在前向计算过程中计算得到的中间结果,比如输入 XX 经过线性变换和非线性激活函数后得到的输出 YY。在反向传播过程中,需要使用这些激活值来计算梯度,因此,激活值不能在前向计算完成后立即释放,而是需要保留到反向传播完成为止。考虑一个线性层:

Y=XWY = XW

反向传播时,已知输出梯度:

LY\frac{\partial L}{\partial Y}

需要计算:

LW=XTLYLX=LYWT\begin{aligned} \frac{\partial L}{\partial W} = X^T \frac{\partial L}{\partial Y} \\ \\ \frac{\partial L}{\partial X} = \frac{\partial L}{\partial Y} W^T \end{aligned}

计算权重梯度需要前向输入 XX,因此在反向传播完成之前 XX 需要保留。计算输入梯度需要权重 WW,而 WW 本来就作为模型参数长期存在,因此不需要额外保存。

模型激活值的内存占用量的估算相对复杂,所占用的内存和输入的 batch size、序列长度、模型层数和隐藏维度等因素有关。对一个 Transformer 模型来说,激活值的内存占用量可以用下面的公式估算:

Mactivationk×b×s×L×h×dM_{\text{activation}} \approx k \times b \times s \times L \times h \times d

这里 bb 是 batch size,ss 是序列长度,LL 是模型层数,hh 是隐层的维度,dd 是单个激活值的字节数。这里 kk 是一个系数,表示激活值占用的内存大致与 b×s×L×hb \times s \times L \times h 成正比。不同的模型结构和实现方式会影响 kk 的值,我在测试中发现 kk 的值大约为 30 左右。

以 Qwen3-4B 为例,它的参数量为 4.19B,模型层数为 36,隐层维度为 2560,假设 batch size 为 1,序列长度为 4096,使用 FP16 精度,则激活值的内存占用量可以估算如下:

序列长度激活值显存占用量
10245.27GB
204810.54GB
409621.08GB
819242.16GB
1638484.32GB

可见,激活值消耗的内存量非常惊人。但在实际训练中,通常不会保存所有的激活值。可以通过梯度检查点(Gradient Checkpointing)技术在前向计算过程中,只保存部分关键的激活值,而对于其他的激活值,在反向传播时重新计算。这种方式可以显著降低激活值的内存占用量,但会增加前向计算的时间开销。

计算量分析

对标准的稠密 Transformer,按照 OpenAI 在 2020 年发表的论文 Scaling Laws for Neural Language Models 中提出的经验公式,预训练计算量可以用下面的公式估算:

Ctrain6NDC_{\text{train}} \approx 6ND

其中 NN 是模型参数量,DD 是训练 token 数量。

另外,在 Training Compute-Optimal Large Language Models 中,作者研究了在给定计算量预算下,如何选择模型规模和训练数据量的最优比例。最终的结论是,模型参数量 NN 与训练所使用的 token 数 DD 的比例应该为 1 : 20(处理每个参数需要约 20 个 Token 的数据进行充分训练)。

基于以上经验公式,训练一个 70B 参数的稠密模型,需要约 1.4T 个 token,所需的总算力是 6×70B×1.4T5.88×10236 \times 70B \times 1.4T \approx 5.88 \times 10^{23} FLOPs。

用总计算量除以 GPU 集群的有效算力,可以得到训练耗时的下限,计算方式如下:

TCtrainnFpeak×MFUT \approx \frac{C_{\text{train}}}{n F_{\text{peak}} \times \mathrm{MFU}}

其中 nn 是 GPU 数量,FpeakF_{\text{peak}} 是训练精度下的单卡峰值算力,MFU(Model FLOPs Utilization)反映模型实际利用了理论算力的多少。数据加载、通信、流水线气泡和算子效率都会拉低 MFU。

以训练一个 70B 参数的稠密模型为例,使用 H100 GPU 训练。已知 H100 的 FP16 峰值算力 900 TFLOPs/s,假设 MFU 为 50%,使用不同数量的 GPU 训练所需时间如下表所示:

GPU 数量训练时间
141.4 年
85.2 年
647.8 个月
5124.2 周
10242.1 周

并行策略概览

要想支持更大规模的模型训练,同时在可接受的时间内完成训练,就需要使用多张 GPU 进行并行训练。使用多张 GPU 并行计算,这就需要考虑如何将整个训练或者推理任务分布到多张 GPU 上。

在模型训练与推理过程中,可以考虑以下可切分的维度:

基于以上可切分的维度,可以设计出不同的并行策略来提高多 GPU 训练的效率。

策略名称切分维度说明
数据并行(Data Parallelism,DP)数据维度将训练数据或者推理请求分布到多张 GPU 上,每张 GPU 拥有完整的模型副本。
张量并行(Tensor Parallelism,TP)模型维度 - 张量维度将每一层的权重参数切分为多个张量,分布到多张 GPU 上。
流水线并行(Pipeline Parallelism,PP)模型维度 - 层维度将模型的不同层分布到多张 GPU 上,形成流水线计算。
序列并行(Sequence Parallelism,SP)序列维度将输入的序列切分为多个子序列,分布到多张 GPU 上。
上下文并行(Context Parallelism,CP)上下文维度将输入的上下文信息切分,分布到多张 GPU 上。
专家并行(Expert Parallelism,EP)模型维度 - 专家维度将 MoE 模型中的不同专家分布到多张 GPU 上。

而这些并行策略之间也可以组合使用,比如组合数据并行和张量并行,或者组合使用张量并行、流水线并行、序列并行等等。后续文章将会对这些并行策略进行详细的介绍,并分析它们的优缺点,以及在训练和推理中如何选择合适的并行策略。

总结

大语言模型的参数量越来越大,单张 GPU 已经无法满足训练和推理的需求,因此需要使用多张 GPU 进行并行计算。本文从计算、显存两个角度分析了大语言模型为什么需要并行,并引入了数据并行、张量并行、流水线并行、上下文并行和专家并行等并行策略。

作为本系列文章的第一篇,本文主要引入并行的概念,各种并行策略的细节将会在后续文章中详细介绍。

评论 评论内容仅博主可见,不会公开显示)