随着 ChatGPT 的现象级走红,引领了AI大模型时代的变革,从而导致 AI 算力日益紧缺。与此同时,中美贸易战以及美国对华进行AI芯片相关的制裁导致 AI 算力的国产化适配势在必行。之前也分享过一些国产 AI 芯片、使用国产 AI 框架 Mindformers 基于昇腾910训练大模型,使用 MindIE 进行大模型服务化等。
大模型国产化适配1-华为昇腾AI全栈软硬件平台总结
大模型国产化适配2-基于昇腾910使用ChatGLM-6B进行模型推理
大模型国产化适配3-基于昇腾910使用ChatGLM-6B进行模型训练
大模型国产化适配4-基于昇腾910使用LLaMA-13B进行多机多卡训练
大模型国产化适配6-基于昇腾910B快速验证ChatGLM3-6B/BaiChuan2-7B模型推理
大模型国产化适配7-华为昇腾LLM落地可选解决方案(MindFormers、ModelLink、MindIE)
MindIE 1.0.RC1 发布,华为昇腾终于推出了针对LLM的完整部署方案,结束小米加步枪时代
大模型国产化适配8-基于昇腾MindIE推理工具部署Qwen-72B实战(推理引擎、推理服务化)
大模型国产化适配9-LLM推理框架MindIE-Service性能基准测试
大模型国产化适配10-快速迁移大模型到昇腾910B保姆级教程(Pytorch版)
另外,我撰写的
大模型相关的博客及配套代码
均整理放置在Github:https://github.com/liguodongiot/llm-action,有需要的朋友自取。
之前对
MindIE-Service 推理框架
进行了性能测试。下面对训练框架(ModelLink/MindFormers)进行训练测试。
训练性能的定义
训练性能在本文指机器(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接近占满内存。这取决于硬件类型、神经网络的参数大小以及输入数据的大小等。
要找到这个最大的Global Batch Size,最快方法是执行二分搜索。当时间不重要时,简单的顺序搜索就足够了。不过在大模型训练的过程中,Batch Size的值会影响到重计算、Pipeline并行、Tensor并行等不同并行模式的配比,还有micro Batch Size的数据配比。因此,默认Batch Size为16的倍数比较合理。
在确定了在AI加速卡上最大Batch Size值后,可以使用以下公式计算实际吞吐量:
每秒处理的训练数据样本数:
对于每一个AI框架,由于使用的并行策略和优化方法的不同,Global Batch Size计算方法也不同,以DeepSpeed为例,Global Batch Size 为:
global_train_batch_size = train_micro_batch_size_per_gpu * gradient_accumulation_steps * number of GPUs
而 MindFormers 中,Global Batch Size 为
global_batch_size = batch_size * data_parallel * micro_batch_num * micro_batch_interleave_num
每秒处理的Token数:
假设GLM10B网络模型使用DGX A100(8x 80GB)训练的吞吐量为25 samples/s,max seq_len为1024,那么按照tokens来计算吞吐量为 25 * 1024 = 25600 tokens/s,也就是每秒能处理2万多个tokens。单卡吞吐量为 3200 token/s/p。
线性度
线性度,又名加速比(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大模型,
因此,每次迭代的浮点预算数为
model FLOPs per iteration =
MLP 中将tensor维度从h提升到4h 再降低到h,浮点计算数为
第一个线性层,矩阵乘法的输入和输出形状为
[𝑏,𝑠,ℎ]×[ℎ,4ℎ]→[𝑏,𝑠,4ℎ]
。计算量为
。
第二个线性层,矩阵乘法的输入和输出形状为
[𝑏,𝑠,4ℎ]×[4ℎ,ℎ]→[𝑏,𝑠,ℎ]
。计算量为
。
Q,K,V的变化(
[𝑏,𝑠,ℎ]×[ℎ,ℎ]→[𝑏,𝑠,ℎ]
),浮点计算数为
Attention后到线性层的运算(
[𝑏,𝑠,ℎ]×[ℎ,ℎ]→[𝑏,𝑠,ℎ]
),浮点计算数为
logits运算(
[b,s,h]x[h,V]->[b,s,V]
),浮点计算数为
整个语言模型的每个step的前向传播 FLOPs:
考虑反向计算,反向传播的计算量大约是前向传播的2倍;因此,每个step总FLOPs =
=
=
第二项来自 attention 矩阵的计算,当s << 6h 时,可以忽略
第三项来自 LM head,当V << 12lh ,可以忽略
对于 LLaMa-13B 来说,
6h = 6 * 5120 = 30720
通常序列长度 s 为 2048,所以 Attention 矩阵的计算其实占比很小(1/15),可以忽略。
12lh = 12 * 50 * 5120 = 3072000
词表大小为 32000。所以 LM head 占比也很小(0.01),也可以忽略。
MFU 计算公式:
即
在模型固定的情况下,减少卡数和一次迭代时间,可以增大MFU。所以减少训练时间就是提高MFU。
HFU
使用了激活重新计算,在反向传播之前需要进行额外的前向传播,HFU的计算公式:
=
这里由于存在不同的重计算策略,计算方式会有一些差异。比如:Reducing Activation Recomputation in Large Transformer Models 中提到的
选择性激活重计算
(selective activation recomputation),提出了一种策略,即只对那些
占用大量内存但重新计算成本不高的Transformer层的部分激活进行存储和重计算
。例如,在自注意力机制中,某些操作(如: