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不足,可依次尝试linear、magnitude_prune、dare_linear。对于magnitude_prune和dare_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变体效果不佳。