一、LORA[2021]

论文:《LORA: Low-Rank Adaptation of Large Language Models》

  1. 自然语言处理中的许多应用依赖于将一个大型的 pre-trained 语言模型适配到多个下游任务中。这种适配通常通过微调来完成,它会更新 pre-trained 模型中的所有参数。微调的一个主要缺点是,新模型的参数数量和原始模型一样多。随着每几个月就会训练出更大的模型,这对于 GPT-2RoBERTa large 来说只是“不方便”,而对于拥有 175B 可训练参数的 GPT-3 来说则成为了一个关键的部署挑战。

    许多研究试图通过仅适配部分参数、或学习新的外部模块来缓解这一问题。这样,我们只需要为每个任务存储和加载一小部分 task-specific 的参数,再加上存储和加载 pretrained 模型,从而在部署时极大地提升了运行效率。然而,现有的技术通常通过扩展模型深度来引入 inference latency 、或减少模型可用的序列长度。更重要的是,这些方法通常无法匹配 fine-tuning baselines ,在效率和模型质量之间存在权衡。

    我们受到 《Measuring the Intrinsic Dimension of Objective Landscapes》《Intrinsic Dimensionality Explains the Effectiveness of Language Model Fine-Tuning》的启发,它们表明:学到的 over-parametrized 的模型实际上处于 low intrinsic dimension 上。我们假设模型适配过程中的 weights’ change也具有低的 "intrinsic rank",这导致了我们提出的低秩适配(Low-Rank Adaptation: LORA )方法。如 Figure 1 所示,LORA 允许我们通过优化适配过程中 dense layers’ changerank decomposition 矩阵,来间接地训练神经网络中的某些dense layers ,同时保持 pre-trained weights 固定。以 GPT-3 175B 为例,我们展示即使 full rank (即 Figure 1 中的 d )高达 12288 ,一个非常低的秩(即 Figure 1 中的 r 可以是 12 )也已足够,这使得 LORA 在存储和计算上都非常高效。

    LORA 具有几个关键优势:

    • 一个 pre-trained 模型可以被共享,并用于构建许多不同任务的小的 LORA 模块。我们可以冻结 shared model ,并通过替换Figure 1 中的矩阵 AB 来有效地切换任务,从而显著减少存储需求和切换任务的开销。

    • 当使用自适应优化器时,LORA 使训练更高效,最多可将硬件门槛降低 3 倍,因为我们不需要计算或维护大多数参数的梯度或 optimizer states 。相反,我们只优化被注入的小得多的低秩矩阵。

    • 我们简单的线性设计允许我们在部署时将 trainable 矩阵与固定权重合并,通过构造,与 fully fine-tuned model 相比不会引入任何 inference latency

    • LORA 与许多以前的方法正交,可以与其中许多方法(如,prefix-tuning )组合使用。我们在附录 E 中给出了一个示例。

  2. 术语和约定:我们频繁引用 Transformer 架构并使用其维度的传统术语:

    • 我们把 Transformer 层的输入和输出维度大小称为 dmodel

    • 我们用 Wq,Wk,Wv,Wo 分别表示自注意力模块中的 query/key/value/output 投影矩阵。

    • 我们用 WW0 表示 pre-trained 权重矩阵,ΔW 表示适配过程中的累积梯度更新(accumulated gradient update )。

    • 我们用 r 表示 LORA 模块的秩(rank)。

    • 我们遵循 TransformerGPT-3 设置的约定,使用 Adam 优化器,使用 TransformerMLP 前馈网络维度为 dffn=4×dmodel

  3. 相关工作:

    • Transformer 语言模型:Transformer 是一个 sequence-to-sequence 的架构,它大量使用了自注意力。GPT-1 将其应用于自回归语言建模,使用 Transformer encoders 的堆叠。自那时起,基于 Transformer 的语言模型在 NLP 中占据主导地位,在许多任务上实现了 SOTABERTGPT-2 代表了一个新范式:两者都是在大量文本上预训练的大型 Transformer 语言模型,通过在通用领域数据上预训练之后再在任务特定数据上的微调,这相比直接在任务特定数据上训练可以获得显著的性能提升。训练更大的 Transformer 通常会导致更好的性能,这仍然是一个活跃的研究方向。GPT-3 是迄今为止训练的最大的单个Transformer 语言模型,拥有 175B 参数。

    • Prompt Engineering and Fine-Tuning:尽管 GPT-3 175B 可以仅通过几个额外的训练样本来适配其行为,但结果高度依赖于input prompt 。这需要一种经验丰富的 prompt composingprompt formatting 艺术,从而最大化模型在期望任务上的表现,这称为 prompt engineeringprompt hacking

      微调对在通用领域上 pre-trained 的模型进行特定任务的重新训练(BERTGPT-1 )。人们提出了其变体,包括仅学习一部分参数(BERT ),但是实践者们通常会重新训练所有参数以最大化下游性能。然而,GPT-3 175B 的巨大规模使得通常的微调方式具有挑战,因为与预训练相同的内存占用造成了巨大的 checkpoint ,以及由此带来的高硬件门槛。

    • Parameter-Efficient Adaptation:许多人提出在神经网络的现有层之间插入 adapter layers《Parameter-Efficient Transfer Learning for NLP》《Learning multiple visual domains with residual adapters》《Exploring versatile generative language model via parameter-efficient transfer learning》)。我们的方法使用类似的 bottleneck 结构来对 weights update 施加低秩约束。关键的功能性的差异在于,我们学到的权重可以在推理期间与 main weights 合并,因此不会引入任何延迟,这与 adapter layers 的情况不同。

      adapter 的一个同期扩展是 COMPACTER《Compacter: Efficient low-rank hypercomplex adapter layers》),它本质上是参数化 adapter layers ,使用具有某些 predetermined 的权重共享方案的 Kronecker products 。类似地,将 LORA 与其他 tensor product-based 积的方法相结合,可能会潜在地改善其参数效率,我们留待未来研究。

      近期,许多研究提出优化 input word embeddings 以代替微调,这类似于 prompt engineering 的连续可微分推广。我们在实验部分包括与 《Prefix-Tuning: Optimizing Continuous Prompts for Generation》 的比较。然而,这类方法只能通过在 prompts 中使用更多 special tokens 来扩展,这会占用 task tokens 可用的序列长度。

    • Low-Rank Structures in Deep Learning:低秩结构在机器学习中很常见。许多机器学习问题具有某些内在的低秩结构。此外,众所周知,对于许多深度学习任务,特别是那些拥有大量过度参数化(over-parametrized )的神经网络,学到的神经网络在训练后会具有低秩特性(《Generalization guarantees for neural networks via harnessing the low-rank structure of the jacobian》)。

      一些先前的工作甚至在训练原始神经网络时明确地施加低秩约束;但是,据我们所知,这些工作都没有考虑 frozen modellow-rank update 以适配下游任务。在理论文献中,已经知道当底层的 concept class 具有某些低秩结构时,神经网络会优于其他经典学习方法,包括相应的(有限宽度)的 neural tangent kernels《How adversarial training performs robustdeep learning》 中的另一个理论结果表明:low-rank adaptations 对于对抗训练是有用的。总之,我们认为所提出的low-rank adaptation update 是有充分理论依据的。

