大语言模型并行策略(一):概览
为什么需要并行
最近几年,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 之间如何协同计算。本文将要介绍的大语言模型中的并行策略,解决的正是大语言模型的分布式训练和推理的问题。
内存占用分析
要理解为什么模型放不进单卡,得先看看训练过程中显存里都装了些什么。大语言模型在训练过程中,内存占用主要包括以下几个部分:
- 模型参数:存储模型的权重参数。
- 梯度:反向传播过程中向后传递的梯度信息。
- 优化器状态:如 Adam 优化器需要存储每个参数的动量和二阶矩。
- 激活值:用于在反向传播过程中计算梯度的激活值。
各项的具体情况如下:
| 项目 | 主要影响因素 | 用途 |
|---|---|---|
| 模型参数 | 参数量、存储精度 | 前向和反向计算 |
| 梯度 | 可训练参数量、梯度精度 | 参数更新与数据并行同步 |
| 优化器状态 | 参数量、优化器类型 | 记录动量等更新状态 |
| 激活值 | batch size、序列长度、层数、隐藏维度 | 反向传播 |
其中,模型参数、梯度和优化器状态的内存占用量与模型参数量直接相关,以使用 Adam 优化器为例,内存占用量的估算如下:
| 项目 | 数据类型 | 内存占用 |
|---|---|---|
| 权重 | BF16/FP16 | 2 B/参数 |
| 梯度 | BF16/FP16 | 2 B/参数 |
| 优化器状态 | FP32 | 12 B/参数 |
| 合计 | 16 B/参数 |
其中优化器状态占用的内存量最大,主要是因为 Adam 优化器需要为每个参数维护一个高精度的副本,同时需要维护动量和二阶矩两个状态,而这三者都需要使用 FP32 精度来存储,从而保证训练的稳定性和收敛性。Adam 优化器的状态占用量的计算公式如下:
| 状态 | 含义 | 精度 |
|---|---|---|
| 权重 | 模型参数的高精度副本 | FP32 |
| 动量(momentum / first moment) | 梯度的指数移动平均 | FP32 |
| 二阶矩(variance / second moment) | 梯度平方的指数移动平均 | FP32 |
下面是不同模型参数量下,参数、梯度和优化器状态的内存占用量的估算:
| 参数量 | 参数(GB) | 梯度(GB) | 优化器状态(GB) | 总计(GB) |
|---|---|---|---|---|
| 1B | 2 GB | 2 GB | 12 GB | 16 GB |
| 7B | 14 GB | 14 GB | 84 GB | 112 GB |
| 70B | 140 GB | 140 GB | 840 GB | 1.12 TB |
激活值是指在前向计算过程中计算得到的中间结果,比如输入 经过线性变换和非线性激活函数后得到的输出 。在反向传播过程中,需要使用这些激活值来计算梯度,因此,激活值不能在前向计算完成后立即释放,而是需要保留到反向传播完成为止。考虑一个线性层:
反向传播时,已知输出梯度:
需要计算:
计算权重梯度需要前向输入 ,因此在反向传播完成之前 需要保留。计算输入梯度需要权重 ,而 本来就作为模型参数长期存在,因此不需要额外保存。
模型激活值的内存占用量的估算相对复杂,所占用的内存和输入的 batch size、序列长度、模型层数和隐藏维度等因素有关。对一个 Transformer 模型来说,激活值的内存占用量可以用下面的公式估算:
这里 是 batch size, 是序列长度, 是模型层数, 是隐层的维度, 是单个激活值的字节数。这里 是一个系数,表示激活值占用的内存大致与 成正比。不同的模型结构和实现方式会影响 的值,我在测试中发现 的值大约为 30 左右。
以 Qwen3-4B 为例,它的参数量为 4.19B,模型层数为 36,隐层维度为 2560,假设 batch size 为 1,序列长度为 4096,使用 FP16 精度,则激活值的内存占用量可以估算如下:
| 序列长度 | 激活值显存占用量 |
|---|---|
| 1024 | 5.27GB |
| 2048 | 10.54GB |
| 4096 | 21.08GB |
| 8192 | 42.16GB |
| 16384 | 84.32GB |
可见,激活值消耗的内存量非常惊人。但在实际训练中,通常不会保存所有的激活值。可以通过梯度检查点(Gradient Checkpointing)技术在前向计算过程中,只保存部分关键的激活值,而对于其他的激活值,在反向传播时重新计算。这种方式可以显著降低激活值的内存占用量,但会增加前向计算的时间开销。
计算量分析
对标准的稠密 Transformer,按照 OpenAI 在 2020 年发表的论文 Scaling Laws for Neural Language Models 中提出的经验公式,预训练计算量可以用下面的公式估算:
其中 是模型参数量, 是训练 token 数量。
另外,在 Training Compute-Optimal Large Language Models 中,作者研究了在给定计算量预算下,如何选择模型规模和训练数据量的最优比例。最终的结论是,模型参数量 与训练所使用的 token 数 的比例应该为 1 : 20(处理每个参数需要约 20 个 Token 的数据进行充分训练)。
基于以上经验公式,训练一个 70B 参数的稠密模型,需要约 1.4T 个 token,所需的总算力是 FLOPs。
用总计算量除以 GPU 集群的有效算力,可以得到训练耗时的下限,计算方式如下:
其中 是 GPU 数量, 是训练精度下的单卡峰值算力,MFU(Model FLOPs Utilization)反映模型实际利用了理论算力的多少。数据加载、通信、流水线气泡和算子效率都会拉低 MFU。
以训练一个 70B 参数的稠密模型为例,使用 H100 GPU 训练。已知 H100 的 FP16 峰值算力 900 TFLOPs/s,假设 MFU 为 50%,使用不同数量的 GPU 训练所需时间如下表所示:
| GPU 数量 | 训练时间 |
|---|---|
| 1 | 41.4 年 |
| 8 | 5.2 年 |
| 64 | 7.8 个月 |
| 512 | 4.2 周 |
| 1024 | 2.1 周 |
并行策略概览
要想支持更大规模的模型训练,同时在可接受的时间内完成训练,就需要使用多张 GPU 进行并行训练。使用多张 GPU 并行计算,这就需要考虑如何将整个训练或者推理任务分布到多张 GPU 上。
在模型训练与推理过程中,可以考虑以下可切分的维度:
- 数据维度:将训练数据或者推理请求分布到多张 GPU 上。
- 模型维度:将模型的参数分布到多张 GPU 上。
- 层维度:将模型的不同层分布到多张 GPU 上。
- 张量维度:将每一层的权重参数切分为多个张量,分布到多张 GPU 上。
- 专家维度:将 MoE 模型中的不同专家分布到多张 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 进行并行计算。本文从计算、显存两个角度分析了大语言模型为什么需要并行,并引入了数据并行、张量并行、流水线并行、上下文并行和专家并行等并行策略。
作为本系列文章的第一篇,本文主要引入并行的概念,各种并行策略的细节将会在后续文章中详细介绍。