ArtificialGuyBR

Home / Blog / Training LoRAs

Mesclar LoRAs vs Empilhar

Quando mesclar LoRAs em um adaptador vs empilhá-los, a matemática dos pesos e os trade-offs de qualidade.

7 sources cited Training LoRAs

Mesclar LoRAs vs Empilhar

TL;DR

  • Mesclar combina as matrizes de peso de múltiplos LoRAs em um único adaptador antes da inferência — uma passagem forward, menor pegada de VRAM, geração mais rápida.
  • Empilhar carrega cada LoRA separadamente e soma suas contribuições a cada passagem forward — preserva as otimizações individuais, mas usa mais memória e computação.
  • Mescle quando: precisa de simplicidade de deploy, limites rígidos de VRAM ou um único arquivo distribuível. Empilhe quando: a qualidade máxima por adaptador importa e você pode pagar o custo extra.
  • Custo de qualidade: a mesclagem pode perder adaptações finas, pois cada LoRA foi treinado de forma independente; nenhum ótimo global é garantido.

O Que "Mesclar" e "Empilhar" Realmente Significam

Um adaptador LoRA é um par de matrizes de baixo posto (lora_down e lora_up, ou A e B) que representa uma alteração na matriz de pesos do modelo base: ΔW = B × A. O posto r é muito menor que as dimensões originais, mantendo o adaptador minúsculo — uma pequena fração do tamanho do modelo base.

AbordagemO que aconteceNº de arquivos na inferênciaSource
EmpilharCada LoRA permanece separado; cada passagem forward aplica a atualização de cada adaptador e as somaVários arquivos .safetensorsDiffusers merge_loras
MesclarTodos os adaptadores são combinados em um novo LoRA (ou incorporados ao checkpoint)Um único .safetensors ou checkpoint incorporadokohya-ss merge_lora.py

A maioria das UIs (Automatic1111, ComfyUI, Forge) usa empilhamento por padrão — você carrega vários LoRAs, atribui um peso a cada um, e o software os aplica todos em tempo de execução. O mesclador base do AUTOMATIC1111 implementa a fórmula de soma ponderada (1−α)A + αB que muitas ferramentas reutilizam AUTOMATIC1111 merger. Mesclar é um passo offline explícito, com ferramentas como o merge_lora.py do kohya-ss, a extensão Supermerger Civitai #1540, ou o add_weighted_adapter() do PEFT.


Como a Matemática dos Pesos Diferencia

LoRA único

Para uma matriz de pesos base W₀ ∈ ℝ^(d×k), um LoRA adiciona:

W = W₀ + (α / r) · B A

onde B ∈ ℝ^(d×r), A ∈ ℝ^(r×k), r ≪ min(d,k), e α é uma constante de escala definida no treinamento. Uma força de runtime s modula ainda mais o efeito:

W = W₀ + s · (α / r) · B A

Isso é uma adição linear — os pesos base nunca mudam em disco. O artigo original do LoRA confirma a formulação de mesclagem no deploy com custo de latência zero arXiv:2106.09685.

Empilhar vs Mesclar

Empilhar aplica a atualização de cada adaptador de forma independente e as soma em runtime. A estrutura de posto de cada adaptador é preservada: um LoRA de personagem de posto 16 e um LoRA de estilo de posto 32 mantêm sua decomposição original.

Mesclar colapsa os adaptadores em um único par de matrizes antes da inferência. Para uma soma ponderada de LoRAs com razões w_i:

W_merged = W₀ + Σᵢ [ w_i · (α_i / r_i) · B_i A_i ]

O merge_lora.py do kohya-ss implementa isso concatenando as matrizes B na dimensão de saída e A na dimensão de entrada, depois escalando cada uma por alpha / dim × ratio kohya-ss merge_lora.py. O Supermerger adiciona controle por bloco — razões de mesclagem diferentes para blocos diferentes da U-Net — mas a matemática subjacente é a mesma soma ponderada Supermerger README.

Incorporar ao Checkpoint

Dobrar o LoRA mesclado diretamente no modelo base (W_final = W₀ + ΔW_merged) produz um checkpoint padrão com zero sobrecarga de adaptador. É o que o "Merge to Checkpoint" do Supermerger e o merge_to_sd_model() do kohya-ss fazem — o modelo é o modelo adaptado.


Quando Mesclar Vence o Empilhamento

VRAM e memória. Cada LoRA empilhado carrega suas matrizes na memória da GPU junto com o modelo base. Modelos mesclados ou incorporados têm um único conjunto de matrizes de adaptador (ou nenhum). Em VRAM limitada com vários LoRAs, mesclar costuma evitar OOM.

Latência de inferência. Empilhar significa n multiplicações de matriz adicionais por camada alvo por passo. Mesclar significa uma. Ao longo de muitos passos, a economia se acumula — especialmente com torch.compile.