1.1 问题描述

  1. 尽管我们的 proposaltraining objective 无关,但我们将语言建模作为用例。下面简要描述了语言建模问题,具体而言,是给定一个 task-specific prompt 的条件下,最大化条件概率。

  2. 假设我们有一个 pre-trained自回归语言模型 PΦ(yx),参数为 Φ。例如,PΦ(yx) 可以是一个通用的多任务学习器,如基于Transformer 架构的 GPT 。考虑将这个pre-trained模型适配到下游的条件文本生成(conditional text generation )任务,如摘要、机器阅读理解(machine reading comprehension: MRC )、natural language to SQL: NL2SQL 。每个下游任务由 context-target pairs 的训练数据集表示:Z={(xi,yi)}i=1,,N,其中 xiyi 都是 tokens 序列。例如:

    • NL2SQL 中,xi 是一个自然语言 queryyi 是相应的 SQL command

    • 对于摘要任务,xi 是文章内容,yi 是对应的摘要。

    full fine-tuning 期间,模型被初始化为 pre-trained 权重 Φ0,并通过反复地沿着梯度方向更新参数为 Φ0+ΔΦ,从而最大化 conditional language modeling objective

    (1)maxΦ(x,y)Zt=1|y|log(PΦ(ytx,y<t))

    其中:yt 表示第 t 个输出 tokeny<t 表示前 t1 个输出 tokenn 的序列。

    这里是对数似然(而不是损失函数),因此需要最大化。

    full fine-tuning 的一个主要缺点是,对于每个下游任务,我们学习一组不同的 parameter update ΔΦ,其维度 |ΔΦ| 等于 |Δ0|。因此,如果 pre-trained 模型很大(如 GPT-3 的参数数量 |Φ0| 约为 175B ),存储和部署许多独立的 fine-tuned models 实例可能具有挑战性,甚至不可行。

    在本文中,我们采用一种更加 parameter-efficient 的方法,其中 task-specific 的参数增量 ΔΦ=ΔΦ(Θ) 被一个规模更小的参数集合 Θ 进一步编码,其中 |Θ||Φ0|。寻找 ΔΦ 的任务因此变成优化 Θ

    (2)maxΘ(x,y)Zt=1|y|log(PΦ0+ΔΦ(Θ)(ytx,y<t))

    在后续章节中,我们提出使用 low-rank representation 来编码 ΔΦ,这在计算和内存方面都很高效。当 pre-trained 模型是 GPT-3 175B 时,可训练参数数量 |Θ| 可以低至 |Φ0|0.01%

1.2 现有解决方案够好吗

  1. 我们要解决的问题并非全新。自迁移学习出现以来,数十项工作已经试图使 model adaptation 更加参数高效和计算高效。参考 ”相关工作“ 部分,可以看到一些著名的相关工作。以 language modeling 为例,有两种优秀的策略用于高效的适配:添加 adapter layers 、或优化 input layer activations 。但是,这两种策略在大型的、以及延迟敏感的生产环境中都有局限性。

  2. Adapter Layers Introduce Inference Latencyadapters 有许多变体。我们关注 《Parameter-Efficient Transfer Learning for NLP》 的原始设计,每个 Transformer block 有两个 adapter layers ;以及 《Exploring versatile generative language model via parameter-efficient transfer learning》 的更近期设计,每个 block 仅有一个 adapter layer,但具有额外的 LayerNorm 。尽管可以通过裁剪 layers 、或利用多任务设置来减少整体延迟(《Adapterdrop: On the efficiency of adapters in transformers》《Adapter-fusion: Non-destructive task composition for transfer learning》),但是没有直接的方法可以绕过 adapter layers 中的额外计算。这似乎不是问题,因为 adapter layers 通过具有小的 bottleneck 维度来被设计为参数很少(有时是原始模型的 <1% ),这限制了它们可以添加的 FLOPs 。但是,大型神经网络依赖硬件并行性来保持低延迟,而 adapter layers 必须串行地处理。这在 batch size 通常为 1 的在线推理设置中会造成区别。在没有模型并行的通用场景中,例如在单 GPU 上运行 GPT-2 medium 的推理,即使使用了非常小的 bottleneck 维度,当使用 adapters 时,我们也看到显著的延迟增加(Table 1 )。

    当我们需要 shard 模型时,这个问题会变得更糟,如 《Megatron-lm: Training multi-billion parameter language models using model parallelism》《Gshard: Scaling giant models with conditional computation and automatic sharding》 所做,因为额外的深度需要更多的 synchronous GPU operations ,如 AllReduceBroadcast ,除非我们冗余地存储 adapter parameters 多次。

  3. Directly Optimizing the Prompt is Hardprefix tuning《Prefix-Tuning: Optimizing Continuous Prompts for Generation》)代表的另一方向面临着不同的挑战。我们观察到,prefix tuning 难以优化,其性能随着可训练参数的变化是非单调的,这确认了原论文中的类似观察。更本质的是,保留一部分序列长度用于适配,这必然减少了处理下游任务的可用序列长度;我们怀疑这使得与其他方法相比,tuning the prompt 的性能更差。我们将对任务性能的研究推迟到实验章节。

1.3 我们的方法

  1. 我们描述 LORA 的简单设计及其实际效益。这里概述的原则适用于深度学习模型中的任何 dense layers ,尽管我们的实验仅关注Transformer 语言模型中的某些权重。

