Compress then Serve: Serving Thousands of LoRA Adapters with Little Overhead
公和众与号:EDPJ(进 Q 交流群:922230617 或加 VX:CV_EDPJ 进 V 交流群)
目录
0. 摘要
微调大型语言模型(LLM)使用低秩适配器(low-rank adapters,LoRA)已成为常见做法,通常会产生多个仅在 LoRA 更新上有所不同的相同 LLM 副本。这种范式给需要实时响应 query 的系统带来了挑战,每个 query 涉及不同的 LoRA。先前的工作优化了此类系统的设计,但仍需持续加载和卸载 LoRA,因为在 GPU 内存中存储成千上万的 LoRA 是不可行的。为了解决这一问题,我们研究了在服务 LoRA 适配器时压缩的有效性。我们考虑通过 SVD 对适配器进行单独压缩,并提出了一种将 LoRA 联合压缩到匹配 LoRA 专属缩放矩阵的共享基底(basis)的方法。我们对多达 500 个 LoRA 的实验表明,在实际服务场景中使用超过一千个 LoRA 时,压缩的 LoRA 在保持单个 LoRA 服务 75% 吞吐量的同时,保留了性能并提供了巨大的吞吐量提升。
1. 简介
在这项工作中,我们考虑了压缩 LoRA 集合的问题。我们有两个主要目标:(1)保持原始 LoRA 的性能和(2)提高服务多个 LoRA 的吞吐量。我们将 LoRA 压缩表述为重构问题,目标是通过总大小较小的矩阵集合来近似原始适配器。我们研究了两种方法:通过 SVD 降低其秩来单独压缩每个 LoRA,以及通过找到共享基底和 LoRA 特定缩放矩阵来联合压缩 LoRA。前者受 [11] 启发,表明降低 LoRA 秩对多任务学习和模型合并是有益的。对于后者,我们提出了一种受联合对角化模型启发的联合压缩算法。
我们的单独和联合压缩方法呈现出有趣的权衡。例如,联合压缩可以通过使用可预加载到 GPU 的共享基底表示任何特定 LoRA,从而实现极端的参数数量减少。然而,共享基底通常会增加 LoRA 的秩。另一方面,单独压缩可以降低秩,但在压缩效率方面有限。我们研究了这些权衡在使用 vLLM [12](一种最先进的 LLM 服务系统)服务 1000 个 LoRA 时如何影响吞吐量。在图 1 中,我们展示了压缩的好处和这些权衡的影响。当服务超过 1000 个 LoRA 时,压缩使吞吐量增加了 2 倍以上,并保持了服务基础 LLM(或合并到 LLM 中的单个 LoRA)75% 的吞吐量。
3. 基于秩的 LoRA 压缩
LoRA 更新由成对矩阵 A 和 B 参数化,其乘积 BA 更新了神经网络基础模型的固定权重矩阵 W_0 ∈ R^(d_B × d_A)。给定层的输入 x,LoRA 更新模型在该层的输出为 (W_0 + BA)·x。
在制定我们的压缩算法时,我们考虑一组给定的 LoRA 适配器 {(Ai, Bi)}^n_(i=1),我们希望提供服务。我们令 ri 表示 LoRA 适配器对 (A_i, B_i) 的秩,即 Bi ∈ R^(d_B × r_i),Ai ∈ R^(r_i × d_A)。在 §3.1 中列出设计压缩方案的基本考虑因素后,我们在 §3.2 中考虑了一种简单的基线参数减少方法,以及在 §3.3 中更激进的联合对角化方法。
3.1 期望特性(Desiderata)
虽然我们的压缩技术只能访问一组 {(Ai, Bi)}^n_(i=1) 对,但在实验中,我们将通过比较压缩矩阵在典型数据上的表现与未压缩 LoRA 的表现来评估压缩的有效性。基于此原因,尽管在本节中我们优化相对于乘积 Bi·Ai 的 Frobenius 范数重构误差,但实际上这是适配器中压缩误差对 transformer 性能的非线性和复杂影响的代理。我们的实验评估将重点关注压缩 LoRA 在实际数据上相对于未压缩版本的性能(见 §6)。
我们的压缩方法显著减少了参数的总数量。通过压缩减少参数理论上加速了 LoRA 集合的存储和服务过程。然而,这种减少改变了推理期间的计算动态,因此参数减少本身并不立即意味着更快的吞吐量。鉴于 GPU 优化的复杂性,我们将在 §6.3 中评估现实条件下的吞吐量。
3.2 通过 SVD 的独立压缩
最简单的方法是用一个秩为 r 的近似替换每个秩为 ri 的 LoRA 适配器 Bi·Ai
其中通常
由于 Eckart-Young 定理,这种策略找到了在 Frobenius 范数意义上最适合 Bi·Ai 的秩 r 近似。由于Σ_i V^T_i 可以保存为一个矩阵,这种方法将使用的参数数量从 ∑_i (d_A + d_B)·r_i 减少到 r·n·(d_A + d_B)。虽然这种近似方法有效,但随着 n 的增加,它在压缩能力上受到限制,因为它不会在 LoRA 之间共享信息。这一缺点激发了我们下一种方法的动机。
3.3 联合对角化
接下来,我们提出一种联合对角化(Joint Diagonalization,JD)方法,该方法优化一个共享基底,投射到这一基底上的一组 n 个 LoRA。这将允许共享结构,隐式地聚类 LoRA 集合。
在此模型中,每个 LoRA 产物 Bi·Ai 被分解为形式 U·Σ_i·V,其中 U 和 V 在所有 LoRA 之间共享,Σ_i 是每个 LoRA 特有的。在这种表述中,每个 Σ_i 共享相同的秩 r。这允许 U 和 V 预加载到 GPU 上,而在每 batch 需要时加载 Σ_i。矩阵 Σ_i 可以是对角矩阵或小方阵,与传统的多 LoRA 服务配置相比,加速了前向传播。
目标函数。受奇异值分解与最小化重构误差的 Frobenius 范数关系的启发,我们还建议最小化适配器矩阵近似误差的 Frobenius 范数。具体来说,我们使用以下目标函数:
使用 Frobenius 范数的额外好处是使目标函数在每个参数中单独是凸的,这表明可能存在高效的优化方法。然而,该目标函数是欠定的,因此我们考虑以下两种受约束的方案。
完整 Σ_i 近似。第一种方法我们称之为 JD − Full。在不失一般性的情况下,只要 Σi 仍然是一个无约束的完整矩阵,U 和 V 可以被约束为正交矩阵。JD − Full 采用这种限制以使优化更好地成立,但注意这并不限制目标函数(2)的表达能力。此设置产生以下优化问题:
解决此目标函数的有效替代算法可以在附录 B 中找到。
对角 Σi 近似。作为替代方案,我们可以将 U、V 设为无约束(除了具有 r 列之外),而将矩阵 Σi 约束为对角矩阵(但不一定为正)。这种表述产生以下优化问题:
一个有效的替代的最小二乘算法可以在附录 B 中找到。这种对角版本相比 JD − Full 在每个 LoRA 的参数上有一些节省,因为对角矩阵 Σi 只需要 r 个参数而不是 r^2。
4. 理论分析
虽然基于 SVD 的方法相对容易理解,但在本节中,我们试图更好地理解 §3.3 中提出的联合对角化方法的作用。我们将重点关注具有正交 U 和 V 矩阵的完整 Σi 情况。注意,对于相同的秩 r,r−JD−Diag 的重构误差至少与 r−JD−Full 一样大,因为它对 Σi 施加了一个额外的约束。
首先,注意到只有当 r 足够大时才能实现完美重构:
命题1:假设对所有 i,rank(Bi·Ai) = ri,并且令
然后,使用 r = ~r 的 JD − Full (3) 可以实现无损压缩(完美重构),并且使用 r < ~r 将产生非零重构误差。
证明:当且仅当 r ≥ ~r 时,存在 U, V 使得所有 Bi, Ai 都分别在 U, V 的张成空间内。
由于训练噪声,~r 几乎总是等于 ∑^n_(i=1) r_i。这意味着在大多数现实情况下,联合对角化方法是有损重构。
这种重构损失可能是显著的,如以下定理所示(证明见附录 C):
定理 1:考虑 n 个 LoRA ({Ai, Bi}^n_{i=1}),其中 r, n ≤ d^2,并构造矩阵
令 σj 为 L 的奇异值,从大到小排序,令 ¯σj 为 ∑^n_(i=1) Bi·Ai 的奇异值。然后,使用 JD − Full (3) 方法,
这意味着重构的 LoRA 的 Frobenius 范数平方和满足
换句话说,如果 L 的奇异值没有集中在前 r^2 个条目中,则不可避免会产生显著的重构误差。
备注 1(下界与合并):通过将所有 Σi 设为相等,即,使用完全合并(merging)模型而不是仅合并子空间 U, V 并允许 Σi 随 i 变化,可以达到下界
备注 2(上界与聚类):当 LoRA 相对聚类时,即当 vec(Bi·Ai) 向量组相似时,上界最小。这种情况提高了 L 最大奇异值的幅度,从而提高了命题中的上界。由于 LoRA 是 d×d 矩阵,可以看作 d^2 维空间中的点,对于典型的 d 值高达数百,彼此无关的 LoRA 很可能不聚类,即它们之间的内积相对较低。
对于正交 LoRA 的情况,L 的奇异值就是 LoRA 的范数,我们立即得到以下推论:
推论 1:假设(例如由于归一化)联合对角化算法的输入都具有单位 Frobenius 范数,即 ||Bi·Ai||_Fro = 1。此外,假设 LoRA 都是正交的,即
那么,使用 JD − Full 方法(3),我们有
这意味着重构的 LoRA 的 Frobenius 范数平方和满足
这意味着,对于 r^2 ≪ n 的常见设置,重构的 LoRA 将比原始 LoRA 显著更小,并且必然会有显著的重构误差。
本节的结果展示了使用联合对角化的权衡。
- 如果 LoRA 是相似或良好聚类的,重构误差将很低。
- 如果 LoRA 是随机且正交的,重构误差将很高。
注意,由于 transformer 的损失空间非常复杂,增加权重的重构误差并不一定意味着降低逼近所需 LLM 输出的能力。有趣的是,在下面的图 3 中所示的实验中,我们确实看到虽然大的重构误差迅速降低了性能,但适度(但仍相对较大,约为 0.4)的重构误差并没有损害性能,甚至可能略微优于零重构误差设置。这一观察结果激发了我们对最小化权重重构误差的关注,同时也指出了我们的方法可能不仅仅是实现低损耗压缩的可能性。具体来说,
- 当 r 较大时,基于 Frobenius 范数的联合对角化倾向于找到许多 LoRA 共享的子空间,
- 当 r 较小时,将子空间合并到平均值附近。
当 r 远低于该问题的自然秩时,这种倾向于平均化所有或部分 LoRA 信号的倾向直接连接到合并 LoRA 的概念,其在 [23, 9] 等工作的经验成功可能解释了我们方法的成功,尽管基础 transformer 是非线性的。
附录 F.10 中的实验进一步探讨了这一想法,比较了真实世界 LoRA 的重构与随机采样 LoRA 的重构。重构误差通常很大,但显著低于随机噪声的重构误差,这表明 LoRA 之间存在一个主要的共享成分,并成功保留了这一成分。
5. 训练 LoRA 和评估任务性能
5.1 训练
我们使用 Mistral-7B-Instruct-v0.2 [10] 作为基础模型,在 500 个自然指令任务 [27] 上训练了 LoRA 适配器。所有 LoRA 适配器的配置秩为 16,即 ∀_i, r_i = 16。
我们手动选择了 10 个多样化的任务(附录 D 中的表 2)进行一致的实验评估,并随机抽取了另外 490 个任务,总共 500 个任务。这些任务完全使用英语(包括输入和输出),以确保更高的质量和全面的审查 [27]。每个任务数据集被分为训练集、验证集和测试集。
使用验证集调整了诸如早停之类的超参数。测试集上的评估显示,LoRA 在 Rouge 分数和损失指标方面均一致优于基础模型,如表 1 所示。详细信息见附录 D。
6. 实验
【注:文中并未说明圆的大小代表什么意思,但不影响对比。
图 2:要在性能与 memory(LoRA 压缩)之间做一个权衡。
图 3:LoRA 压缩越多,重建误差越大,性能越差。
图 4:JD-Full 是相对地最优方法。
】
7. 讨论
本研究介绍了 LoRA 压缩的方法,解决了基础模型和大型语言模型面临的重要挑战。我们的贡献包括理论公式、经验验证和实践实现,这些都增强了对 LLM 在可扩展环境中的理解和应用。
我们的发现具有多方面的意义。我们对重构误差的理论保证不仅增加了对使用压缩模型的信心,还为未来在这一领域的探索奠定了基础。展示我们的压缩技术能够保持原始 LoRA 性能的高达 100%,突显了我们方法的有效性。此外,将 LoRA 压缩集成到最先进的 LLM 服务系统中,展示了资源优化的潜力,成千上万的 LoRA 的吞吐量接近单个 LoRA 的水平。
一个主要的限制涉及新 LoRA 的集成。我们的研究表明,尽管在原始空间中压缩新 LoRA 能改善基准性能,但相比未压缩的 LoRA,可能会降低性能(见附录 F.11)。因此,最佳策略取决于新 LoRA 的添加频率。较少添加的新 LoRA 可以通过重新压缩所有 LoRA 来证明其合理性,相对于推理成本影响最小。相反,在经常引入但很少服务的新 LoRA 的情况下,应该仅压缩经常服务的 LoRA,其他则使用原始 LoRA。
我们研究的有希望的结果提示了几个未来的研究方向。将我们的压缩技术扩展到更多的模型和任务中,可能会进一步证实和扩展我们发现的普遍性。这包括分布外评估,这可以突出显示与压缩相关的泛化改进。此外,更复杂的优化算法可以改善压缩与性能之间的平衡。
总之,我们的研究通过提供强大、可扩展且高效的压缩解决方案,显著推动了 LLM 的部署。压缩 LoRA 在保持高性能的同时实现了大量的资源节省,这为 LLM 在各个行业的更广泛应用和采纳开辟了新的途径。我们鼓励社区在我们的发现和共享 LoRA 的基础上,进一步探索和提升这些技术的实用性。
论文地址:https://www.arxiv.org/abs/2407.00066