当前位置 新财界 网贷 正文

不是大模型全局微调不起,只是LoRA更有性价比,教程已经准备好了

增加数据量和模型的参数量是公认的提升神经网络性能最直接的方法。目前主流的大模型的参数量已扩展至千亿级别,「大模型」越来越大的趋势还将愈演愈烈。

这种趋势带来了多方面的算力挑战。想要微调参数量达千亿级别的大语言模型,不仅训练时间长,还需占用大量高性能的内存资源。

为了让大模型微调的成本「打下来」,微软的研究人员开发了低秩自适应(LoRA)技术。LoRA 的精妙之处在于,它相当于在原有大模型的基础上增加了一个可拆卸的插件,模型主体保持不变。LoRA 随插随用,轻巧方便。

对于高效微调出一个定制版的大语言模型来说,LoRA 是最为广泛运用的方法之一,同时也是最有效的方法之一。

如果你对开源 LLM 感兴趣,LoRA 是值得学习的基本技术,不容错过。

来自威斯康星大学麦迪逊分校的数据科学教授
Sebastian Raschka 也对 LoRA
进行了全方位探索。在机器学习领域探索多年,他非常热衷于拆解复杂的技术概念。在经历数百次实验后,Sebastian Raschka 总结出了使用
LoRA 微调大模型的经验,并发布在 Ahead of AI 杂志上。

图片

在保留作者原意的基础上,机器之心对这篇文章进行了编译:

上个月,我分享了一篇有关
LoRA 实验的文章,主要基于我和同事在 Lightning AI 共同维护的开源 Lit-GPT
库,讨论了我从实验中得出的主要经验和教训。此外,我还将解答一些与 LoRA
技术相关的常见问题。如果你对于微调定制化的大语言模型感兴趣,我希望这些见解能够帮助你快速起步。

简而言之,我在这篇文章中讨论的主要要点包含:

  1. 虽然 LLM 训练(或者说在 GPU 上训练出的所有模型)有着不可避免的随机性,但多 lun 训练的结果仍非常一致。

  2. 如果受 GPU 内存的限制,QLoRA 提供了一种高性价比的折衷方案。它以运行时间增长39% 的代价,节省了33% 的内存。

  3. 在微调 LLM 时,优化器的选择不是影响结果的主要因素。无论是 AdamW、具有调度器 scheduler 的 SGD ,还是具有 scheduler 的 AdamW,对结果的影响都微乎其微。

  4. 虽然 Adam 经常被认为是需要大量内存的优化器,因为它为每个模型参数引入了两个新参数,但这并不会显著影响 LLM 的峰值内存需求。这是因为大部分内存将被分配用于大型矩阵的乘法,而不是用来保留额外的参数。

  5. 对于静态数据集,像多轮训练中多次迭代可能效果不佳。这通常会导致过拟和,使训练结果恶化。

  6. 如果要结合 LoRA,确保它在所有层上应用,而不仅仅是 Key 和 Value 矩阵中,这样才能最大限度地提升模型的性能。

  7. 调整 LoRA rank 和选择合适的 α 值至关重要。提供一个小技巧,试试把 α 值设置成 rank 值的两倍。

  8. 14GB RAM 的单个 GPU 能够在几个小时内高效地微调参数规模达70亿的大模型。对于静态数据集,想要让 LLM 强化成「全能选手」,在所有基线任务中都表现优异是不可能完成的。想要解决这个问题需要多样化的数据源,或者使用 LoRA 以外的技术。

另外,我将回答与 LoRA 有关的十个常见问题。

如果读者有兴趣,我会再写一篇对 LoRA 更全面的介绍,包含从头开始实现 LoRA 的详细代码。今天本篇文章主要分享的是 LoRA 使用中的关键问题。在正式开始之前,我们先来补充一点基础知识。

LoRA 简介

由于 GPU 内存的限制,在训练过程中更新模型权重成本高昂。

例如,假设我们有一个7B 参数的语言模型,用一个权重矩阵 W 表示。在反向传播期间,模型需要学习一个 ΔW 矩阵,旨在更新原始权重,让损失函数值最小。

权重更新如下:W_updated = W + ΔW。

如果权重矩阵 W 包含7B 个参数,则权重更新矩阵 ΔW 也包含7B 个参数,计算矩阵 ΔW 非常耗费计算和内存。

由 Edward Hu 等人提出的 LoRA 将权重变化的部分 ΔW 分解为低秩表示。确切地说,它不需要显示计算 ΔW。相反,LoRA 在训练期间学习 ΔW 的分解表示,如下图所示,这就是 LoRA 节省计算资源的奥秘。

图片

如上所示,ΔW 的分解意味着我们需要用两个较小的 LoRA 矩阵 A 和 B 来表示较大的矩阵 ΔW。如果 A 的行数与 ΔW 相同,B 的列数与 ΔW 相同,我们可以将以上的分解记为 ΔW = AB。(AB 是矩阵 A 和 B 之间的矩阵乘法结果。)

这种方法节省了多少内存呢?还需要取决于秩
r,秩 r 是一个超参数。例如,如果 ΔW 有10,000行和20,000列,则需存储200,000,000个参数。如果我们选择 r=8的 A
和 B,则 A 有10,000行和8列,B
有8行和20,000列,即10,000×8+8×20,000=240,000个参数,比200,000,000个参数少约830倍。

当然,A
和 B 无法捕捉到 ΔW 涵盖的所有信息,但这是 LoRA 的设计所决定的。在使用 LoRA 时,我们假设模型 W
是一个具有全秩的大矩阵,以收集预训练数据集中的所有知识。当我们微调 LLM 时,不需要更新所有权重,只需要更新比 ΔW
更少的权重来捕捉核心信息,低秩更新就是这么通过 AB 矩阵实现的。

LoRA 的一致性

虽然 LLM,或者说在 GPU 上被训练的模型的随机性不可避免,但是采用 LoRA 进行多次实验,LLM 最终的基准结果在不同测试集中都表现出了惊人的一致性。对于进行其他比较研究,这是一个很好的基础。

图片

请注意,这些结果是在默认设置下,使用较小的值 r=8获得的。实验细节可以在我的另一篇文章中找到。

文章链接: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 的潜在优势。

Adam vs SGD

Adam 和 AdamW 优化器在深度学习中很受欢迎。如果我们正在训练一个7B 参数的模型,那使用 Adam 就能够在训练的过程中跟踪额外的14B 参数,相当于在其他条件不变的情况下,模型的参数量翻了一番。

SGD 不能在训练过程中跟踪附加的参数,所以相比于 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模型的所有6,738,415,616个参数,只有4,194,304个可训练的 LoRA 参数。

只看数字,4,194,304个参数可能还是很多,但是其实这么多参数仅占用4,194,304×2×16位
=134.22兆位 =16.78兆字节。(我们观察到了存在0.03Gb =30Mb
的差异,这是由于在存储和复制优化器状态时,存在额外的开销。)2代表 Adam 存储的额外参数的数量,而16位指的是模型权重的默认精度。

联系我们

联系我们

在线咨询: QQ交谈

邮箱: 89934208@qq.com

工作时间:周一至周日,9:00-24:00,有问题联系值班客服
关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部