1.3.1 Low-Rank-Parameterized Update Matrics

  1. 神经网络包含许多执行矩阵乘法的 dense layers 。这些层中的权重矩阵通常是满秩(full-rank)的。在适配特定任务时,《Intrinsic Dimensionality Explains the Effectiveness of Language Model Fine-Tuning》 显示 pre-trained 语言模型具有低的 "instrisic dimension",即使是随机投影到一个较小的子空间,也仍可进行有效学习。受此启发,我们假设 weight's updates 在适配过程中也具有低的 "intrinsic rank"。对于 pre-trained 权重矩阵 W0Rd×k ,我们通过使用低秩分解来约束其更新:

    (3)W0+ΔW=W0+BA

    其中:BRd×r,ARr×k,秩 rmin(d,k)

    在训练期间,W0 被冻结且不接收梯度更新,而 AB 包含可训练参数。注意 W0ΔW=BA 与相同的输入相乘,它们各自的输出向量逐元素相加。对 h=W0x ,我们的修改后的前向传播为:

    (4)h=W0x+ΔWx=W0x+BAx

    我们在 Figure 1 中展示重参数化(reparametrization )。我们对 A 使用随机高斯初始化、对 B 使用零初始化,因此开始时 ΔW=BA 为零。我们然后按 α/r 来缩放 ΔWx,其中 α是关于 r 的常量。当使用 Adam 优化时,调优 α 大致相当于调优学习率,如果我们适当地缩放了 initialization。因此,我们简单地将 α设置为我们尝试的第一个 r ,并不对其进行调优。这有助于减少我们改变 r 时的需要重新调优的超参数。

    这里 α 的含义是:根据 h=W0x+αr×ΔWx=W0x+αr×BAx 。因此,rα 都是超参数,α/r 的作用类似于学习率。

    作者在 r 上调优了一组超参数,并固定 α 为其中尝试的第一个 r 而不调优 α 。这是为了减少超参数调优的复杂性。

  2. A Generalization of Full Fine-tuning:更一般的微调形式允许 pre-trained parameters 的子集。进一步地,在适配期间 LORA不要求 accumulated gradient update 具有满秩。这意味着将 LORA 应用于所有权重矩阵并训练所有偏置,通过将 LORA 秩的 r 设置为 pre-trained 权重矩阵的秩,我们大致恢复 full fine-tuning 的表达能力。换句话说,随着我们增加可训练参数的数量,训练 LORA 大致收敛于训练原始模型;而 adapter-based 的方法收敛于 MLPprefix-based 的方法收敛于一个无法处理长输入序列的模型。

  3. No Additional Inference Latency:在生产中部署时,我们可以显式地计算并存储 W=W0+BA ,然后正常进行推理。请注意,W0BA 都属于 Rd×k 。当我们需要切换到另一个下游任务时,我们可以通过从 W 中减去 BA 来恢复 W0 ,然后再添加不同的 BA 。这是一个运算量很小的快速操作。关键是,与 fine-tuned 模型相比,这保证了我们不会引入任何额外的推理延迟。

    即:W+(BABA) 即可切换不同的下游任务。

1.3.2 Applying LORA To Transformer

  1. 原则上,我们可以将 LORA 应用于神经网络中的任何权重子集,从而减少可训练参数的数量。在 Transformer 架构中,在自注意力模块中有四个权重矩阵(Wq,Wk,Wv,Wo),在 MLP 模块中有两个权重矩阵。我们将 Wq (或 Wk,Wv)视为单个 dmodel×dmodel 的矩阵,即使输出维度通常被切片成多头注意力。为简单起见,我们的研究仅限于下游任务中适配注意力权重,并冻结 MLP 模块(所以在下游任务中不训练它们),这对简单性和参数效率都有好处。我们在后续章节中进一步研究适配 Transformer 中不同类型的注意力权重矩阵的效果。我们将 MLP 层、LayerNorm 层、以及偏置的实验研究留待未来工作。

  2. 实际效益和局限性:最显著的好处来自于内存和存储使用的减少。对于用 Adam 训练的大型 Transformer ,如果 rdmodel ,我们可以减少高达 2/3VRAM 使用,因为我们不需要存储 frozen parametersoptimizer states 。在 GPT-3 175B 上,我们将训练期间的 VRAM 消耗从 1.2TB 降低到 350GB 。 当 r=4 且仅适配 query 投影矩阵和 value 投影矩阵时, checkpoint size 大约减少了 10000 倍(从 350GB35MB )。 这使我们可以用更少的 GPU 进行训练,并避免 I/O 瓶颈。

    另一个好处是,我们只需交换LORA 权重,而不是所有参数,就能以更低的成本在部署任务时进行切换。这允许在存储 pre-trained 权重(在 VRAM 中)的机器上动态地创建和切换许多定制化的模型。 与 full fine-tuning相比,我们还观察到在 GPT-3 175B 上的训练加速了 25% ,因为我们不需要计算绝大多数参数的梯度。

    LORA也有其局限性。 例如,如果选择吸收 ABW 中以消除额外的推理延迟,则在单个前向传递中 batch 不同任务(具有不同的 AB )的输入并不简单。 尽管在延迟不是关键的场景中,可以不合并权重,并根据 batch 中的样本动态地选择要使用的 LORA 模块。

