跳到主要内容 LLM 训练性能基准测试与优化策略 | 极客日志
Python AI 算法
LLM 训练性能基准测试与优化策略 本文详细阐述了 AI 大模型训练性能的定义、核心指标及优化策略。内容涵盖训练时间构成、吞吐率、线性度、算力利用率(MFU/HFU)等关键指标的计算与分析方法。深入探讨了分布式训练并行技术(数据、张量、流水线并行)及混合精度、重计算、FlashAttention 等优化手段。最后基于昇腾 910B3 硬件环境提供了具体的性能测试说明与数据参考,旨在帮助开发者理解 LLM 训练性能基准,识别瓶颈并进行针对性调优。
灭霸 发布于 2025/2/6 更新于 2026/4/20 1 浏览随着 ChatGPT 的现象级走红,引领了 AI 大模型时代的变革,从而导致 AI 算力日益紧缺。与此同时,中美贸易战以及美国对华进行 AI 芯片相关的制裁导致 AI 算力的国产化适配势在必行。本文分享国产 AI 芯片、使用国产 AI 框架 Mindformers 基于昇腾 910 训练大模型,使用 MindIE 进行大模型服务化等相关技术。
训练性能的定义 训练性能在本文指机器(GPU、NPU 或其他平台)在指定模型和输入数据的背景下,完成一次端到端训练所需要花费的时间。考虑到不同模型的训练数据量和训练轮次(epoch)差异,此处定义的性能是在完成一个 batch 训练所需花费的时间。而端到端通常是指完成一个 AI 模型单步训练的过程。也就是说,本文所讨论的性能的衡量和性能的优化,都是站在模型角度上。
对于一个 batch 而言,训练所花费的时间主要由以下部分构成:
单 batch 总时间 = 数据加载时间 + 模型前反向时间 + 优化器时间 + 模型后处理时间 + 通信时间 + 调度时间
数据加载时间 :指的是模型在加载自身所需要的数据(如图片、视频和文本等)的时间,包括将数据从硬件存储设备读取到 CPU(Central Processing Unit)中、CPU 中数据的预处理(编解码等操作)、CPU 数据放到 Device(GPU/NPU…)上的时间。特别地,对于一些需要切分在若干张卡上的模型,数据加载还包括从数据加载卡广播到其他卡上的时间。
模型前反向时间 :指深度学习模型的前向过程和反向过程,即 Forward 和 Backward 过程,包含前向的数据计算和反向的数据微分求导。
优化器时间 :通常指的是模型参数更新时间。
模型后处理时间 :一般指的是优化器更新后的时间,包括数据的后处理或者一些必要的同步操作,通常取决于模型特有操作。
通信时间 :概念比较宽泛,一般将单节点内卡与卡 和多节点间 的通信行为归为通信时间,由于一些 AI 框架(如:PyTorch)的特殊机制或者优化,通信和计算通常可以并行起来(即通信计算重叠),因此我们一般考虑的是未被计算掩盖的通信时间。
调度时间 :指的是模型从 CPU 的指令到调用 NPU 侧的核(Kernel)所需要的时间。
训练性能指标 指标名称 单位 指标含义 吞吐率 samples/s、tokens/s 单位时间(例如 1s)内处理的 Token 数/训练样本数 单步时间 s 执行一个 step 所花费的时间 线性度、加速比 values 单卡训练扩展到多卡,单机拓展到集群的效率度量指标 内存占用 百分比 - 带宽占比 百分比 - 训练效率 tokens/day - 浮点运算 TFLOPS 每秒浮点运算次数,是计算设备的计算性能指标 模型算力利用率(Model FLOPs Utilization,MFU) 百分比 模型一次前反向计算消耗的矩阵算力与机器算力的比值 硬件算力利用率(Hardware FLOPs Utilization,HFU) 百分比 考虑重计算后,模型一次前反向计算消耗的矩阵算力与机器算力的比值
在计算性能指标时,通常的优先级排序为:吞吐率 > 单步迭代时间 > 线性度 > 内存占用 > 带宽占用 > 训练效率 > 浮点计算次数每秒 > 算力利用率 。
FLOPS 与 FLOPs 的不同之处
概念不同 :FLOPS 表示每秒浮点运算次数,是计算设备的计算性能指标;而 FLOPs 表示模型中的浮点运算操作总数,是模型计算复杂度的指标。
应用不同 :FLOPS 用于评估计算设备的处理能力和性能;FLOPs 用于衡量模型的计算复杂度和计算量。
单位不同 :FLOPS 的单位是每秒浮点运算次数(如 TFLOPS、GFLOPS);FLOPs 的单位是浮点运算操作总数(如 MFLOPs、GFLOPs)。
吞吐量 与涉及单个样本数据处理的延迟(Latency)不同,为了实现最大吞吐率(Throughput),我们希望在集群训练的过程中有效并行处理尽可能多的样本数据。这种有效的并行性依赖于数据、模型和设备规模。因此,为了正确测量最大吞吐率,可以执行以下两个步骤:
估计允许最大并行度的最佳训练样本数据批量大小,即 Batch Size;
在 AI 训练集群中,给定这个最佳 Batch Size,测量神经网络模型在一个 step 每 1 秒钟内可以处理的训练样本数据。
要找到最佳 Batch Size 值,一个好的经验法则是达到 AI 加速卡(GPU/NPU…)对给定数据类型的内存限制,即 Batch Size 接近占满内存。这取决于硬件类型、神经网络的参数大小以及输入数据的大小等。
要找到这个最大的 Batch Size,最快方法是执行二分搜索。当时间不重要时,简单的顺序搜索就足够了。不过在大模型训练的过程中,Batch Size 的值会影响到重计算、Pipeline 并行、Tensor 并行等不同并行模式的配比,还有 micro Batch Size 的数据配比。因此,默认 Batch Size 为 16 的倍数比较合理。
线性度 线性度,又名加速比(speed up),指单机拓展到集群的效率度量指标。
单机内部线性度 = 单机多卡总吞吐量 / (单卡吞吐量 * 卡数)
单机多卡总吞吐率,在 NLP 大语言模型中以 tokens/s 为基本单位,在 CV 大模型中以 samples/s 为基本单位。
集群线性度 = 多机多卡总吞吐量 / (单卡吞吐量 * 卡数 * 集群机器数)
集群线性度 ≈ 多机多卡总吞吐量 / (单机总吞吐量 * 集群机器数)
线性度的取值范围为 0~1,数值越接近于 1,其性能指标越好。
如果多卡或多机的加速比接近高线性度(即线性度接近于 1),说明在扩展时通信不是瓶颈,则可以通过改变或者增加通信带宽提升性能,对于整体 AI 大模型训练的性能提升在通信上问题就会比较小。
当线性度不高(例如:小于 0.8,具体视服务器集群的规模而定)时,排除数据 IO 和 CPU 的本身因素影响后,可以判断此时分布式通信存在瓶颈。
算力利用率 算力利用率指负载在集群上每秒消耗的实际算力占集群标称算力的比例。
标称算力是指硬件或设备在正常工作状态下的理论计算能力,通常以单位时间内能够完成的浮点运算次数(FLOPS)或整数运算次数(IOPS)来衡量。
模型算力利用率(Model FLOPs Utilization,MFU) :是指模型一次前反向计算消耗的矩阵算力与机器算力的比值
硬件算力利用率(Hardware FLOPs Utilization,HFU) :是指考虑重计算后,模型一次前反向计算消耗的矩阵算力与机器算力的比值
MFU 对一个典型的 GPT 类大模型,其主要的浮点算力都由 Transformer 层和 logit 层中的矩阵乘(GEMMs)贡献。比如千亿盘古大模型,99% 以上的浮点算力都由 fp16 的矩阵乘贡献。通常只考虑矩阵运算(Matrix Multiplications,GEMMs)。
对于一个 GPT 类 Transformer 大模型,
transformer 模型的层数为 l
隐藏层维度为 h
注意力头数为 a
词表大小为 V
批次大小为 b
序列长度为 s
GPU 单卡的峰值算力 F
训练使用 GPU 的卡数 N
训练一次迭代时间 T
model FLOPs per iteration = 72blsh^2(1 + s/(6h) + V/(12lh))
MLP 中将 tensor 维度从 h 提升到 4h 再降低到 h,浮点计算数为 16bsh^2
第一个线性层,矩阵乘法的输入和输出形状为 [b,s,h]×[h,4h]→[b,s,4h]。计算量为 8bsh^2。
第二个线性层,矩阵乘法的输入和输出形状为 [b,s,4h]×[4h,h]→[b,s,h]。计算量为 8bsh^2。
Q,K,V 的变化 ([b,s,h]×[h,h]→[b,s,h]),浮点计算数为 6bsh^2
Attention 矩阵运算,浮点计算数为 2bs^2h + 2bs^2h
Attention 后到线性层的运算 ([b,s,h]×[h,h]→[b,s,h]),浮点计算数为 2bsh^2
logits 运算 ([b,s,h]x[h,V]->[b,s,V]),浮点计算数为 2bshV
整个语言模型的每个 step 的前向传播 FLOPs:l(24bsh^2+4bs^2h)+2bshV
考虑反向计算,反向传播的计算量大约是前向传播的 2 倍;因此,每个 step 总 FLOPs = 3(l(24bsh^2+4bs^2h)+2bshV) = 72blsh^2 + 12bls^2h + 6bshV = 72bslh^2(1 + s/(6h) + V/(12lh))
第一项来自 QKVO 和 FFN 中的矩阵乘法
第二项来自 attention 矩阵的计算,当 s << 6h 时,可以忽略
第三项来自 LM head,当 V << 12lh,可以忽略
通常序列长度 s 为 2048,所以 Attention 矩阵的计算其实占比很小(1/15),可以忽略。
12lh = 12 * 50 * 5120 = 3072000
词表大小为 32000。所以 LM head 占比也很小(0.01),也可以忽略。
MFU = model FLOPs per iteration / (GPU 单卡算力 * 卡数 * 一次迭代时间)
MFU = 72bslh^2(1 + s/(6h) + V/(12lh)) / (F * N * T)
在模型固定的情况下,减少卡数和一次迭代时间,可以增大 MFU。所以减少训练时间就是提高 MFU。
HFU 使用了激活重新计算,在反向传播之前需要进行额外的前向传播,HFU 的计算公式:
HFU = 4l(24bsh^2+4bs^2h)+3*2bshV = 96blsh^2 + 16bls^2h + 6bshV
这里由于存在不同的重计算策略,计算方式会有一些差异。
通信性能指标 针对同一通信算子在不同卡之间通信时间的波动的分析,其主要目的在于需要识别一些可能存在的通信算子内部瓶颈单元 。在分析过程中,主要采用以下几个指标:
该指标可以用来初步识别是否存在慢卡瓶颈 ,对每块卡上的wait_ratio ,通过比较wait_ratio 与wait_ratio_threshold (当前设置为 0.2)的关系,识别是否存在慢节点。
对比该通信算子在各卡上的数据传输耗时 ,得到通信带宽最慢的 rank ;
计算该 rank 上的 sdma_bw 和 rdma_bw,并结合 sdma_transit_time 和 rdma_transit_time 给出对应平均带宽:
SDMA_Bandwidth = sdma_bw / sdma_transit_time
RDMA_Bandwidth = rdma_bw / rdma_transit_time
SDMA(System DMA, 系统直接内存访问),一种异步数据传输技术,可以在不占用 CPU 资源的情况下,实现数据在内存和外设之间的高速传输。
RDMA(Remote DMA, 远程直接数据存取),就是为了解决网络传输中服务器端数据处理的延迟而产生的。
同时,我们会设置一个经验带宽,一般设置为最大带宽的 0.8。
只有 SDMA 通信:
SDMA 平均带宽接近经验带宽,表示该通信算子瓶颈是 SDMA 带宽;
SDMA 平均带宽小于经验带宽,表示该通信算子瓶颈是 SDMA 通信效率低。
只有 RDMA 通信:
RDMA 平均带宽接近经验带宽,表示该通信算子瓶颈是 RDMA 带宽;
RDMA 平均带宽小于经验带宽,表示该通信算子瓶颈是 RDMA 通信效率低。
SDMA 通信和 RDMA 通信:
SDMA 耗时最长,表示当前通信算子主要瓶颈在于 SDMA 通信,瓶颈是 SDMA 带宽或 SDMA 通信效率低;
RDMA 耗时最长,表示当前通信算子主要瓶颈在于 RDMA 通信,瓶颈是 RDMA 带宽或 RDMA 通信效率低。
流水线并行效率指标 流水线并行是将神经网络中的算子切分成多个阶段(Stage),再把阶段映射到不同的设备上,使得不同设备去计算神经网络的不同部分。
流水线并行适用于模型是线性的图结构,如图所示,将 4 层 MatMul 的网络切分成 4 个阶段,分布到 4 台设备上。正向计算时,每台机器在算完本台机器上的 MatMul 之后将结果通过通信算子发送(Send)给下一台机器,同时,下一台机器通过通信算子接收(Receive)上一台机器的 MatMul 结果,同时开始计算本台机器上的 MatMul;反向计算时,最后一台机器的梯度算完之后,将结果发送给上一台机器,同时,上一台机器接收最后一台机器的梯度结果,并开始计算本台机器的反向。
简单地将模型切分到多设备上并不会带来性能的提升,因为模型的线性结构,同一时刻只有一台设备在工作,而其它设备在等待,造成了资源的浪费(流水线空泡 bubble )。为了提升效率,流水线并行进一步将小批次(MiniBatch)切分成更细粒度的微批次(MicroBatch),在微批次中采用流水线式的执行序,从而达到提升效率的目的。将小批次切分成 4 个微批次,4 个微批次在 4 个组上执行形成流水线。微批次的梯度汇聚后用来更新参数,其中每台设备只存有并更新对应组的参数。
1F1B(1 forward 1 backward,一次前向,一次反向)的流水线并行实现中对执行序进行了调整,来达到更优的内存管理 。在编号为 0 的 MicroBatch 的正向执行完后立即执行其反向,这样做使得编号为 0 的 MicroBatch 的中间结果的内存得以更早地释放,进而确保内存使用的峰值更低。
假设 MicroBatch Num 是m ,pipeline stage 是p ,流水线并行的效率是:
Pipeline_Utilization = m / (p + m - 1)
分布式训练并行策略及优化技术 目前,对于 LLM 而言,传统的单机单卡已经无法满足其训练要求,因此,需要采用多机多卡进行分布式并行训练来扩展模型参数规模,同时使用一些训练优化技术去降低显存、通信、计算等,从而提升训练性能。
数据并行
张量并行
流水线并行
MOE 并行(稀疏化)
FP16 / BF16:降低训练显存的消耗,还能将训练速度提升 2-4 倍。
FP8:NVIDIA H 系列 GPU 开始支持 FP8,兼有 FP16 的稳定性和 INT8 的速度,Nvidia Transformer Engine 兼容 FP8 框架,主要利用这种精度进行 GEMM(通用矩阵乘法)计算,同时以 FP16 或 FP32 高精度保持主权重和梯度。MS-AMP 训练框架 (使用 FP8 进行训练),与广泛采用的 BF16 混合精度方法相比,内存占用减少 27% 至 42%,权重梯度通信开销显著降低 63% 至 65%。运行速度比广泛采用的 BF16 框架(例如 Megatron-LM)快了 64%,比 Nvidia Transformer Engine 的速度快了 17%。
重计算 (Recomputation)/梯度检查点 (gradient checkpointing) :一种在神经网络训练过程中使动态计算只存储最小层数的技术。一种用计算换显存的方法。通过减少保存的激活值来压缩模型占用空间,在计算梯度时必须重新计算没有存储的激活值。
梯度累积 :它将多个 Batch 训练数据的梯度进行累积,在达到指定累积次数后,使用累积梯度统一更新一次模型参数,以达到一个较大 Batch Size 的模型训练效果。累积梯度等于多个 Batch 训练数据的梯度的平均值。
FlashAttention v1 and v2 :通过分块计算和 kernel 融合,减少了 HBM 访问次数,实现了计算加速,同时减少了显存占用。参考:Megatron-deepspeed,训练推理都可以使用。
MQA / GQA :一定程度的 Key value 的共享,从而可以使模型体积减小,减少了数据的读取。
卸载(Offload)技术 :一种用通信换显存的方法,简单来说就是让模型参数、激活值等在 CPU 内存和 GPU 显存之间左右横跳。如:ZeRO-Offload、ZeRO-Infinity 等。
基于昇腾 910B3 进行 LLM 训练性能测试
AI 框架:ModelLink、MindFormers
模型:baichuan2-7b/13b、qwen1.5-7b/14b、llama2-34b
分布式并行策略:DP/TP/PP
训练优化技术:FlashAttn、GQA、混合精度等
指标:吞吐量、显存(仅为当前分布式策略下的吞吐量,并不是最大吞吐量)
训练数据集:alpaca-52k、belle-random-10k
服务器配置:3 台 910B3 x 8(其中,某两台在同一个交换机,另外一台在另一个交换机)
下面在 910B3 上对不同训练框架、不同模型参数规格、不同卡进行了几组对比实验,比如:同一框架同一模型不同参数规模对比,同一框架同一模型不同卡对比,同一框架同一模型不同并行策略对比、不同框架同一模型对比等。
声明:本文 LLM 训练性能测试数据仅供参考,同时,每种框架里面的训练优化技术没有严格对齐(当然能够提供一组默认的最佳的训练参数是 AI 框架性能和易用性的隐性衡量标准);因此,具体性能实测为准 。
总结与建议 通过对 LLM 训练性能基准测试的分析,我们可以得出以下结论:
性能瓶颈定位 :准确识别数据加载、通信、计算等环节的耗时占比是优化的前提。特别是在大规模集群下,通信时间往往成为主要瓶颈。
指标选择 :MFU 和 HFU 是衡量硬件利用率的核心指标,应优先关注。吞吐率和单步时间是直观的业务指标。
并行策略 :根据模型规模和硬件条件选择合适的并行策略(数据、张量、流水线)至关重要。混合并行通常是主流方案。
优化技术 :合理使用 FlashAttention、混合精度、梯度检查点等技术可以显著提升训练效率和降低显存占用。
在实际落地过程中,建议建立标准化的性能测试流程,定期监控关键指标,并根据业务需求动态调整训练参数。此外,随着硬件架构的演进,新的优化技术也在不断涌现,持续跟踪社区动态和技术文档是保持竞争力的关键。
相关免费在线工具 加密/解密文本 使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
RSA密钥对生成器 生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
Mermaid 预览与可视化编辑 基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
curl 转代码 解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
Base64 字符串编码/解码 将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
Base64 文件转换器 将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online