引言
今天给大家分享的这篇文章是关于LoRA微调大模型实操技巧,讨论了从实验中得出的主要经验和教训;此外,本文将解答一些与LoRA技术相关的常见问题。如果你对于微调定制化的大语言模型感兴趣,希望这些见解能够帮助你快速起步。
LoRA背景
增加数据量和模型的参数量是公认的提升神经网络性能最直接的方法。目前主流的大模型的参数量已扩展至千亿级别,「大模型」越来越大的趋势还将愈演愈烈。
这种趋势带来了多方面的算力挑战。想要微调参数量达千亿级别的大语言模型,不仅训练时间长,还需占用大量高性能的内存资源。
为了让大模型微调的成本「打下来」,微软的研究人员开发了低秩自适应(LoRA)技术。LoRA 的精妙之处在于,它相当于在原有大模型的基础上增加了一个可拆卸的插件,模型主体保持不变。LoRA 随插随用,轻巧方便。
对于高效微调出一个定制版的大语言模型来说,LoRA 是最为广泛运用的方法之一,同时也是最有效的方法之一。如果你对开源 LLM 感兴趣,LoRA 是值得学习的基本技术,不容错过。
LoRA简介
由于GPU内存的限制,在训练过程中更新整个模型权重成本很高。例如,假设有一个7B参数的语言模型,用一个权重矩阵W表示。在反向传播期间,模型需要学习一个ΔW矩阵,旨在更新原始权重,让损失函数值最小。权重更新如下:
如果权重矩阵包含7B个参数,则权重更新矩阵也包含7B个参数,计算矩阵非常耗费计算和内存。
由Edward Hu等人提出的LoRA将权重变化的部分分解为低秩表示。确切地说,它不需要显示计算。相反,LoRA在训练期间学习的分解表示,如下图所示,这就是LoRA节省计算资源的奥秘。如上所示,的分解意味着我们需要用两个较小的LoRA矩阵A和B来表示较大的矩阵。如果A的行数与相同,B的列数与相同,可以将以上的分解记为。(AB是矩阵A和B之间的矩阵乘法结果。)
这种方法节省了多少内存呢?还需要取决于秩r,秩r是一个超参数。例如,如果有10000行20000列,则需存储200000000个参数。如果我们选择的A和B,则A有10000行和8列,B有8行和20000列,即 个参数,比200000000个参数少约830 倍。
当然,A和B无法捕捉到涵盖的所有信息,但这是LoRA的设计所决定的。在使用LoRA时,我们假设模型是一个具有全秩的大矩阵,以收集预训练数据集中的所有知识。当我们微调LLM 时,不需要更新所有权重,只需要更新比更少的权重来捕捉核心信息,低秩更新就是这么通过矩阵实现的。
LoRA一致性
虽然LLM在GPU上训练的随机性不可避免,但是采用LoRA进行多次实验,LLM最终的基准结果在不同测试集中都表现出了惊人的一致性。对于进行其他比较研究,这是一个很好的基础。注,以上这些结果是在默认设置下,使用较小的值获得的。实验详情可见论文:https://lightning.ai/pages/community/lora-insights/
QLoRA计算
QLoRA 是由 Tim Dettmers 等人提出的量化 LoRA 的缩写。QLoRA 是一种在微调过程中进一步减少内存占用的技术。在反向传播过程中,QLoRA 将预训练的权重量化为 4-bit,并使用分页优化器来处理内存峰值。
使用LoRA时可以节省33%的GPU内存。然而,由于QLoRA中预训练模型权重的额外量化和去量化,训练时间增加了39%。
默认LoRA具有16bit浮点精度:
- 训练时长:1.85 小时
- 内存占用:21.33GB
具有4位正常浮点数的 QLoRA
- 训练时长为:2.79h
- 内存占用为:14.18GB
此外,可以发现模型的性能几乎不受影响,如下图所示。这说明QLoRA可以作为 LoRA 训练的替代方案,更进一步解决常见GPU内存瓶颈问题。
学习率调度器
学习率调度器会在整个训练过程中降低学习率,从而优化模型的收敛程度,避免loss值过大。
余弦退火(Cosine annealing)是一种遵循余弦曲线调整学习率的调度器。它以较高的学习率作为起点,然后平滑下降,以类似余弦的模式逐渐接近0。一种常见的余弦退火变体是半周期变体,在训练过程中只完成半个余弦周期,如下图所示。实验中,在LoRA微调脚本中添加了一个余弦退火调度器,它显著地提高了SGD的性能。但是它对Adam和AdamW优化器的增益较小,添加之后几乎没有什么变化。接下来,将讨论 SGD 相对于 Adam 的潜在优势。
SGD VS Adam
Adam 和 AdamW 优化器在深度学习中很受欢迎。尽管在处理大型模型时它们非常占用内存,原因是Adam优化器为每个模型参数维护两个移动平均值:梯度的一阶矩(均值)和梯度的二阶矩(非中心方差)。换句话说,Adam优化器在内存中为每个模型参数存储两个附加值,即如果我们正在训练一个7B参数的模型,那使用Adam就能够在训练的过程中跟踪额外的14B参数,相当于在其他条件不变的情况下,模型的参数量翻了一番。
SGD 优化器在训练期间不需要存储任何额外参数,所以在训练LLM时,相比于Adam,SGD在峰值内存方面有什么优势呢?
在实验中,使用AdamW和LoRA(默认设置 r=8)训练一个7B参数的Llama2模型需要14.18GB的GPU内存。用SGD训练同一模型需要14.15GB 的GPU内存。相比于AdamW,SGD只节省了0.03GB的内存,作用微乎其微。
为什么只节省了这么一点内存呢?这是因为使用LoRA时,LoRA已经大大降低了模型的参数量。例如,如果r=8,在7B的Llama2模型的所有 6738415616个参数,只有4194304个可训练的LoRA参数。
只看数字,4194304 个参数可能还是很多,但是其实这么多参数仅占用 4194304×2×16bit=134.22mbit = 16.78mbyte。(观察到存在0.03 Gb = 30 Mb 的差异,这是由于在存储和复制优化器状态时,存在额外的开销。)其中:2代表Adam存储的额外参数的数量,而16位指的是模型权重的默认精度。如果把LoRA矩阵的r从8拓展到256,那么SGD相比AdamW的优势就会显现:
- 使用 AdamW 将占用内存 17.86 GB
- 使用 SGD 将占用 14.46 GB
因此,当矩阵规模扩大时,SGD 节省出的内存将发挥重要作用。由于SGD不需要存储额外的优化器参数,因此在处理大模型时,SGD相比Adam等其他优化器可以节省更多的内存。这对于内存有限的训练任务来说是非常重要的优势。
迭代训练
在传统的深度学习中,我们经常对训练集进行多次迭代,每次迭代称为一个epoch。例如,在训练卷积神经网络时,通常会运行数百个epoch。那么,多轮迭代训练对于指令微调也有效果吗?
答案是否定的,当我将数据量为 50k 的 Alpaca 示例指令微调数据集的迭代次数增加一倍,模型的性能下降了
因此,可以得出结论,多轮迭代可能不利于指令微调。在1k的示例LIMA 指令微调集中也观察到了同样的状况。模型性能的下降可能是由过拟合造成的,具体原因仍需进一步探索。
在更多层中使用 LoRA
下表显示了 LoRA 仅对选定矩阵(即每个 Transformer 中的 Key 和 Value 矩阵)起效的实验。此外,我们还可以在查询权重矩阵、投影层、多头注意力模块之间的其他线性层以及输出层启用 LoRA。如果在这些附加层上加入LoRA,那么对于7B的Llama2 模型,可训练参数的数量将从4194304增加到20277248,增加了五倍。在更多层应用 LoRA,能够显著提高模型性能,但也对内存空间的需求量更高。
在实验中,只对以下两种情况进行了探索:
- 1、仅启用查询和权重矩阵的 LoRA
- 2、启用所有层的 LoRA
在更多层的组合中使用 LoRA 会产生何种效果,值得深入研究。如果能知道在投影层使用 LoRA 对训练结果是否有益,那么我们就可以更好地优化模型,并提高其性能。
平衡LoRA超参数:r和Alpha
正如提出 LoRA 的论文中所述,LoRA 引入了一个额外的缩放系数。这个系数用于在前向传播过程中将 LoRA 权重应用于预训练之中。缩放涉及之前讨论过的秩参数 r,以及另一个超参数 α(alpha),其应用如下:
scaling = alpha / r
weight += (lora_B @ lora_A) * scaling
正如上图中的公式所示,LoRA 权重的值越大,影响就越大。
在之前的实验中,采用的参数是 r=8,alpha=16,这导致了2倍的扩展。在用LoRA为大模型减重时,将alpha设置为r的两倍是一种常见的经验法则。但我很好奇这条规则对于较大的r值是否仍然适用。换句话说,“alpha = 2×rank”似乎确实是一个最佳点。然而,在模型和数据集的这种特定组合中,其中 r=256 且 alpha=128(0.5 倍缩放)性能甚至更好。以上展示了r=32, r=64, r=128, and r=512的实验结果,不过 r=256 时,效果的确最佳。事实上,选择alpha=2r也确实提供了最优结果。
单GPU训练7B模型
LoRA 允许我们在单个 GPU 上微调 7B 参数规模的大语言模型。在这个特定情况下,采用最佳设置过的QLoRA(r=256,alpha=512),使用AdamW 优化器处理17.86 GB(50k 训练样例)的数据在A100上大约需要3个小时(此处为 Alpaca 数据集)。
LoRA使用QA
QA-1 数据集有多重要?
数据集至关重要。正如LIMA论文的标题所说:对于对齐来说,少即是多,虽然LIMA的数据量少于Alpaca,但根据LIMA微调出的65B Llama 模型优于Alpaca的结果。采用同样的配置 (r=256, alpha=512) ,在LIMA上获得了与数据量级是其50倍大的Alpaca类似的模型表现。
QA-2 LoRA是否适用于域自适应
对于这个问题,目前还没有一个明确的答案。根据经验,知识通常是从预训练数据集中提取的。通常情况下,语言模型通常会从预训练数据集中吸收知识,而指令微调的作用主要是帮助LLM更好地遵循指令。
既然算力紧张是限制大语言模型训练的关键因素,LoRA也可以被用于在特定领域的专用数据集,进一步预训练现有的预训练 LLM。
另外,值得注意的是,我的实验中包括两个算术基准测试。在这两个基准测试中,使用LoRA进行微调的模型表现明显比预训练的基础模型差。推测这是由于Alpaca数据集没有缺少相应的算术示例,导致模型「忘记了」算术知识。我们还需要进一步的研究来确定模型是「忘记」了算术知识,还是它对相应指令停止了响应。然而,在这里可以得出一条结论:「在微调 LLM 时,让数据集包含我们所关心的每个任务的示例是一个好主意。」
QA-3 如何确定最佳r值?
最佳r值的确定,需要根据每个 LLM 和每个数据集的具体情况,具体问题具体分析。推测r值过大将导致过拟和,而r值过小,模型可能无法捕捉数据集中多样化的任务。
推测数据集中的任务类型越多,所需r值就越大。例如,如果仅需要模型执行基本的两位数算术运算,那么一个很小的r值可能就已经满足需要了。然而,这只是假设,需要进一步的研究来验证。
QA-4 LoRA是否要在所有层启用?
目前,只对启用查询和权重矩阵的LoRA,以及启用所有层的LoRA,这两种设置进行了探索。在更多层的组合中使用LoRA会产生何种效果,值得深入研究。
如果能知道在投影层使用LoRA对训练结果是否有益,那么我们就可以更好地优化模型,并提高其性能。如果我们考虑各种设置 (lora_query, lora_key, lora_value, lora_projection, lora_mlp, lora_head),就有 64 种组合可供探索。
QA-5 如何避免过拟和?
一般来说,较大的r更可能导致过拟合,因为r决定着可训练参数的数量。如果模型存在过拟合问题,首先要考虑降低 r 值或增加数据集大小。此外,可以尝试增加AdamW或SGD优化器的权重衰减率,或者增加LoRA层的dropout值。
在实验中还没有探索过 LoRA 的 dropout 参数(我使用了 0.05 的固定 dropout 率),LoRA 的 dropout 参数也是一个有研究价值的问题。
QA-6 还有其它优化器选择吗?
今年五月发布的Sophia值得尝试,Sophia是一种用于语言模型预训练的可拓展的随机二阶优化器。根据以下这篇论文:《Sophia: A Scalable Stochastic Second-order Optimizer for Language Model Pre-training》,与 Adam 相比,Sophia 的速度快两倍,还能获得更优的性能。
简而言之,Sophia和Adam一样,都通过梯度曲率而不是梯度方差来实现归一化。论文链接:https://arxiv.org/abs/2305.14342
QA-7 影响内存其它因素
除了精度和量化设置、模型大小、batch size 和可训练 LoRA 参数数量之外,数据集也会影响内存使用。
Llama2的块大小为4048个token,这代表着Llama可以一次处理包含4048个token的序列。如果对后来的token加上掩码,训练序列就将变短,可以节省大量的内存。例如 Alpaca 数据集相对较小,最长的序列长度为1304个token。当尝试使用最长序列长度达2048个token的其它数据集时,内存使用量会从17.86GB飙升至26.96GB。
QA-8 对比FF、RLHF,LoRA的优势
没有进行RLHF实验,但尝试了全微调。全微调至少需要2个GPU,每个GPU占用36.66GB,花费了3.5个小时才完成微调。然而,基线测试结果不好,可能是过拟合或次超优参数导致的。
QA-9 LoRA权重可以组合吗?
答案是肯定的。在训练期间,我们将 LoRA 权重和预训练权重分开,并在每次前向传播时加入。
假设在现实世界中,存在一个具有多组LoRA权重的应用程序,每组权重对应着一个应用的用户,那么单独储存这些权重,用来节省磁盘空间是很有意义的。同时,在训练后也可以合并预训练权重与 LoRA 权重,以创建一个单一模型。这样,我们就不必在每次前向传递中应用 LoRA 权重。
weight += (lora_B @ lora_A) * scaling
我们可以采用如上所示的方法更新权重,并保存合并的权重。同样,我们可以继续添加很多个 LoRA 权重集:
weight += (lora_B_set1 @ lora_A_set1) * scaling_set1
weight += (lora_B_set2 @ lora_A_set2) * scaling_set2
weight += (lora_B_set3 @ lora_A_set3) * scaling_set3
...
通过 Lit-GPT 中提供的 scripts/merge_lora.py 脚本已经可以实现。脚本链接:https://github.com/Lightning-AI/lit-gpt/blob/main
QA-10 逐层最优秩自适应表现如何?
为了简单起见,在深度神经网络中我们通常将为每层设置相同的学习率。学习率是我们需要优化的超参数,更进一步,我们可以为每一层选择不同的学习率(在 PyTorch 中,这不是非常复杂的事)。
然而在实践中很少这样做,因为这种方法增加了额外的成本,并且在深度神经网络中还有很多其他参数可调。类似于为不同层选择不同的学习率,我们也可以为不同层选择不同的 LoRA r 值。我还没有动手尝试,但有一篇详细介绍这种方法的文献:《LLM Optimization: Layer-wise Optimal Rank Adaptation (LORA)》。理论上,这种方法听起来很有希望,为优化超参数提供了大量的拓展空间。
如何学习大模型 AI ?
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
第一阶段(10天):初阶应用
该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。
- 大模型 AI 能干什么?
- 大模型是怎样获得「智能」的?
- 用好 AI 的核心心法
- 大模型应用业务架构
- 大模型应用技术架构
- 代码示例:向 GPT-3.5 灌入新知识
- 提示工程的意义和核心思想
- Prompt 典型构成
- 指令调优方法论
- 思维链和思维树
- Prompt 攻击和防范
- …
第二阶段(30天):高阶应用
该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。
- 为什么要做 RAG
- 搭建一个简单的 ChatPDF
- 检索的基础概念
- 什么是向量表示(Embeddings)
- 向量数据库与向量检索
- 基于向量检索的 RAG
- 搭建 RAG 系统的扩展知识
- 混合检索与 RAG-Fusion 简介
- 向量模型本地部署
- …
第三阶段(30天):模型训练
恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。
到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?
- 为什么要做 RAG
- 什么是模型
- 什么是模型训练
- 求解器 & 损失函数简介
- 小实验2:手写一个简单的神经网络并训练它
- 什么是训练/预训练/微调/轻量化微调
- Transformer结构简介
- 轻量化微调
- 实验数据集的构建
- …
第四阶段(20天):商业闭环
对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。
- 硬件选型
- 带你了解全球大模型
- 使用国产大模型服务
- 搭建 OpenAI 代理
- 热身:基于阿里云 PAI 部署 Stable Diffusion
- 在本地计算机运行大模型
- 大模型的私有化部署
- 基于 vLLM 部署大模型
- 案例:如何优雅地在阿里云私有部署开源大模型
- 部署一套开源 LLM 项目
- 内容安全
- 互联网信息服务算法备案
- …
学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。
如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。
这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费
】
![](https://img-blog.csdnimg.cn/img_convert/0dc35641cd2d85e39db6e8cb368fa5cb.png)