1.4 实验

  1. 我们在 RoBERTaDeBERTaGPT-2 上评估了 LORA 的下游任务性能,然后再扩展到 GPT-3 175B。我们的实验涵盖了从自然语言理解(natural language understanding: NLU )到自然语言生成(natural language generation: NLG )的广泛任务。具体来说,我们在 GLUE benchmark 上评估了 RoBERTaDeBERTa 。我们在 GPT-2 上遵循 《Prefix-Tuning: Optimizing Continuous Prompts for Generation》 的设置进行直接比较,并添加了 WikiSQ (自然语言到 SQL query)和 SAMSum (对话摘要)用于 GPT-3 上的大规模实验。参见附录C 以了解我们使用的数据集的更多细节。我们在所有实验中都使用了 NVIDIA Tesla V100

  2. baselines:为了与其他基线进行广泛比较,我们尽可能复制了先前工作中使用的设置,并在可能的情况下复用他们报告的结果。但是,这意味着一些基线可能只出现在某些实验中。

    • Fine-Tuning (FT):是一种常见的适配方法。在微调期间,模型被初始化为 pre-trained 的权重和偏置,所有的模型参数都经历梯度更新。一个简单的变体是只更新某些层而冻结其他层。我们包括 《Prefix-Tuning: Optimizing Continuous Prompts for Generation》GPT-2 上报告的一个这样的基线,它只适配最后两层(FTTop2)。

    • Bias-only or BitFit:是一种基线,其中我们只训练偏置向量而冻结其他所有内容。当代,这个基线也被 BitFit《Bitfit: Simple parameter-efficient fine-tuning for transformer-based masked language-models》)研究过。

    • Prefix-embedding tuning (PreEmbed):在 input tokens 中插入 special tokens 。这些 special tokens 具有可训练的 word embeddings ,通常不在模型词表中。放置这些 special tokens 的位置会影响性能。我们关注 "prefixing",即在输入的前面添加这样的 special tokens ;也关注 "infixing",即输入后面追加 special tokens 。两者都在《Prefix-Tuning: Optimizing Continuous Prompts for Generation》 中讨论过。我们使用 lpli 表示 prefix tokens 数量和 infix tokens 数量。可训练参数的数量为 |Θ|=dmodel×(lp+li)

    • Prefix-layer tuning (PreLayer):是 prefix-embedding tuning 的扩展。我们不仅学习某些 special tokensword embeddings (或等效地,activations after the embedding layer ),而且学习 activations after every Transformer layerprevious layers 计算而来的激活被可训练的激活替换。结果,可训练参数数量为 |Θ|=L×dmodel×(lp+ld),其中 LTransformer 层数。

    • Adapter tuning《Parameter-Efficient Transfer Learning for NLP》 所提出的,在自注意力模块(和 MLP 模块)与后续残差连接之间插入 adapter layers 。一个 adapter layer 中有两个带偏置的全连接层,这两个全连接层之间有一个非线性激活。我们称之为 AdapterH

      最近,《Exploring versatile generative language model via parameter-efficient transfer learning》 提出了一个更高效的设计,其中 adapter layer 仅应用于 MLP 模块之后和 LayerNorm 之后。我们称之为 AdapterL 。这与 《Adapterfusion: Non-destructive task composition for transfer learning》 提出的另一种设计非常相似,我们称之为 AdapterP

      我们还包括另一个基线 AdapterDrop《Adapterdrop: On the efficiency of adapters in transfor》),它删除一些 adapter layers 以获得更高的效率,记做 AdapterD

      我们尽可能引用先前工作中的数据以最大化我们比较的基线数量;它们位于第一列中用 * 标记的行中。在所有情况下,我们有 |Θ|=L^Adpt×(2×dmodel×r+r+dmodel)+2×L^LN×dmodel,其中:L^Adptadapter layers 的层数,L^LN 是可训练 LayerNorm 的数量(例如,在 AdapterL 中)。

    • LORA :在现有权重矩阵旁并行地添加低秩分解矩阵的 trainable pairs 。如前所述,出于简单考虑,我们在大多数实验中仅将 LORA 应用于 WqWv。可训练参数的数量由秩 r 和原始权重的形状确定:|Θ|=2×L^LORA×dmodel×r,其中 L^LORA 是我们应用 LORA 的权重矩阵的数量。

  3. RoBERTa base/largeRoBERTa 优化了 BERT 最初提出的预训练配方,在不引入更多可训练参数的情况下提升了后者的任务性能。尽管近年来 RoBERTaGLUENLP 排行榜上被更大的模型超过,但它仍然是一个流行的、有竞争力的 pre-trained 模型。我们从 HuggingFace Transformers 库获取 pre-trained RoBERTa base (125M)RoBERTa large (355M) ,并评估不同 efficient adaptation 方法在 GLUE 任务上的性能。我们还根据他们的设置复制了 《Parameter-Efficient Transfer Learning for NLP》《Adapterfusion: Non-destructive task composition for transfer learning》的工作。为了确保公平比较,我们在与 adapters 比较时,在如何评估 LORA 上做了两个关键更改:

    • 首先,我们对所有任务使用相同的 batch size ,序列长度为 128 以匹配 adapter baselines

    • 其次,我们将模型初始化为 pre-trained 模型从而用于 MRPCRTESTS-B ,而不是像 fine-tuning baseline 那样已经在 MNLI 上适配好的模型。

    遵循 《Parameter-Efficient Transfer Learning for NLP》 更严格设置的 runs 标记。结果如 Table 2 所示(前三部分)。附录 D.1 节详细介绍了所使用的超参数。

  4. DeBERTa XXLDeBERTa 是最近的 BERT 变体之一,它以更大的规模进行了训练,在 GLUESuperGLUEbenchmarks 中表现非常有竞争力。我们评估 LORA 是否仍然可以在 GLUE 上匹配 fine-tuned DeBERTa XXL (1.5B) 的性能。结果如 Table 2 最后一部分所示。附录 D.2 节详细介绍了所使用的超参数。

  5. GPT-2 medium/large:在展示 LORA 可以在自然语言理解任务上成为 full fine-tuning 的有竞争替代方案之后,我们希望回答LORA 是否仍然在 NLG 模型上也占优势,例如 GPT-2 mediumGPT-2 large 。我们使我们的设置尽可能接近 《Prefix-Tuning: Optimizing Continuous Prompts for Generation》 的设置,以进行直接比较。由于版面限制,我们在本节中仅展示 E2E NLG Challenge 数据集上的结果(见 Table 3 。第 F.1 节给出了 WebNLGDART 的结果。第 D.3 节列出了使用的超参数。

  6. 扩展到 GPT-3 175B :作为 LORA 的最终压力测试,我们扩展到拥有 175B 参数的 GPT-3 。由于训练成本很高,对于给定的任务,我们仅报告在不同随机种子上的典型标准差,而不是为每个随机数提供一个标准差。第 D.4 节详细介绍了所使用的超参数。

    Table 4 所示,LORAfine-tuning baseline 的性能相当或更好。请注意,并非所有方法都会从有更多可训练参数中受益,如 Figure 2 所示。当使用超过 256 special tokens 进行 prefix-embedding tuning 、或超过 32 special tokens 进行 prefix-layer tuning 时,我们观察到显著的性能下降。这证实了 《Prefix-Tuning: Optimizing Continuous Prompts for Generation》 的类似观察。尽管本文不打算深入研究这种现象,但我们怀疑使用更多 special tokens 会使输入分布进一步偏离 pre-training data distribution 。另外,我们在第 F.3 节中研究了不同适配方法在数据量少的情况下的表现。

1.5 理解 Low-Rank Updates

  1. 鉴于 LORA 的经验证据优势,我们希望进一步解释从下游任务中学到的 low-rank adaptation的属性。请注意,低秩结构不仅降低了硬件准入门槛,从而允许我们并行运行多个实验,而且还更好地解释了 update weightspre-trained weights的相关性。我们将研究重点放在 GPT-3 175B 上,在这里我们实现了最大程度的可训练参数减少(高达 10000 倍),而不对任务性能产生不利影响。

    我们进行了一系列实证研究,以回答以下问题:

    • 1):在参数预算约束下,我们应该适配 pre-trained Transformer 中的哪些权重矩阵以最大化下游性能??

    • 2)"optimal" adaptation matrix ΔW 是否 rank-deficient ?如果是,实践中什么秩比较好?

    • 3)ΔWW之间是什么关系?ΔW 是否与 W 高度相关?与 W 相比,ΔW 有多大?

    我们认为我们对问题 2)3) 的回答可以阐明使用 pre-trained 语言模型进行下游任务的基本原理,这是 NLP 中的一个关键话题。

