PEFT documentation

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

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 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 Estratégia de Divisão Megatron. Para duas camadas lineares $W_1$, W2W_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 colunas (o que exige que o LoRA B seja bloco-diagonal) e a segunda camada de forma paralela por linhas (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, agrupando as projeções Q, K e V como W1W_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

classe peft.BdLoraConfig

< >

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

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.

Update on GitHub