# LoRA Bloco-Diagonal para Eliminar o Overhead de Comunicação no Servimento de LoRA Paralelo em Tensors

Block-Diagonal LoRA (BD-LoRA) é uma variante do LoRA na qual alguns fatores do LoRA são restritos a serem bloco-diagonais. Isso permite um atendimento mais rápido ao eliminar os sobrecustos de comunicação ao executar inferência em múltiplas GPUs. Apesar da restrição bloco-diagonal, o BD-LoRA apresenta desempenho semelhante ao do LoRA padrão para contagens de parâmetros equivalentes.

O BD-LoRA foi projetado para ser usado com paralelismo de tensor, o que significa dividir os pesos de um modelo entre várias GPUs. Uma estratégia de divisão popular é a [Megatron Sharding Strategy](https://arxiv.org/abs/1909.08053). Para duas camadas lineares $W_1$, $W_2$ que se seguem (por exemplo, as projeções up e down em um módulo MLP de um transformer), dividiremos a primeira camada de forma paralela por coluna (o que exige que o LoRA B seja bloco-diagonal) e a segunda camada de forma paralela por linha (o que exige que o LoRA A seja bloco-diagonal). Para o módulo de atenção, isso pode ser alcançado de forma semelhante, tomando as projeções Q, K e V juntas como $W_1$ e a projeção de saída como $W_2$, dividindo-as de acordo. Essa divisão permite que um mecanismo de inferência compatível distribua cada fragmento bloco-diagonal em uma GPU diferente, reduzindo a necessidade de comunicar resultados parciais entre as GPUs. Na imagem abaixo, você pode ver a estratégia exata de divisão e como isso economiza esforços computacionais.

Artigo: https://hf.co/papers/2510.23346

### Desempenho, classificação e número de parâmetros
BD-LoRA atinge desempenho semelhante ao do LoRA (veja a imagem abaixo ou a pasta `method_comparison` na raiz do repositório peft) com a mesma contagem de parâmetros. No entanto, como todos os outros fatores no BD-LoRA são bloco-diagonais, um adaptador BD-LoRA terá menos parâmetros do que um adaptador LoRA no mesmo rank. O desempenho do BD-LoRA é competitivo apenas quando o rank é aumentado de forma correspondente. Fornecemos código de exemplo para correspondência de rank no final deste notebook de exemplo.

# API

## BdLoraConfig[[peft.BdLoraConfig]]

#### peft.BdLoraConfig[[peft.BdLoraConfig]]

```python
peft.BdLoraConfig(target_modules_bd_a: Optional[list[str]] = None, target_modules_bd_b: Optional[list[str]] = None, nblocks: int = 1, match_strict: bool = True)
```

[Fonte](https://github.com/huggingface/peft/blob/main/src/peft/tuners/lora/config.py#L189)

**Parâmetros:**

target_modules_bd_a : Módulos em que o LoRA-A é bloco-diagonal. Cada padrão na lista é correspondido ao nome do módulo via `pattern is in target_name`. Exemplo: ['up_proj', 'q_proj', 'v_proj', 'k_proj']

target_modules_bd_b : Módulos em que o LoRA-B é bloco-diagonal. Cada padrão na lista é correspondido ao nome do módulo via `pattern is in target_name`. Exemplo: ['out_proj', 'down_proj']

nblocks : Número de blocos em matrizes bloco-diagonais

match_strict : Se definido como true, exige que cada target_module tenha um LoRA-A ou LoRA-B em bloco diagonal, e lança um erro caso contrário. Você pode definir isso como False para misturar o treinamento de LoRA e BD-LoRA, por exemplo, se algumas camadas do seu módulo não se beneficiarem do BD-LoRA.

Configuração para BD-LoRA (Block-Diagonal LoRA). O BD-LoRA é uma variante do LoRA que pode ser usada para servir múltiplos LoRA de forma eficiente em motores de inferência. A aceleração resulta da redução da comunicação entre GPUs ao definir certos módulos LoRA como bloco-diagonais.

Para determinar quais fatores de LoRA devem ser definidos como bloco-diagonais, siga estas diretrizes:
- Para a atenção, defina
  - Projeções Q,K,V para serem bloco-diagonais em LoRA-B
  - Projeção de saída para ser bloco-diagonal LoRA-A
- Para MLPs, defina
  - Up, projeção Gate para ser bloco-diagonal LoRA-B
  - Projeção descendente para ser bloco diagonal LoRA-A

Para outros módulos e/ou arquiteturas, consulte o código do seu motor de inferência de destino. Módulos que são particionados por linha devem ter LoRA-A bloco-diagonal, e módulos que são particionados por coluna devem ter LoRA-B bloco-diagonal.