1.5.1 我们应该在 Transformer 中对哪些权重矩阵应用LORA?

  1. 在给定的有限的参数预算下,我们应该适配哪些类型的权重矩阵从而获得下游任务的最佳性能?如前所述,我们目前只考虑自注意力模块中的权重矩阵。在 GPT-3 175B 上,我们设置参数预算为 18M (如果以 FP16 存储约为 35MB ),这对应于 r=8 (如果适配一种类型的注意力权重)、或者 r=4 (如果适配两种类型的注意力权重),针对所有 96 层。结果如 Table 5 所示。

    请注意,将所有参数预算放在 ΔWqΔWk 中会导致显著较差的性能,而同时适配 WqWv 可以获得最佳结果。这表明即使 r=4 也可以在 ΔW 中捕获足够的信息,以至于与使用更大 rank 来适配单个权重相比,适配更多个的权重矩阵更可取。

1.5.2 LORA的最佳秩 r 是多少?

  1. 我们将注意力转向秩 r 对模型性能的影响。我们适配 {Wq,Wv},{Wq,Wk,Wv,Wo},{Wq} 来进行比较。

    Table 6 显示,令人惊讶的是,即使 r 非常小,LORA 的表现也具有竞争力(相对于仅仅适配 {Wq} 而言,适配 {Wq,Wv} 更是如此)。这表明 update matrix ΔW 可能具有非常小的 "intrinsic rank"。为进一步支持这一发现,我们检查了不同 r 和不同随机种子学习到的子空间的重叠情况。我们认为增加 r 并没有覆盖更有意义的子空间,这表明 low-rank adaptation matrix 就足够了。

    似乎是 r 越小越好,同时配合尽可能多类型的 weights update (如 {Wq,Wk,Wv,Wo} )。

  2. 不同 r 之间的子空间相似度:给定 Ar=8Ar=64,它们分别是使用相同 pre-trained 模型学到 r=8r=64adaptation matrix 。我们执行奇异值分解并获得 right-singular unitary 矩阵 UAr=8UAr=64 。我们希望回答: UAr=8 中前 i 个奇异向量张成的子空间(1i8)有多大程度上包含在 UAr=64j 个奇异向量张成的子空间中(1j64)?我们使用基于Grassmann distance 的归一化子空间相似度来测量这个量(参见附录 G 的更正式讨论):

    (5)ϕ(Ar=8,Ar=64,i,j)=UAr=8iUAr=64jF2min(i,j)[0,1]

    其中:UAr=8i 表示 UAr=8 的前 i 列,表示 top-i singular vectors

    ϕ() 的范围在 [0,1] 之间,其中 1 表示子空间完全重叠、0 表示完全分离。参见 Figure 3 ,其中 ϕ 随着 ij 的变化而改变。这里我们仅考虑第 48 层(共 96 层),但结论对其他层也成立,如第 H.1 节所示。

    Figure 3 我们可以得到一个重要观察:对于 Ar=8Ar=64top singular vector 的方向重叠显著,而其他 singular vector 不重叠。 具体来说,对于 Ar=8ΔWvAr=64ΔWv 共享一个一维的子空间,其中归一化的相似度大于 0.5 。对于 ΔWq 也是如此。这解释了为什么 r=1 在我们的 GPT-3 下游任务中的表现相当不错。

    由于 Ar=8Ar=64 都是使用相同的 pre-trained 模型学习的,Figure 3 表明 Ar=8Ar=64top singular-vector 方向是最有用的,而其他方向可能主要包含训练过程中累积的随机噪声。因此,adaptation matrix 确实可以具有非常低的秩。

  3. 不同随机种子之间的子空间相似度:我们通过绘制两个 r=64 的随机初始化运行之间的归一化子空间相似度,进一步确认这一点。如 Figure 4 所示。ΔWq 似乎比 ΔWv 具有更高的 "intrinsic rank",因为对于 ΔWq,两个 runs 学到了更多 common singular value directions ,这与我们在 Table 6 中的经验观察一致。作为比较,我们还绘制了两个随机高斯矩阵,它们之间没有共享任何奇异值方向。

1.5.3 Adaptation Matrix ΔWW 比较如何

  1. 我们进一步研究 WΔW 之间的关系。具体来说, ΔW 是否与W高度相关?或者数学上, ΔW 是否主要被包含在 Wtop singular directions 中?此外,与 W中的对应方向相比, ΔW 有多“大” ?这可以为 adapting pre-trained language models 阐明底层的机制。

  2. 为了回答这些问题,我们通过计算 UWV,将 W 投影到 ΔWr 维子空间上,其中 U/V 分别是 ΔWleft/right singular-vector matrix 。 然后,我们比较 UWVFWFFrobenius 范数。 作为比较,我们还通过用 Wtop r singular vectors 、或随机矩阵,来替换 UV 来计算UWVF

    Table 7 我们可以得出几点结论:

    • 首先,与随机矩阵相比,ΔWW 的相关性更强,表明ΔW 放大了 W 中已经存在的某些特征。

    • 其次,ΔW 没有重复 Wtop singular directions ,而是放大了 W 中没有强调的方向。

    • 第三,放大因子相当大:对 r=4 ,大约为 6.91/0.32 = 21.5。 第 H.4 节解释了为什么 r=64 具有较小的放大因子。

    我们在第 H.3 节中还提供了一个可视化,展示了随着从 Wq 中包含更多 top singular directions ,相关性(correlation )是如何改变的。这表明 low-rank adaptation matrix 可能放大了 general pre-training model 中学到的、但没有强调的 specific downstream tasks 的重要特征。

1.6 未来工作

  1. 未来工作有许多方向:

    • LORA 可以与其他 efficient adaptation 方法相结合,可能提供正交的改进。

    • 微调或 LORA 背后的机制还不清楚:预训练中学到的特征如何转化为下游任务的良好表现?我们认为 LORAfull fine-tuning 更容易回答这个问题。

    • 我们主要依赖启发式方法来选择权重矩阵来应用 LORA 。是否有更原则的方法来进行选择?

    • 最后,ΔWrank-deficien 表明:W 也可能 rank-deficien,这也可以作为未来工作的灵感来源。

二、QLORA[2023]

