PEFT documentation
LoRA à blocs diagonaux pour éliminer les surcoûts de communication dans le service de LoRA parallélisé par tenseurs
LoRA à blocs diagonaux pour éliminer les surcoûts de communication dans le service de LoRA parallélisé par tenseurs
Block-Diagonal LoRA (BD-LoRA) est une variante de LoRA dans laquelle certains facteurs LoRA sont contraints d’être bloc-diagonaux. Cela permet un service plus rapide en éliminant les surcoûts de communication lors de l’exécution de l’inférence sur plusieurs GPU. Malgré la contrainte bloc-diagonale, BD-LoRA offre des performances similaires à celles de LoRA standard pour un nombre de paramètres comparable.
BD-LoRA est conçu pour être utilisé avec le parallélisme de tenseurs, ce qui signifie le fractionnement des poids d'un modèle sur plusieurs GPU. Une stratégie de fractionnement populaire est la stratégie de fractionnement Megatron. Pour deux couches linéaires $W_1$, qui se suivent (par exemple les projections up et down dans un module MLP de transformer), nous fractionnerons la première couche de manière parallèle par colonnes (ce qui nécessite que LoRA B soit bloc-diagonal) et la deuxième couche de manière parallèle par lignes (ce qui nécessite que LoRA A soit bloc-diagonal). Pour le module d'attention, cela peut être réalisé de manière similaire en prenant les projections Q, K et V ensemble comme et la projection out comme $W_2$, en procédant au fractionnement en conséquence. Ce fractionnement permet à un moteur d'inférence compatible de distribuer chaque fragment bloc-diagonal sur un GPU différent, réduisant ainsi le besoin de communiquer des résultats partiels entre les GPU. Sur l'image ci-dessous, vous pouvez voir la stratégie de fractionnement exacte et comment cela économise des efforts de calcul.
Article : https://hf.co/papers/2510.23346

Performance, rang et nombre de paramètres
BD-LoRA atteint des performances similaires à celles de LoRA (voir l’image ci-dessous, ou le dossier method_comparison à la racine du dépôt peft) pour un nombre de paramètres identique. Cependant, comme chaque autre facteur de BD-LoRA est bloc-diagonal, un adaptateur BD-LoRA comportera moins de paramètres qu’un adaptateur LoRA pour un même rang. Les performances de BD-LoRA ne sont compétitives que lorsque le rang est augmenté en conséquence. Nous fournissons un exemple de code pour l’ajustement du rang à la fin de ce notebook.

API
BdLoraConfig
classe peft.BdLoraConfig
< source >( target_modules_bd_a: Optional[list[str]] = Nonetarget_modules_bd_b: Optional[list[str]] = Nonenblocks: int = 1match_strict: bool = True )
Paramètres
- target_modules_bd_a —
Modules où la matrice LoRA-A est bloc-diagonale. Chaque motif de la liste est comparé au nom du module via
pattern is in target_name. Exemple : [‘up_proj’, ‘q_proj’, ‘v_proj’, ‘k_proj’] - target_modules_bd_b —
Modules où le LoRA-B est bloc-diagonal. Chaque motif de la liste est comparé au nom du module via
pattern is in target_name. Exemple : [‘out_proj’, ‘down_proj’] - nblocks — Nombre de blocs dans les matrices bloc-diagonales
- match_strict — Si défini sur true, exige que chaque target_module possède soit un LoRA-A, soit un LoRA-B en diagonale par blocs, et lève une erreur dans le cas contraire. Vous pouvez définir cette valeur sur False pour mélanger l’entraînement LoRA et BD-LoRA, par exemple si certaines couches de votre module ne bénéficient pas de BD-LoRA.
Configuration pour BD-LoRA (Block-Diagonal LoRA). BD-LoRA est une variante de LoRA qui peut être utilisée pour un service multi-LoRA efficace dans les moteurs d'inférence. L'accélération provient de la réduction de la communication inter-GPU en définissant certains modules LoRA comme étant en diagonale par blocs.
Pour déterminer quels facteurs LoRA doivent être définis comme blocs diagonaux, suivez ces directives :
- Pour l'attention, configurez
- Projections Q, K, V à être en bloc diagonal LoRA-B
- Projection de sortie en bloc diagonal LoRA-A
- Pour les MLP, définissez
- Up, projection Gate à être bloquée diagonale par blocs LoRA-B
- Projection descendante à diagonale par blocs pour LoRA
Pour les autres modules et/ou architectures, consultez le code de votre moteur d'inférence cible. Les modules qui sont répartis par ligne doivent avoir LoRA-A en diagonale par blocs, tandis que les modules répartis par colonne doivent avoir LoRA-B en diagonale par blocs.