PEFT documentation

用于消除张量并行 LoRA 服务中通信开销的块对角 LoRA

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v0.21.0).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

用于消除张量并行 LoRA 服务中通信开销的块对角 LoRA

Block-Diagonal LoRA (BD-LoRA) 是 LoRA 的一种变体,其中部分 LoRA 因子被约束为块对角形式。这通过消除在多 GPU 上运行推理时的通信开销,实现了更快的服务速度。尽管存在块对角约束,BD-LoRA 在相似参数数量下的性能与原生 LoRA 相当。

BD-LoRA 旨在与张量并行(tensor parallelism)配合使用,即将模型的权重分片到多个 GPU 上。一种流行的分片策略是 Megatron 分片策略. 对于两个依次连接的线性层 $W_1$、 W2W_2 (例如 Transformer MLP 模块中的上投影和下投影),我们将以列并行方式分片第一个层(这要求 LoRA B 为块对角矩阵),并以行并行方式分片第二个层(这要求 LoRA A 为块对角矩阵)。对于注意力模块,可以通过将 Q、K 和 V 投影一起视为 W1W_1 ,并将输出投影视为 $W_2$,从而以类似的方式实现相应的分片。这种分片方式允许兼容的推理引擎将每个块对角分片分配到不同的 GPU 上,从而减少了 GPU 之间通信部分结果的需求。在下图中,你可以看到具体的分片策略以及它如何节省计算开销。

论文:https://hf.co/papers/2510.23346

性能、排名和参数量

BD-LoRA 在相同参数量下可达到与 LoRA 相似的性能(参见下图,或 peft 仓库根目录下的 method_comparison 文件夹)。然而,由于 BD-LoRA 中的其他所有因子均为块对角矩阵,在相同秩的情况下,BD-LoRA 适配器的参数量将少于 LoRA 适配器。只有相应地增加秩时,BD-LoRA 的性能才具有竞争力。我们在此示例笔记本的末尾提供了秩匹配的示例代码。

API

BdLoraConfig

类 peft.BdLoraConfig

< >

( target_modules_bd_a: Optional[list[str]] = Nonetarget_modules_bd_b: Optional[list[str]] = Nonenblocks: int = 1match_strict: bool = True )

参数

  • target_modules_bd_a — LoRA-A 为块对角矩阵的模块。通过 pattern is in target_name 将列表中的每个模式与模块名称进行匹配。示例:[‘up_proj’, ‘q_proj’, ‘v_proj’, ‘k_proj’]
  • target_modules_bd_b — LoRA-B 为块对角矩阵的模块。通过 pattern is in target_name 将列表中的每个模式与模块名称进行匹配。示例:[‘out_proj’, ‘down_proj’]
  • nblocks — 块对角矩阵中的块数
  • match_strict — 如果设置为 true,则要求每个 target_module 必须具有块对角 LoRA-A 或 LoRA-B,否则将引发错误。您可以将其设置为 False 以混合 LoRA 和 BD-LoRA 训练,例如,如果您的模块中某些层从 BD-LoRA 中获益不大。

BD-LoRA(Block-Diagonal LoRA)的配置。BD-LoRA 是 LoRA 的一种变体,可用于推理引擎中高效的多 LoRA 服务。通过将某些 LoRA 模块设置为块对角形式,减少了 GPU 间的通信,从而实现了加速。

要确定哪些 LoRA 因子应设置为块对角,请遵循以下准则:

  • 对于注意力机制,设置
    • Q、K、V 投影采用 LoRA-B 块对角
    • 输出投影为 LoRA-A 块对角
  • 对于 MLP,请设置
    • Up、Gate 投影为 LoRA-B 块对角
    • 用于 LoRA-A 块对角化的下投影

对于其他模块和/或架构,请查阅目标推理引擎的代码。行分片的模块应使 LoRA-A 呈块对角形式,列分片的模块应使 LoRA-B 呈块对角形式。

Update on GitHub