论文:《QLORA: Efficient Finetuning of Quantized LLMs》

  1. 大语言模型(large language models: LLMs )的微调是提高其性能的高效方法,从而可以增加或删除期望的或不期望的行为。然而,非常大模型的微调代价昂贵;LLaMA 65B 模型的常规 16-bit finetuning 需要超过 780GBGPU 内存。尽管最近的量化方法可以减少 LLM 的内存占用(《LLM.int8(): 8-bit matrix multiplication for transformers at scale》《The case for 4-bit precision: k-bit inference scaling laws》《Gptq: Accurate post-training quantization for generative pre-trained transformers》《Smoothquant: Accurate and efficien tpost-training quantization for large language models》),但这些技术仅适用于推理,在训练期间会崩溃(《Stable and low-precision training for large-scale vision-language models》)。

    我们首次证明了可以对 4-bit 量化的模型进行微调而不降低任何性能。我们的方法 QLORA 使用一种新颖的 high-precision 技术从而将 pretrained 模型量化为 4-bit,然后添加少量可学习的 Low-rank Adapter weights《LORA:Low-rank adaptation of large language models》),这些Low-rank Adapter weights 通过 quantized weights 来反向传播梯度进行调优。

    QLORA65B 参数模型的微调平均内存需求从 >780GBGPU 内存降低到 < 48GB ,与 16-bit fully finetuned baseline相比,运行时性能或预测性能没有降低。这标志着 LLM 微调的可访问性发生了重大变化:现在可以在单个 GPU 上微调迄今为止公开发布的最大模型。使用 QLORA,我们训练了 Guanaco模型系列,这是在Vicuna benchmark 中表现第二好的模型,达到了 ChatGPT 性能水平的 97.8% ,同时在单个消费级 GPU 上训练不到 12 小时;使用单个专业 GPU 训练超过 24 小时,我们用最大的模型实现了ChatGPT 性能的 99.3% ,基本上在 Vicuna benchmark 中填补了与 ChatGPT 的差距。部署时,我们最小的 Guanaco 模型(7B 参数)只需要 5GB 内存,并在 Vicuna benchmark 中比 26GBAlpaca 模型超出 20%Tabke 6 )。

    QLORA 引入了多项创新,旨在降低内存使用而不牺牲性能:

    • (1)4-bit NormalFloat,一种信息理论最优的量化数据类型(quantization data type )从而用于正态分布数据,其经验结果优于 4-bit Integers4-bit Floats

    • (2)Double Quantization ,一种用于对 quantization constants 再次进行量化的方法,平均每个参数节省约 0.37 bits (对于 65B 模型约 3 GB )。

    • (3)Paged Optimizers ,使用 NVIDIA unified memory 从而避免 gradient checkpointing memory 尖峰,其中这些尖峰发生在当处理具有长序列长度的 mini-batch 时。

    我们将这些贡献组合成一个更好的 tuned LORA 方法,其中 tuned LORA 包含每个网络层的adapters,从而避免了先前工作中看到的几乎所有的 accuracy tradeoffs

    QLORA 的效率使我们能够在模型规模上对指令微调(instruction finetuning )的和聊天机器人(chatbot )的性能进行深入的研究,由于内存开销而使用常规微调无法实现这种研究。 因此,我们在多个指令微调数据集、模型架构、以及 80M ~ 65B 参数之间的模型规模上训练了超过 1000 个模型。 除了展示 QLORA 恢复了16-bit 性能、以及训练了 SOTA 的聊天机器人 Guanaco 之外,我们还分析了模型趋势:

    • 首先,我们发现数据质量比数据集大小更重要。例如,一个 9k 样本数据集(OASST1 )在聊天机器人性能上胜过一个 450k 样本数据集(FLAN v2 ,子采样之后的),即使两者都旨在支持 instruction following generalization

    • 其次,我们表明强大的 Massive Multitask Language UnderstandingMMLUbenchmark 性能并不意味着强大的 Vicuna chatbot benchmark 性能;反之亦然。换句话说,对于给定的任务,数据集的适用性(suitability )比大小更重要。

    此外,我们还提供了聊天机器人的广泛性能分析,其中使用人类标注员和 GPT-4 进行评估。 我们使用 tournament-style benchmarking,其中在比赛中,模型之间进行竞争从而针对给定的 prompt 产生最佳响应。一次比赛( match )中的获胜者由 GPT-4 或人类标注员来判断。 tournament 结果汇总为 Elo 分数,这决定了聊天机器人性能的排名。我们发现:GPT-4 和人类评估在 tournaments 中对模型性能排名高度一致,但我们也发现存在强烈分歧的实例。因此,我们强调 model-based evaluation 虽然提供了比 human-annotation 廉价的替代方案,但也存在其不确定性。

    我们声明,我们的 chatbot benchmark 得到了 Guanaco 模型的定性分析的结果。我们的分析强调了成功案例和失败案例,这些案例未被 quantitative benchmarks 所捕获。

    我们发布所有带有人类标注和 GPT-4 注释的 model generations ,以方便进一步研究。我们开源代码库和 CUDA kernels ,并将我们的方法集成到 Hugging Face transformers stack 中,使其易于所有人访问。我们发布了针对 7/13/33/65B 大小模型在 8 个不同的 instruction following datasets 上训练的 adapters 集合,总共发布了 32 个开源的 finetuned 的模型。

  2. 相关工作:

    • 大型语言模型的量化:LLM 的量化主要集中在推理时的量化上。

      • 保持 16-bit LLM 质量的主要方法是:管理 outlier features (例如 SmoothQuantLLM.int8() );而其他方法使用更复杂的分组方法(《nuqmm: Quantized matmul for efficient inference of large-scale generative language models》《Zeroquant: Efficient and affordable post-training quantization for large-scale transformers》)。

      • 有损量化(lossy quantization)方法研究常规 rounding 的权衡(《The case for 4-bit precision: k-bit inference scaling laws》《Glm-130b: An open bilingual pre-trained model》《Efficiently scaling transformer inference》)或如何优化 rounding decisions 以提高量化精度(quantization precision )(《Gptq: Accurate post-training quantization for generative pre-trained transformers》)。

      • 除了我们的工作,SwitchBack layer《Stable and low-precision training for large-scale vision-language models 》)是唯一在超过 1B 参数规模上研究通过 quantized weights 来反向传播的工作。

    • Finetuning with Adapters:虽然我们使用 Low-rank Adapters: LORA《LORA: Low-rank adaptation of large language models》),但人们还提出了许多其他 Parameter Efficient FineTuning: PEFT方法,例如 prompt tuning《Learning how to ask: Querying lms with mixtures of soft prompts》《The power of scale for parameter-efficient prompt tuning》Prefix-Tuning)、调优 embedding layer inputs《Input-tuning: Adapting unfamiliar inputs to frozen pretrained models》)、 调优 hidden statesIA3 )(《Few-shot parameter-efficient fine-tuning is better and cheaper than in-context learning》)、添加 full layers《Parameter-efficient transfer learning for nlp》)、调优 biasesBitfit)、基于 Fisher 信息来学习权重上的 mask《Training neural networks with fixed sparse masks》)、以及方法的组合(《Compacter: Efficient low-rank hypercomplex adapter layers》)。

      在我们的工作中,我们表明 LORA adapters 能够达到 full 16-bit finetuning 的性能。 我们留待未来的工作来探索其他 PEFT 方法的 tradeoffs

    • 指令微调:为了帮助 pretrained LLM 遵循 prompt 中提供的指令,指令微调使用各种数据源的 input-output pairs 来微调pretrained LLM ,以便在将给定的输入作为 prompt 的情况下生成输出。方法和数据集包括 MetaICLMetaTuningInstructGPTFLANPromptSourceSuper-NaturalInstructionsSelf-instructUnnaturalInstructionsOPT-IMLUnifiedSKGOIG/Chip2AlpacaVicunaKoalaSelf-instruct-GPT-4

    • 聊天机器人:许多 instruction following models 被构建为基于对话的聊天机器人,通常使用来 Reinforcement Learning from Human Feedback: RLHF《Deep reinforcement learning from human preferences 》)、或从现有模型生成数据以使用 AI model feedback 进行训练(RLAIF )(《Constitutional ai: Harmlessness from ai feedback》)。方法和数据集包括:Anthropic-HHOpen AssistantLaMDASparrow

      我们不使用强化学习,但我们最好的模型 Guanaco 是在为 RLHF 训练而设计的 Open Assistant 数据集上的多轮聊天交互中微调的。对于使用 GPT-4 而不是代价高昂的人工标注来评估聊天机器人方法,人们已经开发了方法 《Vicuna: An open-source chatbot impressing gpt-4 with 90%*chatgpt quality》《Instruction tuning with gpt-4》。我们通过关注一个更可靠的评估设置来改进这种方法。

