PEFT documentation
用于消除张量并行 LoRA 服务中通信开销的块对角 LoRA
用于消除张量并行 LoRA 服务中通信开销的块对角 LoRA
Block-Diagonal LoRA (BD-LoRA) 是 LoRA 的一种变体,其中部分 LoRA 因子被约束为块对角形式。这通过消除在多 GPU 上运行推理时的通信开销,实现了更快的服务速度。尽管存在块对角约束,BD-LoRA 在相似参数数量下的性能与原生 LoRA 相当。
BD-LoRA 旨在与张量并行(tensor parallelism)配合使用,即将模型的权重分片到多个 GPU 上。一种流行的分片策略是 Megatron 分片策略. 对于两个依次连接的线性层 $W_1$、 (例如 Transformer MLP 模块中的上投影和下投影),我们将以列并行方式分片第一个层(这要求 LoRA B 为块对角矩阵),并以行并行方式分片第二个层(这要求 LoRA A 为块对角矩阵)。对于注意力模块,可以通过将 Q、K 和 V 投影一起视为 ,并将输出投影视为 $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
< source >( 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 呈块对角形式。