Hugging Face PEFT 新 LoRA 合并方法

Hugging Face 已将多种新合并方法集成到 PEFT 库中,允许开发者将来自同一基础模型的多个 LoRA 适配器进行组合。此更新实现了模型能力的即时合成,使单个合并后的适配器能够执行需要多个专用适配器知识的任务。

支持的 LoRA 合并方法

PEFT 现在支持多种合并算法,每种算法对适配器权重(矩阵 $A$ 和 $B$)的处理方式不同,以在性能和内存使用之间取得平衡。

连接 (cat)

连接是 LoRA 适配器的精确加权合并。它将参与适配器的 $A$ 和 $B$ 矩阵进行拼接,允许它们具有不同的秩。虽然此方法通常能取得良好效果,但合并大量适配器可能导致适配器体积增大并出现内存不足(OOM)错误。

线性/任务算术 (linear)

基于《使用任务算术编辑模型》论文,此方法对各个 $A$ 和 $B$ 矩阵进行加权求和。该方法要求所有参与的 LoRA 适配器具有相同的秩。

奇异值分解 (svd)

SVD 将乘积 $BA$(增量权重)视为任务权重。它计算合并后的增量权重,然后使用 SVD 近似得到新的 $A$ 和 $B$ 矩阵。该方法支持不同秩的适配器,并允许用户指定合并后适配器的秩,但会消耗大量 GPU 内存。

TIES (ties, ties_svd)

TIES(TRIM, ELECT SIGN & MERGE)在合并模型时解决干扰问题。它根据 density 比例剪除任务权重中最小的值,计算多数符号掩码(使用 total 绝对值或 frequency 符号出现频率),并执行不相交的合并。该方法提供标准版和 SVD 变体。

DARE (dare_linear, dare_ties, dare_linear_svd, dare_ties_svd)

DARE 根据 1-density 比例随机剪除任务权重,并将剩余权重按 1/density 重新缩放。DARE 作为插件,可与线性/任务算术或 TIES 方法结合使用。

大小剪枝 (magnitude_prune, magnitude_prune_svd)

该方法根据 density 比例剪除任务权重中最小的值,然后对剩余的任务张量进行加权求和。提供标准版和 SVD 变体。

实现与能力

用户可以通过 PEFT 中的 add_weighted_adapter() 类方法实现这些合并方式。

组合专用能力

合并适配器使模型能够支持单个适配器无法单独处理的使用场景。例如,将“心理健康”适配器与“Hinglish”(印地语-英语)语言适配器相结合,模型即可用 Hinglish 提供具体的心理健康建议,而单独的适配器只能提供英文建议或仅具备 Hinglish 语言风格但缺乏专业知识。

扩展至文本到图像生成

这些合并方法同样适用于通过 🤗Diffusers 库进行的文本到图像生成。通过从 LoRA 检查点获取 PeftModel 并使用 add_weighted_adapter(),用户可以组合不同风格或主题的 LoRA(例如,将 “toy-face” LoRA 与 “Pixel-Art” LoRA 结合),生成兼具两者特征的图像。

技术观察与建议

根据 Hugging Face 的测试,推荐以下选择合并方法的指南:

  • 起始点: 在大多数情况下,若适配器数量较少,建议先使用 cat 方法以获得最佳效果。
  • 线性替代方法:cat 不足,可依次尝试 linearmagnitude_prunedare_linear。对于 magnitude_prunedare_linear,建议将 density 设为 0.7~0.8。
  • TIES 配置: 使用 ties 时,majority_sign_method="frequency" 通常优于默认的 total。建议的起始 density 为 0.5。
  • SVD 变体: 在处理不同秩的 Stable Diffusion LoRA 适配器时使用 *svd 系列方法。需注意 SVD 运算计算量大且占用更多 GPU 内存。
  • DARE 性能: 观察到 dare_ties 变体效果不佳。

Sources