2.1 背景知识

  1. Block-wise k-bit Quantization:量化是将 input 从包含更多信息的 representation 离散化为包含更少信息的 representation 的过程。 它通常意味着将更多 bits 的数据类型转换为较少bits,例如从 32-bit floats 转换为 8-bit Integers 。为了确保使用 low-bit data type 的全部范围,通常通过 input elementsabsolute maximum 进行标准化,从而将 input data type 重新缩放为 target data type 范围。例如,将 32-bit Floating Point (FP32) 的张量量化为范围为[−127,127]Int8 张量:

    (6)XInt8=round(127absmax(XFP32)XFP32)=round(cFP32×XFP32)

    其中:c 是量化常数(quantization constant )或量化比例(quantization scale )。

    反量化(dequantization )是逆过程:

    (7)dequant(cFP32,XInt8)=XInt8cFP32=XFP32

    这种方法的问题是:如果 input 张量中出现大幅值(即异常值 outlier) ),则 quantization bins (某些 bit combinations )的利用不是很好,即:在某些 bins 中没有或几乎没有数值被量化。为了防止异常值问题,一种常见方法是将 input 张量分块成 blocks,每个 block 独立地被量且每个 block 都有自己的量化常数 c 。这可以形式化如下:

    • 首先,我们将 input 张量 XRb×h 分块成n 个连续的、大小为 Bblock,这是通过 flatten 输入张量并切片成 n=(b×h)/Bblock 来实现。

    • 然后,我们使用 XInt8=round(127absmax(XFP32)XFP32)=round(cFP32×XFP32) 独立地对这些 block 进行量化,从而创建quantized tensorn 个量化常数 {ciFP32}i=1,,n

  2. Low-rank AdaptersLow-rank Adapter: LORA《LORA:Low-rank adaptation of large language models》)微调是一种通过使用少量可训练参数(通常称为 adapters )来减少内存需求的方法,而 full model parameters 保持固定。在随机梯度下降期间,梯度通过 fixed pretrained model weights 传递到 adapter 从而优化损失函数。LORA 通过额外的 factorized projection 增强了线性投影。给定一个投影 XW=Y ,其中 XRb×h 为输入张量,WRh×o 为权重矩阵,LORA 计算:

    (8)Y=XW+s×XL1L2

    其中:L1Rh×r,L2Rr×os 为一个标量。

    通常有 rh

  3. Memory Requirement of Parameter-Efficient Finetuning :一个重要的讨论点是:LORA 在训练期间的内存需求,以 adapters 的数量和尺寸两方面来考虑。由于 LORA 的内存占用非常小,我们可以使用更多的 adapters 来提高性能,而不会显着增加总内存使用量。尽管 LORA 被设计为 Parameter Efficient Finetuning: PEFT 方法,但 LLM 微调的大部分内存占用来自 activation gradients ,而不是来自 learned LORA parameters 。对于在 FLAN v2 上以 batch size = 1 训练的 7B LLaMA 模型,LORA 权重相当于通常使用的原始模型权重数量的 0.2%LORA input gradients 的内存占用为 567 MB ,而 LORA 参数仅占用 26 MB 。 使用 gradient checkpointing 后(《Training deep nets with sublinear memory cost》),input gradients 减少到每个序列平均 18 MB ,比所有 LORA 权重的总和更加 memory intensive 。相比之下,4-bit base model 消耗 5048 MB 内存。这表明 gradient checkpointing 很重要,但也表明极度减少 LORA 参数量只带来很小的内存收益。这意味着我们可以使用更多 adapters 而不会显着增加总训练内存占用(详细内存分解见附录 G)。如后文所述,这对恢复 full 16-bit precision 性能至关重要。

    即,我们可以放心地使用大量的 adapters

    下图:QLORA 用不同 LLaMA base models 来训练时的内存占用。

2.2 QLORA Finetuning

  1. QLORA 通过我们提出的两种技术,4-bit NormalFloat: NF4 量化以及 Double Quantization ,来实现 high-fidelity 4-bit finetuning 。此外,我们引入了Paged Optimizers ,以防止 gradient checkpointing 期间的内存尖峰导致的 out-of-memory errors ,其中 out-of-memory errors 使得传统上在单台机器上对大模型进行微调变得困难。

    QLORA 具有一种低精度存储数据类型(low-precision storage data type ),在我们的例子中通常为 4 bit;以及一种低精度计算数据类型,通常为 BFloat16 。实际上,这意味着每当使用 QLORA weight tensor 时,我们将张量 dequantizeBFloat16 ,然后以 16-bit 来执行矩阵乘法。

    注意:数据的存储精度和计算精度不同。采用更高精度来计算,可以减少精度溢出的发生。

    现在我们按顺序讨论 QLORA 的组成部分,然后是 QLORA 的正式定义。

