AI Infra论文阅读之《在LLM训练中减少激活值内存》

文章介绍了Megatron-LM中如何通过SequenceParallel和SelectiveActivationRecomputation技术减少大语言模型的激活内存,以及这两种方法如何在1万亿参数模型上实现5倍的记忆减半和90%以上的重计算时间减少。特别是,ContextParallel的引入进一步优化了内存消耗并支持更长序列训练。

写了一个Megatron-LM的3D Parallel进程组可视化的Playground,界面长下面这样:

在这里插入图片描述

可以直接访问:https://huggingface.co/spaces/BBuf/megatron-lm-parallel-group-playground

脚本也开源在:https://github.com/BBuf/megatron-lm-parallel-group-playground 请随意获取和修改。

0x0. 前言

本次阅读一篇Megatron-LM的README贴出的一篇paper,是NVIDIA在2022年上传的,讲的是Megatron-LM里面的Sequence Parallel和Selective Activation Recomputation如何降低大语言模型训练中的激活内存。这里来看一下理论讲解,另外Paper的第4节的激活内存公式估计比较有用。paper链接为:https://arxiv.org/pdf/2205.05198.pdf 。序列并行目前是非常常用的,但是选择性激活重计算可能用得人不多,我想一个很重要的原因应该是 FlashAttention 的出现大大降低了激活值内存大小。但这篇Paper的一些公式仍然是有用处的,至少给我们提供了理论依据。此外,Meagtron-LM推出的Context Parallel是在Sequence Parallel的基础上更近一步,可以继续降低激活值的大小,并且支持更长的序列。

摘要就是说通过Sequence Parallel和Selective Activation Recomputation可以减少激活重计算,把Sequece Parallel和Tensor Parallel结合在一起基本可以避免激活重计算的需要。然后在高达一万亿参数规模的语言模型上评估了上面的两个方法,并展示了这里的放大把激活内存降低了5倍,同时把激活重计算的执行时间开销减少了超过90%。例如,在2240 NVIDIA A100 GPUs上训练一个530B参数的GPT-3风格模型时,实现了54.2%的MFU,比使用重计算实现的42.1%快了29%。

0x1. 介绍

这里简单总结一下,一般来说Meagtron-LM里面张量并行都是放在同一个GPU的节点里面,节点内部由NVLink连接。然后,流水线并行虽然可以减少存储模型参数和优化器状态的内存,但是由于要存储一些Micro Batch的激活,所以并不能减少激活需要的内存。因此,激活内存的存储成为了训练大语言模型的一个关键问题。图1显示了从220亿参数到1万亿参数的四种模型配置所需的内存(模型配置的详细信息在表3中提供)。

在这里插入图片描述
在这里插入图片描述
这里的present work就是通过激活重计算(也叫Gradient Checkpointing)来减轻Activation的存储大小。之前标准的做法是在每一个Transformer层的边界进行重计算,paper也把这种方法叫作完全激活重计算。但完全激活重计算会导致增加30-40%左右的时间开销。为了节省这部分计算开销,但又要Scale Up模型,所以就引入了Paper介绍的两种方法Sequence Parallel和Selective Activation Recomputation。

0x2. 相关工作rt

对Megatron-LM的张量并行进行了简单的介绍,没什么干货,忽略。

0x3. Transformer的结构

如下图的图2所示:输入token被送入一个大小为 v × h v\times h v×h的词嵌入表中,token嵌入与学习到的位置嵌入(大小为 s × h s\times h s×h)结合,其中 s s s是序列长度, h h h是隐藏维度, v v v是词表大小。嵌入层的输出,即Transformer块的输入,是一个大小为 s × b × h s\times b\times h s×b×h的3维张量,其中 b b b是微批量大小。每个Transformer层由一个自注意力块组成,该块有 a a a个注意力头,接着是一个增加隐藏大小到 4 h 4h 4h然后再减少回 h h h的两层多层感知器(MLP)。每个Transformer层的输入和输出大小相同,为 s × b × h s×b×h s×b×h。最后一个Transformer层的输出被投影回词汇维度以计算交叉熵损失。paper假设词嵌入和输出层权重是共享的。变量名在表1中列出以供参考。

在这里插入图片描述
在这里插入图片描述

0x4. Activation Memory

首先,Paper导出了一个近似的公式来估计激活内存的大小,这里的激活指的是在Forward过程中创建并且在Backward中用于梯度计算所必需的任何张量。然后,这里只考虑对激活内存贡献最大的部分不考虑小的Buffer,比如对于LayerNorm来说,输入包含bsh个元素,但均值和方差每个只有sb个元素,由于h一般很大,所以bsh远远大于2sb,所以就忽略掉2sb,以sbh来计算LayerNorm层的激活大小。

0x4.1 每个Transformer层的Activation估计

注意Paper发表的时候还没有FlashAttention

如上图2所示,每个Transforme

### 大型语言模型的人工智能基础设施 大型语言模型(LLM)依赖于复杂且强大的人工智能基础设施来支持其训练、部署和持续优化过程。这种基础设施不仅涉及硬件资源,还包括软件平台和服务框架。 #### 硬件需求 为了有效处理大规模数据集并执行复杂的计算任务,企业通常会选择高性能计算集群作为支撑 LLM 的基础架构[^1]。这些集群由大量 GPU 或 TPU 组成,能够提供足够的算力来进行高效的分布式训练。此外,存储系统也至关重要;它需要具备高带宽和低延迟特性以满足快速访问海量参数的需求。 #### 软件栈 除了物理设备外,构建一个完整的AI开发环境同样重要。这包括但不限于: - **深度学习框架**:如 TensorFlow 和 PyTorch ,它们提供了易于使用的API接口以及丰富的预定义模块库。 - **自动化工具链**:用于简化实验管理、超参调优等工作流程。例如Kubeflow可以实现端到端机器学习流水线编排。 - **版本控制系统**:GitLab CI/CD等服务帮助团队协作维护代码质量的同时加速迭代速度。 对于那些希望利用现成解决方案而非自建设施的企业来说,云服务商提供的托管式选项可能是更好的选择。AWS SageMaker、Google Cloud Vertex AI 和 Azure Machine Learning 都能为企业级用户提供按需扩展的能力,并内置了多种高级功能以便更轻松地管理和监控整个生命周期内的各项活动。 ```python import torch from transformers import AutoModelForCausalLM, AutoTokenizer tokenizer = AutoTokenizer.from_pretrained("model_name") model = AutoModelForCausalLM.from_pretrained("model_name") input_text = "your input here" inputs = tokenizer(input_text, return_tensors="pt") outputs = model.generate(**inputs) print(tokenizer.decode(outputs[0], skip_special_tokens=True)) ```
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值