从GPT-1到GPT-3,两年时间内模型参数0.1B增加到175B,而同期,NVIDIA交出的成绩单是从V100的32GB显存增加A100的80GB,显然,显存的提升速度远远赶不上模型模型增长的速度,这就是内存墙问题。
https://mp.weixin.qq.com/s/kuIsyX0QEIeFHn8tvFE8vw
AI训练的最大障碍不是算力,而是“内存墙”
在每个mini-batch的前向过程中删除一些暂时用不到的中间激活特征以降低内存占用,并在后向过程中需要时借助额外的前向计算恢复它们。
https://zhuanlan.zhihu.com/p/373662730
亚线性内存优化—activation checkpointing在oneflow中的实现
Bucketing是一种训练多个不同但又相似的结构的网络的方法,这些网络共享相同的参数集。
一个典型的应用是循环神经网络(RNNs)。实现RNNs通常会沿时间轴将网络显式地展开。为了处理序列中的所有元素,我们需要将网络展开成最大可能的序列长度。然而这很浪费资源,因为对于较短的序列,大部分计算都浪费在填充的数据的执行上了。
Bucketing不再将网络展开成最大可能长度,而是展开成多个不同长度的实例(比如,长度为5, 10, 20, 30)。在训练过程中,对于不同长度的最小批数据,使用最恰当的展开模型。
https://blog.csdn.net/xuezhisdc/article/details/54927869
how_to——bucketing
在训练各个部分耗时中,backward(BWD)反向传播部分,通常占比比较大,相比之下,参数更新的部分(OPT)则通常是耗时比重小的部分。
所以为了能够overlap通讯的耗时,Pytorch DDP选择在backward的时候进行梯度更新,并且为此引入bucket的概念。一个bucket里通常有不超过一定大小的几个layer的参数组成(默认是25MB),当一个bucket内部的梯度准备好了之后,则这个bucket就可以开始进行ring-all-reduce取平均操作,而不需要等到计算完整个模型的反向传播过后才进行一次统一的ring-all-reduce操作,相当与把多卡通讯的时间隐藏在了backward计算的耗时中,大大提升了资源利用效率。
Horovod是Uber开源的一套分布式深度学习框架。Horovod支持TensorFlow、Keras、PyTorch和Apache MXNet等后端框架。
官网:
https://eng.uber.com/horovod/
代码:
https://github.com/horovod/horovod
Horovod主打Data Parallel。这在前LLM时代用的比较多,但对于LLM而言,单卡根本放不下所有的参数,Data Parallel也就用不起来了。
参考:
https://www.cnblogs.com/rossiXYZ/p/14856464.html
深度学习分布式训练框架Horovod
https://zhuanlan.zhihu.com/p/40578792
Horovod-基于TensorFlow分布式深度学习框架
https://zhuanlan.zhihu.com/p/158375055
PyTorch单机多卡操作(分布式DataParallel,混合精度,Horovod)
https://mp.weixin.qq.com/s/iQIRj7ifsOEnupYZuQsVwQ
是时候放弃TensorFlow集群,拥抱Horovod了
https://mp.weixin.qq.com/s/qOjGrR59Mf0Mzgh4bpDhrA
详解Horovod:Uber开源的TensorFlow分布式深度学习框架
https://mp.weixin.qq.com/s/yNxjJHpGns6utpBpI-0XDA
分布式训练框架Horovod初步学习
https://zhuanlan.zhihu.com/p/374575049
一文看懂Horovod源码
https://mp.weixin.qq.com/s/7c7Q0P3g3IEL_r4BU2ZxRg
Horovod架构剖析——解密最成功的第三方DL分布式训练框架
https://horovod.readthedocs.io/en/stable/xla.html
Horovod with XLA in Tensorflow
显存内容可分为两类:
ZeRO使用分片(partition)方法,即每张卡只存1/N的模型状态量。
除了模型参数必须广播到各节点之外,模型梯度可以由各节点自己生成,然后再将之Reduce到保存数据的节点(即上图中的GPU 3)中。
只有模型梯度,由于来自不同的Data,需要各节点的同步,其他的Adam状态数据均与Data无关,由各节点自行计算更新即可。
代码:
https://github.com/microsoft/DeepSpeed
示例:
https://github.com/microsoft/DeepSpeedExamples
stage 1 & 2的代码在:
deepspeed/runtime/zero/stage_1_and_2.py
官网:
https://www.deepspeed.ai
DeepSpeed提供了PDSH、OpenMPI、MVAPICH三种方式在多机多卡模式下运行模型。
PDSH:Parallel Distributed Shell
参考:
https://www.microsoft.com/en-us/research/blog/zero-deepspeed-new-system-optimizations-enable-training-models-with-over-100-billion-parameters
ZeRO & DeepSpeed
https://www.microsoft.com/en-us/research/blog/deepspeed-extreme-scale-model-training-for-everyone/
DeepSpeed: Extreme-scale model training for everyone
https://mp.weixin.qq.com/s/Vb3AkoWHQY7WWBMZaVnf4g
微软发布DeepSpeed开源库,支持1000亿个参数模型的训练
https://zhuanlan.zhihu.com/p/621379646
人手一个ChatGPT!微软DeepSpeed Chat震撼发布,一键RLHF训练千亿级大模型
https://zhuanlan.zhihu.com/p/513571706
DeepSpeed之ZeRO系列:将显存优化进行到底
https://zhuanlan.zhihu.com/p/630734624
deepspeed入门教程
https://zhuanlan.zhihu.com/p/576673548
深度学习大模型训练–DeepSpeed源码解读
https://zhuanlan.zhihu.com/p/626420999
deepspeed chat代码解读
GSPMD是在GShard基础上发展而来的并行算法。
《GSPMD:General and Scalable Parallelization for ML Computation Graphs》
通用性较强的Ulysses,在小规模或长序列上表现更好。
《DeepSpeed Ulysses: System Optimizations for Enabling Training of Extreme Long Sequence Transformer Models》
FastSeq,它能将qkv projection的计算和all-gather通信重叠,只需多占用一点内存就可更进一步提升训练效率。
《FastSeq: Make Sequence Generation Faster》
LoRA: Low-Rank Adaptation of Large Language Models是微软研究院引入的一项新技术,主要用于处理大模型微调的问题。
lora模型可以简单理解为在基础模型之上的一个补丁模型,用来训练特定风格、特定人物、特定动作等效果。因为基础模型提供了强大的通用能力,但对于指定人物、或者特定的一种风格掌握的并不精,所以需要lora模型来针对性学习下特定领域的效果。
\[h=xW_0'+xA'B'=W_0x+BAx\]上图为LoRA的实现原理,其实现流程为:
在原始预训练语言模型旁边增加一个旁路,做降维再升维的操作来模拟内在秩;
用随机高斯分布初始化A,用零矩阵初始化B,训练时固定预训练模型的参数,只训练矩阵A与矩阵B;
推理的时候,只需要更新\(W=W_0+BA\)即可。
由于A和B的数据量极小,有的时候也会只发布A和B。用户将之下载之后,自行更新base model即可。这就相当于是model的patch。
由此还衍生出一种用法,一个base model + 若干针对不同领域/任务的patch,就可以服务于多个不同的领域/任务。
LoRA大幅降低了模型训练时的显存占用,因为并不优化主模型,所以主模型对应的优化器参数不需要存储。但计算量没有明显变化——虽然减少了主模型更新权重的计算,但却增加了旁路的正向和反向计算。
代码:
https://github.com/microsoft/LoRA
fine tune的示例:
examples/NLG/src/gpt2_ft.py
类似LORA这种,用较少参数量的fine-tuning,取代全参数量fine-tuning的方法,被称为Adapter,或者parameter-efficient fine-tuning (PEFT)。
论文:《LLM-Adapters: An Adapter Family for Parameter-Efficient Fine-Tuning of Large Language Models》
参考:
https://huggingface.co/datasets/HuggingFace-CN-community/translation/blob/main/lora_cn.md
使用LoRA进行Stable Diffusion的高效参数微调
https://zhuanlan.zhihu.com/p/631411685
微软LoRA:使用万分之一的参数微调你的GPT3模型
https://zhuanlan.zhihu.com/p/620327907
LoRA:大模型的低秩适配-最近大火的lora到底是什么东西?为啥stable diffusion和开源ChatGPT复现都在用?
https://zhuanlan.zhihu.com/p/639229126
深入浅出解析LoRA完整核心基础知识
https://mp.weixin.qq.com/s/nhIRulIRD6VrdPInDsaD8A
使用QLoRA对Llama 2进行微调的详细笔记
Fully Sharded Data Parallel是Facebook深度借鉴微软ZeRO之后提出的PyTorch DDP升级版本,可以认为是对标微软ZeRO,其本质是parameter sharding。Parameter sharding就是把模型参数切分到各个GPU之上。
上面的操作之所以能够成立,其实是利用了以下公式:
FSDP本身并不能减少数据的通信量,更不可能减少计算量(所有的分布式算法都无法减少理论计算量),甚至还会增加数据的通信量。但是可以通过重叠IO和计算的时间,来提升系统的利用效率。显然与其等待全部计算完成,再All-Reduce,还不如算一部分,通信一部分来的快。
受到FSDP的启发,Facebook又发明了HSDP,进一步用小步快跑的IO策略,提升系统的利用效率。
代码:
https://github.com/facebookresearch/fairscale/blob/main/fairscale/nn/data_parallel/fully_sharded_data_parallel.py
pytorch里已经集成了该代码:
torch/distributed/fsdp/fully_sharded_data_parallel.py
参考:
https://www.cnblogs.com/rossiXYZ/p/15815013.html
Facebook如何训练超大模型—(1)
https://www.cnblogs.com/rossiXYZ/p/15819817.html
Facebook如何训练超大模型—(2)
https://zhuanlan.zhihu.com/p/485208899
数据并行Deep-dive: 从DP到Fully Sharded Data Parallel(FSDP)完全分片数据并行
https://pytorch.org/tutorials/intermediate/FSDP_tutorial.html
GETTING STARTED WITH FULLY SHARDED DATA PARALLEL(FSDP)
您的打赏,是对我的鼓励
请访问这里提交评论