2.2.1 4-bit NormalFloat Quantization

  1. NormalFloat: NF 数据类型建立在 Quantile Quantization《8-bit optimizers via block-wise quantization》)的基础上,这是一种信息理论最优的数据类型(information-theoretically optimal data type ),确保每个 quantization bin 中都有相等数量的值,这些 bins 中的值从 input 张量分配而来。Quantile Quantization 的工作原理是:通过经验累积分布函数(empirical cumulative distribution function)估计 input 张量的分位数。

    quantile quantization 的主要局限性在于 quantile estimation 是昂贵的。 因此,会使用 SRAM quantiles《8-bit optimizers via block-wise quantization》)等快速分位数近似算法来估计它们。由于这些 quantile estimation 计算法的近似性质,对于异常值,该数据类型存在较大的量化误差(quantization errors ),而异常值通常是量化过程中最重要的值。

    input 张量来自一个分布,而这个分布被固定到一个 quantization constant 时,可以避免昂贵的 quantile estimates 和近似误差。在这种情况下,input 张量具有相同的 quantiles,使精确的 quantile estimation 在计算上可行。

    由于 pretrained 的神经网络权重通常具有均值为零、标准差为 σ 的正态分布(请参见附录 F ),我们可以通过缩放 σ 使分布完全符合我们的数据类型的范围从而将所有权重转换为单个固定的分布(a single fixed distribution )。对于我们的数据类型,我们设定强制(arbitrary )的范围 [−1,1] 。 因此,对于数据类型和神经网络权重,分位数(quantiles)都需要被归一化到这个范围内。

  2. 针对均值为零、标准差为 σ ,且范围 [−1,1] 内的正态分布,信息理论上最优的数据类型计算如下:

    • (1) :估计理论正态分布 N(0,1)2k+1 分位数以获得正态分布的 k-bit quantile quantization data type

    • (2) :获取此数据类型并将其值归一化到 [−1,1] 范围内。

      参考后面的 NFk 数据类型的确切值。

    • (3) :通过 absolute maximum 重新缩放将输入权重张量归一化到 [−1,1] 范围内进行量化。

    一旦权重范围和数据类型范围匹配,我们就可以像往常一样进行量化。第 (3) 步相当于重新缩放权重张量的标准差以匹配 k-bit data type 的标准差。

  3. 更正式地,如下所示,我们估计数据类型的 2k 个值 qi

    (9)qi=12×(QX(i2k+1)+QX(i+12k+1))

    其中:QX() 是标准正态分布 N(0,1) 的分位数函数(quantile function )。

    对于 symmetric k-bit quantization 存在的一个问题是,这种方法无法精确表示零,这对于零误差地 quantize padding 和表达其他零值元素是一项重要特性。为了确保 0discrete zeropoint ,并使用所有 2k bits 来用于 k-bit datatype ,我们创建一个非对称的数据类型,通过估计分位数 qi 为两个范围:

    • 对于 negative partqi 采用 2k1

    • 对于 positive partqi 采用 2k1+1

    然后我们统一这些 qi 集合,并删除出现在两个集合中的两个零之一。

    我们将结果数据类型称为 k-bit NormalFloat: NFk ,在每个 quantization bin 中它具有相等的、预期数量的值,因为从信息论上讲,该数据类型对以零为中心的正态分布数据是最优的。此数据类型的确切值可在附录 E 中找到。

    这个数据类型一共 16 个数值,可以用 4bit 来表示。任意浮点数落在哪个区间就用对应的整数来表示。这个区间对任意的 input tensor 都是固定的。

2.2.2 Double Quantization

  1. 我们引入了 Double Quantization: DQ ,即对 quantization constants 进行量化以进一步节省内存。 尽管精确的 4-bit quantization 需要较小的 blocksize《The case for 4-bit precision: k-bit inference scaling laws》),但它也带来相当大的内存开销。例如,针对 W ,采用32-bit 常量以及 block size = 64quantization constants 平均每个参数添加 32/64 = 0.5 bitsDouble Quantization 有助于减少quantization constants 的内存占用。

  2. 更具体地说,Double Quantizationfirst quantizationquantization constants c2FP32 视为 second quantization 的输入。这第二步生成 quantized quantization constants c2FP8second level of quantization constants c1FP32。我们对 second quantization 使用 8-bit Floatsblocksize = 256 ,因为未观察到 8-bit quantization 的性能下降,与 《The case for 4-bit precision: k-bit inference scaling laws》 的结果一致。由于 c2FP32 是正值,因此在量化之前我们从 c2FP32 中减去平均值从而将值围绕零进行中心化并利用对称量化(symmetric quantization )。平均而言,对于 blocksize = 64 ,此量化将每个参数的quantization constants 内存占用从 32/64 = 0.5 bits 减少到 8/64 + 32/(64*256) = 0.127 bits ,减少了每个参数 0.373 bits

    c2FP32 量化到 c2FP8 ,量化常数为 c1FP32。为什么第二步的下标为 1、第一步的下标为 2 ?这是因为 dequantization 过程第一步需要利用 c1FP32 来获得 c2FP32

    (10)XFP32=XInt4(c2FP8/c1FP32)

2.2.3 Paged Optimizers

  1. 使用 NVIDIA unified memory 功能,该功能在 GPU 偶尔内存不足的情况下在 CPUGPU 之间自动进行 page-to-page 传输,以便在 GPU 上无错误地处理。该功能的工作方式与 CPU RAM 和磁盘之间的常规内存分页相同。我们使用此功能为 optimizer states 分配分页内存(paged memory ),当 GPU 内存不足时,它们会自动交换到 CPU RAM ,并在 optimizer update step 需要内存时分页换回 GPU 内存。

2.2.4 QLORA

  1. 使用上述组件,我们为 quantized base model 中的具有单个 LORA adapter 的单个线性层定义 QLORA 如下:

    (11)YBF16=XBF16doubleDequant(c1FP32,c2k-bit,WNF4)+XBF16L1BF16L2BF16

    其中 doubleDequant() 定义为:

    (12)doubleDequant(c1FP32,c2k-bit,Wk-bit)=dequant(dequant(c1FP32,c2k-bit),W4bit)=WBF16

    我们对 W 使用 NF4 、对c2 使用 FP8 。 我们对 W 使用 blocksize = 64 从而获得更高的量化精度,对 c2 使用 blocksize = 256 以节省内存。

    注意:这里所有的计算都采用 BF16。此外,LORA adapter 没有被量化而是直接采用 BF16,因为它的参数规模很小,而且也可以补偿 fixed base model 的量化误差。

    对于 parameter updates ,只需要 adapters 权重的误差梯度 ELi,而不需要 4-bit 权重的误差梯度 EW,其中