训练你的大模型!低资源下的模型轻量化
随着ChatGPT的出圈,大型语言模型向我们展示了非凡的能力。它既可以很好的完成传统的自然语言任务,又有着传统小模型不具备的世界知识与推理能力,十分惊艳。尽管如此,大型语言模型巨大的参数量与训练资源的需求让许多研究者们望而却步。轻量化是解决该问题的一大手段,通过一系列方法降低模型训练时的资源要求,在可接受的性能损失范围内对模型进行训练与部署。在本文中,笔者将介绍一系列轻量化方法,可以将大模型的微调训练以及应用部署的资源要求降低到一般研究者可以接受的范围内。我们的介绍包括三个内容:模型轻量化微调,模型轻量化部署以及当前可用的模型轻量化资源。文章也同步发布在AI Box知乎专栏(知乎搜索 AI Box专栏),欢迎大家在知乎专栏的文章下方评论留言,交流探讨!
1、模型轻量化微调
轻量化微调的相关研究始于Bert时代。在早期的预训练-微调范式中,对每一个下游任务的微调适配都需要训练所有的模型参数,带来了相当大的硬件资源负担。而轻量化微调则着眼于解决这一问题,通过一系列方法微调整个模型的少部分参数,并使得模型能够在下游任务上有接近全参数微调的性能。在大模型飞速发展的今天,模型的参数量相较于Bert时代的模型多出了成百上千倍,想要在一般的硬件条件下去对大模型做个性化的微调,轻量化是几乎唯一的选择。在下面的部分,我们将介绍在小模型上已经被广泛运用,同时在大模型上已初见成效的一些经典轻量化微调方法。
Adapter (Parameter-Efficient Transfer Learning for NLP Adapter - ICML 2019)
Adapter是早期的一个相当简单且有效的轻量化微调方法,它遵循着“冻结模型的绝大部分参数,只训练少数参数”的思想来进行轻量化微调。Adapter类方法可以通过在预训练模型的不同层之间添加小的Adapters来实现微调,而不需要微调整个模型。在原论文中,作者采用Bert作为实验模型,其总体结构如下:
可以看到,每个Transformer层的Attention模块以及两个全连接层后都被增加了一个Adapter结构。Adapter结构采用了上映射(up-project)和下映射(down-project)的结构。对于一个固定维度的特征,Adapter会先通过down-project层将其映射到较小的结构,经过一个全连接层后再通过up-project层将特征映射到原来维度,从而减少了参数量。在Bert模型上,采用Adapter方法只需要训练原模型0.5%-8%的参数量,在不同任务上只需要保存少量Adapter结构的参数,从而节省了存储空间。除此之外,Adapter采用了残差连接的结构,通过设计合适的初始化参数就可以使得Adapter能够在训练初期表现良好。作者在GLUE测试集上对模型进行了测试,并取得了与全参数微调相近的结果。
Prefix-tuning(Optimizing Continuous Prompts for Generation - ACL 2021)
Prefix-tuning是一种基于前缀的轻量化微调方法,其思想来源于GPT-3中的prompting方法。在GPT3中,通过设计合适的前缀,就可以激发模型生成任务相关的输出,从而不需要任何训练即可适配到下游任务上。而在小模型上,模型不具备足够强大的In-context learning的能力,因此需要保证前缀是”可训练“的,来适配下游任务。即使如此,相对于全参数微调,只对前缀进行训练也可以节省大量的参数量。在本篇文章中,作者采用连续的可训练向量作为输入前缀,在微调时不训练模型参数,只训练这些前缀向量,并提示模型生成正确的输出:
在微调时,Prefix-tuning与全参数微调的训练目标与训练流程均保持一致。为了增加前缀向量在训练时的稳定性,作者采用了重参数化的方法,通过一个若干较小的前缀向量经过单层MLP生成正常规模的前缀向量。在Table-To-Text与Summarization,Prefix-tuning方法均取得了相当不错的效果。
LoRA(Low-Rank Adaptation of Large Language Models ICLR 2022)
LoRA是一种基于低秩的轻量化微调方法,也是目前在大模型领域应用最多的方法。相较于Adapter,LoRA不需要对模型添加额外的参数化结构。而相较于Prefix-tuning,LoRA不需要对输入端进行修改。取而代之的是,LoRA通过对模型参数的优化量进行了低秩近似。其理论依据在于:神经网络通常包含大量的全连接层,并通过执行矩阵乘法来完成前向传播。这些全连接层中的参数矩阵往往是满秩的,对模型的训练过程其实就是在学习优化这些参数矩阵。而预训练模型中的参数矩阵往往存在一个”本征维度“,即我们学习到的这些参数的优化量可以是低秩的,被映射到一个低维空间下也能保持很好的性能。在这样的前提下,我们可以只对参数矩阵中低秩的部分进行优化,并将整体的训练过程表示成一个低秩矩阵的优化过程:
前向传播过程可以表示如下:
A、B是两个低维的矩阵,相较于原本的参数规模,待优化的参数规模被大大减小。整体的流程如下所示:
在RoBERTa,DeBERTa,GPT-2与GPT-3上,LoRA在只训练极少数参数的情况下取得了接近全参数微调的结果,证明了该方法的有效性。
2、模型轻量化部署
模型轻量化部署着眼于对训练好的模型进行轻量化,优化其推理时的计算资源消耗。传统的轻量化部署方法包含量化,蒸馏,剪枝等。目前在大模型上最好的轻量化部署方法是量化,接下来我们将介绍目前最常用的量化方法-GPTQ。
GPTQ: Accurate Post-Training Quantization for Generative Pre-trained Transformers - ICLR 2023
GPTQ是当前最常用的生成式大模型量化方法。它是基于Optimal Brain Quanization (OBQ) 的逐层量化方法的改进。量化的优化目标在于找到一个量化后的参数矩阵,使得与原精度矩阵的输出误差最小。为了对量化过程进行加速,使对大模型的量化时间优化到可容忍范围内,GPTQ优化了此前的基于贪心的量化顺序(即逐个寻找影响误差最小的参数进行量化),而是发现了随机的量化顺序在大模型上也能有相似的效果,并取得了非常大的提升。对量化数值的精确度问题,GPTQ采用了Cholesky重构的方法进行了缓解。基于一系列的技术上的改进,GPTQ可以在4比特与3比特的量化下在一定程度上保持模型的性能,较原本的量化方法取得了很大的领先。
3、当前可用的模型轻量化资源
Bitsandbytes
https://github.com/TimDettmers/bitsandbytes
Bitandbytes是一个轻量化的CUDA封装库,特别针对8比特优化器、8比特矩阵乘法和量化函数来设计。它同时支持大模型的8比特训练与量化后部署,能够快速在大模型上部署,并有效的降低训练与推理时的显存占用。
PEFT
https://github.com/huggingface/peft
PEFT是专门针对各类轻量化微调方法设计的轻量化训练库,包含了Adapter,LoRA以及prefix-tuning等各类轻量化微调方法,并能够有效的适配huggingface模型,可以非常轻松的部署到模型的训练过程中,完成大模型的轻量化训练。
Accelerate
https://github.com/huggingface/accelerate
Accelerate是一个用于深度学习加速的库,它可以在多种硬件上自动化地并行化和优化训练和推理过程,提供了一组简单易用的API,可以自动对模型训练进行并行化和优化,支持半精度部署于训练,从而有效地提高模型的训练和推理速度。
LLaMA-Adapters
https://github.com/AGI-Edgerunners/LLM-Adapters
LLaMA-Adapters是轻量化微调方法在开源的大型语言模型LLaMA上的实现,基于PEFT在LLaMA上实践了多个轻量化微调方法,在若干个数学数据集上进行了测试并证明了这些方法的有效性。
Alpaca-CoT
https://github.com/PhoebusSi/Alpaca-CoT
与LLaMA-Adapters类似,但提供了更加多样化的指令数据以及微调后的指令权重。
GPTQ-for-LLaMa
https://github.com/qwopqwop200/GPTQ-for-LLaMa
GPTQ量化算法在LLaMA模型上的应用,包含了不同量化算法在LLaMA上的实现以及在wikitext2数据集上的测试比较
参考文献:
[1] Parameter-Efficient Transfer Learning for NLP Adapter
[2] Optimizing Continuous Prompts for Generation
[3] Low-Rank Adaptation of Large Language Models
[4] GPTQ: Accurate Post-Training Quantization for Generative Pre-trained Transformers
[5] PEFT: State-of-the-art Parameter-Efficient Fine-Tuning methods
[6] 8-bit Optimizers via Block-wise Quantization
[7] Accelerate: Training and inference at scale made simple, efficient and adaptable.
[8] LLM-Adapters: An Adapter Family for Parameter-Efficient Fine-Tuning of Large Language Models
更多推荐
浅探大型语言模型在信息检索中的应用
ICLR 2023 | UniKGQA: PLM+KG新架构,同时适配检索和推理!