Deploy. Um único arquivo .safetensors ou checkpoint incorporado é trivial de carregar e compartilhar em produção. Sem lógica de gerenciamento de adaptadores, sem código de agendamento de pesos.

Compilação e quantização. torch.compile e quantização (bitsandbytes, AWQ, GPTQ) funcionam melhor em grafos estáticos. LoRAs empilhados introduzem controle de fluxo dinâmico que pode disparar recompilação; um modelo mesclado é um nn.Module comum.


O Custo de Qualidade de Colapsar Adaptadores

Por Que a Mesclagem Pode Degradar os Resultados

Cada LoRA é treinado de forma independente. Ao mesclar com uma simples soma ponderada, você assume que a adaptação combinada ótima é uma combinação linear dos ótimos individuais. Nem isso, nem a não interferência dos subespaços de posto, é garantido. Na prática, LoRAs mesclados às vezes borram conceitos distintos — um LoRA de personagem e um LoRA de estilo mesclados podem gerar um personagem que quase parece certo, mas carece das assinaturas nítidas do estilo.

A documentação do Supermerger reconhece que a opção "SAME TO STRENGTH" (usar √ratio durante a mesclagem) é necessária para que o resultado mesclado corresponda ao comportamento em runtime — a simples soma ponderada não preserva a semântica de escala de cada adaptador Supermerger README.

Quando Empilhar Preserva Melhor a Qualidade

Empilhar aplica cada adaptador em sua força nativa, treinada, modulada apenas pelo peso de runtime do usuário. A geometria interna de cada adaptador permanece intacta, então subespaços limpos para conceitos diferentes podem coexistir sem a média que a mesclagem impõe.

Guia Prático

CenárioRecomendação
1–2 LoRAs, VRAM sobrando, qualidade críticaEmpilhar
3+ LoRAs, VRAM apertada, ou deploy em produçãoMesclar ou incorporar
LoRAs atingem regiões diferentes do modeloEmpilhar — baixa interferência
LoRAs atingem as mesmas camadas (ex.: dois LoRAs de personagem)Teste ambos; mesclar costuma borrar a identidade
Controle por bloco necessárioMesclagem com Supermerger usando pesos de bloco

Comparação de Ferramentas

FerramentaTipo de MesclagemPesos de BlocoIncorporar ao CkptSource
kohya-ss merge_lora.pySoma ponderada, concatNãoSimkohya-ss merge_lora.py
Supermerger (A1111)Soma ponderada, Sum Twice, Add Diff, CosineSim (20 SDXL)SimSupermerger README
PEFT add_weighted_adapter()Soma ponderada, TIES, DARENãoVia merge_and_unload()PEFT LoRA guide
Diffusers set_adapters()Apenas empilhamento em runtimeNãoVia fuse_lora()Diffusers merge_loras

TIES e DARE (PEFT) podam pesos pequenos e resolvem conflitos de sinal antes de averaging. Eles podem se aplicar a matrizes LoRA, mas a evidência específica para adaptadores é rasa — trate como experimental.


Erros comuns e correções

SintomaCausa ProvávelCorreção
LoRA mesclado produz imagens cinzentas/quebradasModelos base incompatíveis (SD1.5 em SDXL)Verifique se todos os LoRAs compartilham a mesma arquitetura base
Queda de qualidade após mesclar dois LoRAs de personagemColisão de posto — adaptadores brigam pelo mesmo subespaçoEmpilhe, ou treine um único LoRA multi-personagem
merge_lora.py "weights shape mismatch"Postos diferentes sem modo concatUse a flag --concat ou garanta dim/alpha idênticos
Checkpoint incorporado perde adaptações do text encoderLoRAs do text encoder omitidos da mesclagemGaranta que os LoRAs do text encoder estão na lista de entrada
"SAME TO STRENGTH" difere da força em runtime√ratio na mesclagem vs escala linear em runtimeEscolha um fluxo e mantenha consistência

FAQ

Quando a mesclagem produz resultados melhores que o empilhamento? Mesclar não produz qualidade melhor por natureza — troca qualidade por eficiência. Ganha quando as restrições de VRAM, velocidade ou deploy importam mais que a fidelidade por adaptador.

Como a mesclagem afeta a qualidade em comparação ao empilhamento? Mesclar faz a média das atualizações de baixo posto, o que pode borrar limites entre conceitos. Empilhar preserva a geometria de cada adaptador, mas adiciona sobrecarga de inferência. A diferença é maior quando os adaptadores atingem as mesmas camadas.

Como escolher entre os dois? Comece com empilhamento. Se bater em OOM, limites de latência ou restrições de deploy, mescle com kohya-ss ou Supermerger. Teste os dois lado a lado — a diferença depende do caso.


Leitura Adicional