随着ChatGPT的迅速出圈,加速了大模型时代的变革。对于以Transformer、MOE结构为代表的大模型来说,传统的单机单卡训练模式肯定不能满足上千(万)亿级参数的模型训练,这时候我们就需要解决内存墙和通信墙等一系列问题,在单机多卡或者多机多卡进行模型训练。
最近一段时间,我也在探索大模型相关的一些技术,下面做一个简单的总结。
由于目前只有3台A800 GPU服务器(共24卡)。基于目前现有的一些AI框架和大模型,无法充分利用3台服务器。比如:OPT-66B一共有64层Transformer,当使用Alpa进行流水线并行时,通过流水线并行对模型进行切分,要么使用16卡,要么使用8卡,没法直接使用24卡,因此,GPU服务器最好是购买偶数台(如:2台、4台、8台)。
具体的硬件配置如下:
目前使用Huggingface Transformers和DeepSpeed进行通过数据并行进行训练(pretrain),单卡可以跑三百亿参数(启用ZeRO-2或ZeRO-3),如OPT-30B,具体训练教程参考官方样例。
使用Alpa进行流水线并行和数据并行进行训练(fine tuning)时,使用了3台共24卡(PP:12,DP:2)进行训练OPT-30B,具体训练教程参考官方样例。但是进行模型训练之前需要先进行模型格式转换,将HF格式转换为Alpa格式的模型文件,具体请参考官方代码。如果不想转换,官网也提供了转换好的模型格式,具体请参考文档:Serving OPT-175B, BLOOM-176B and CodeGen-16B using Alpa。
模型结构:
目前主流的大模型都是Transformer、MOE结构为基础进行构建,如果说Transformer结构使得模型突破到上亿参数量,MoE 稀疏混合专家结构使模型参数量产生进一步突破,达到数万亿规模。
大模型算法:
下图详细展示了AI大模型的发展历程:
可以说,Transformer 开创了继 MLP 、CNN和 RNN之后的第四大类模型。而基于Transformer结构的模型又可以分为Encoder-only、Decoder-only、Encoder-Decoder这三类。
目前业界可以下载到的一些大语言模型:
20230325(当时官方还未开源训练代码,目前直接基于官方的训练代码即可):
前两天测试了BELLE,对中文的效果感觉还不错。具体的模型训练(预训练)方法可参考Hugingface Transformers的样例,SFT(指令精调)方法可参考Alpaca的训练代码。
从上面可以看到,开源的大语言模型主要有三大类:GLM衍生的大模型(wenda、ChatSQL等)、LLaMA衍生的大模型(Alpaca、Vicuna、BELLE、Phoenix、Chimera等)、Bloom衍生的大模型(Bloomz、BELLE、Phoenix等)。
模型 | 训练数据量 | 模型参数 | 训练数据范围 | 词表大小 |
---|---|---|---|---|
LLaMA | 1T~1.4T tokens(其中,7B/13B使用1T,33B/65B使用1.4T) | 7B~65B | 以英语为主要语言的拉丁语系 | 32000 |
ChatGLM-6B | 约 1T tokens | 6B | 中文、英语 | 130528 |
Bloom | 1.6TB预处理文本,转换为 350B 唯一 tokens | 6B | 46种自然语言,13种编程语言 | 250680 |
从表格中可以看到,对于像ChatGLM-6B、LLaMA、Bloom这类大模型,要保证基座模型有比较好的效果,至少需要保证上千亿、万亿级的Token量。
目前来看,LLaMA无疑是其中最闪亮的星。但是国内关于LLaMA比较大的一个争论就是LLaMA是以英语为主要语言的拉丁语系上进行训练的,LLaMA词表中的中文token比较少(只有几百个),需不需要扩充词表?如果不扩充词表,中文效果会不会比较差?
下面是BELLE针对是否扩充词表,数据质量、数据语言分布、数据规模对于模型性能的对比:
其中,BELLE-0.5M-CLEAN是从230万指令数据中清洗得到0.5M数据(包含单轮和多轮对话数据)。LLaMA-7B-EXT是针对LLaMA做了中文词表扩充的预训练模型。
下面是Chinese-LLaMA-Alpaca针对中文Alpaca-13B、中文Alpaca-Plus-7B、中文Alpaca-Plus-13B的效果对比:
其中,Plus系列Alpaca是在原版LLaMA的基础上扩充了中文词表,使用了120G中文通用纯文本数据进行二次预训练。
因此,如果既想要中文词表,又没有很大的算力,那建议直接使用ChatGLM-6B或者使用BELLE和Chinese-LLaMA-Alpaca进行中文词表扩充后训练好的模型作为Base模型。
目前业界可以下载到的一些多模态大模型:
并行技术:
显存优化技术:
如何选择一款分布式训练框架?
常见的分布式训练框架:
目前训练超大规模语言模型主要有两条技术路线:
在面对特定的下游任务时,如果进行Full FineTuning(即对预训练模型中的所有参数都进行微调),太过低效;而如果采用固定预训练模型的某些层,只微调接近下游任务的那几层参数,又难以达到较好的效果。
PEFT技术旨在通过最小化微调参数的数量和计算复杂度,来提高预训练模型在新任务上的性能,从而缓解大型预训练模型的训练成本。这样一来,即使计算资源受限,也可以利用预训练模型的知识来迅速适应新任务,实现高效的迁移学习。因此,PEFT技术可以在提高模型效果的同时,大大缩短模型训练时间和计算成本,让更多人能够参与到深度学习研究中来。
典型应用:
PEFT实现:
高效微调技术目前存在的两个问题:
相比全参数微调,高效微调技术目前存在的两个问题:
OpenAI的论文Scaling Laws for Neural Language Models中列举了影响模型性能最大的三个因素:计算量、数据集大小、模型参数量。也就是说,当其他因素不成为瓶颈时,计算量、数据集大小、模型参数量这3个因素中的单个因素指数增加时,loss会线性的下降。
除了以上的因素之外,还有一个比较大的影响因素就是数据质量。在微软的论文Instruction Tuning with GPT-4中指出,同样基于LLaMA模型,使用GPT3和GPT4产生的数据,对模型进行Instruction Turing,可以看到GPT4的数据微调过的模型效果远远好于GPT3数据微调的模型,可见数据质量带来的影响。同样的,Vicuna(7B/13B)的Instruction Turing中,也对shareGPT的数据做了很细致的清洗工作。
要评估一个大型语言模型的水平,可以从以下几个维度提出具有代表性的问题。
模型评估方法:
模型推理作为模型投产的最后一公里,需要确保模型精度的同时追求极致的推理性能。相比传统模型来说,大模型面临着更多的挑战。
当前优化模型最主要技术手段概括来说有以下三个层面:
推理加速框架:
经验:
教训:
下面是最近大模型实践过程中的一些文章:
实践出真知,以上是这段时间进行大模型实践的一点点总结,写的有一些主观和片面,后续会持续更新自己研究大模型获得的一些认知和实践经验。