Mesclar LoRAs vs Empilhar
Quando mesclar LoRAs em um adaptador vs empilhá-los, a matemática dos pesos e os trade-offs de qualidade.
On this page
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.
| Abordagem | O que acontece | Nº de arquivos na inferência | Source |
|---|---|---|---|
| Empilhar | Cada LoRA permanece separado; cada passagem forward aplica a atualização de cada adaptador e as soma | Vários arquivos .safetensors | Diffusers merge_loras |
| Mesclar | Todos os adaptadores são combinados em um novo LoRA (ou incorporados ao checkpoint) | Um único .safetensors ou checkpoint incorporado | kohya-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ário | Recomendação |
|---|---|
| 1–2 LoRAs, VRAM sobrando, qualidade crítica | Empilhar |
| 3+ LoRAs, VRAM apertada, ou deploy em produção | Mesclar ou incorporar |
| LoRAs atingem regiões diferentes do modelo | Empilhar — baixa interferência |
| LoRAs atingem as mesmas camadas (ex.: dois LoRAs de personagem) | Teste ambos; mesclar costuma borrar a identidade |
| Controle por bloco necessário | Mesclagem com Supermerger usando pesos de bloco |
Comparação de Ferramentas
| Ferramenta | Tipo de Mesclagem | Pesos de Bloco | Incorporar ao Ckpt | Source |
|---|---|---|---|---|
kohya-ss merge_lora.py | Soma ponderada, concat | Não | Sim | kohya-ss merge_lora.py |
| Supermerger (A1111) | Soma ponderada, Sum Twice, Add Diff, Cosine | Sim (20 SDXL) | Sim | Supermerger README |
PEFT add_weighted_adapter() | Soma ponderada, TIES, DARE | Não | Via merge_and_unload() | PEFT LoRA guide |
Diffusers set_adapters() | Apenas empilhamento em runtime | Não | Via 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
| Sintoma | Causa Provável | Correção |
|---|---|---|
| LoRA mesclado produz imagens cinzentas/quebradas | Modelos 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 personagem | Colisão de posto — adaptadores brigam pelo mesmo subespaço | Empilhe, ou treine um único LoRA multi-personagem |
merge_lora.py "weights shape mismatch" | Postos diferentes sem modo concat | Use a flag --concat ou garanta dim/alpha idênticos |
| Checkpoint incorporado perde adaptações do text encoder | LoRAs do text encoder omitidos da mesclagem | Garanta 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 runtime | Escolha 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
- Como LoRAs Funcionam — mecanismo, força, empilhamento e correspondência com modelos base
- Ferramentas de Mesclagem de Modelos— comparação completa de ferramentas de mesclagem, incluindo DARE, TIES e pesos de bloco
- Gerenciamento de Biblioteca de LoRAs — organizando, versionando e compartilhando adaptadores