ArtificialGuyBR

Home / Blog / Fixing things

Fusión de checkpoints de Stable Diffusion: pesos por bloque

Fusionar checkpoints de Stable Diffusion: suma ponderada vs add difference, pesos por bloque en SDXL, fusión vs LoRA y cómo evaluar el resultado.

12 sources cited Fixing things

Fusión de checkpoints de Stable Diffusion: pesos por bloque

TL;DR

  • Elige el método según el objetivo: la Suma Ponderada mezcla dos modelos a lo largo de una línea; la Add Difference inyecta la dirección aprendida de un modelo en otro; los pesos por bloque fijan la proporción en cada etapa de la U-Net para tomar las caras de un modelo y mantener la iluminación de otro.
  • Sum Twice usa β como peso del tercer modelo, no α·β. La operación es una mezcla anidada — lerp(lerp(A,B,α),C,β) — así que el tercer modelo entra con peso β. Varias guías de la comunidad lo indican erróneamente como α·β.
  • La fusión se ejecuta en CPU y produce un checkpoint independiente; una LoRA es un modificador en tiempo de ejecución que no puede funcionar sola. Usa una fusión cuando quieras un modelo autocontenido; usa una LoRA para intercambiar efectos al vuelo.

Fusionar dos o más checkpoints de Stable Diffusion combina sus pesos entrenados con aritmética — sin GPU, sin datos de entrenamiento, sin optimizador — y genera un nuevo archivo .safetensors. Las herramientas dominantes — el fusionador integrado de AUTOMATIC1111, SuperMerger, el Chattiori Model Merger y kohya-ss — comparten la misma matemática central. Los ejemplos apuntan a SDXL; SD 1.5…

Los cuatro métodos de fusión que importan

Método | Fórmula | Requiere | Ideal para | Source ---|---|---|---|--- Suma Ponderada (WS) | (1−α)A + αB | 2 modelos, α | Mezclar dos modelos similares | CMM, A1111 Add Difference (AD) | A + α(B − C) | 3 modelos, α | Injertar un concepto de B sobre A, usando C como base | CMM, A1111 Triple Sum (TRS) | (1−α−β)A + αB + βC | 3 modelos, α, β | Mezclar tres modelos con proporciones independientes | CMM, SuperMerger Sum Twice (ST) | (1−β)((1−α)A + αB) + βC | 3 modelos, α, β | Una mezcla en dos etapas: combinar A y B, luego incorporar C | CMM, SuperMerger

¿Cuál es la diferencia entre Suma Ponderada y Add Difference?

La Suma Ponderada interpola linealmente entre dos modelos — con α=0 la salida es el modelo A, con α=1 es el modelo B. AUTOMATIC1111 la define como A * (1 - M) + B * M; el merge.py de CMM la implementa con torch.lerp(A, B, alpha) — la misma operación bajo un parámetro distinto.

La Add Difference toma tres modelos. Escala el vector de C a B por α y lo suma sobre A — A + (B - C) * M. Úsala cuando un modelo base ya tiene el aspecto que quieres y deseas injertar un concepto sin diluir la base.

Por qué Sum Twice no es lo mismo que Triple Sum

Ambas toman tres modelos y dos proporciones, pero difieren en estructura.

La Triple Sum mezcla los tres modelos en una sola pasada: A conserva el peso 1−α−β, B recibe α, C recibe β. La Sum Twice mezcla dos veces — primero A y B con α, luego ese resultado intermedio con C en β. El código fuente de CMM hace explícita la estructura anidada:

def sum_twice(theta0, theta1, theta2, alpha, beta):
    out = torch.empty_like(theta0)
    torch.lerp(theta0, theta1, float(alpha), out=out)   # out = lerp(A,B,alpha)
    torch.lerp(out,   theta2, float(beta),  out=out)    # out = lerp(out,C,beta)
    return out

Al expandir ese segundo lerp se ve que el tercer modelo entra con peso β, no α·β. La documentación de SuperMerger coincide y publica la fórmula como $(1-\beta)((1-\alpha)A+\alpha B)+\beta C$. Algunas guías de la comunidad escriben el coeficiente de C como α·β — eso solo sería cierto si el segundo lerp usara α·β, y no lo hace. Al ajustar una fusión Sum Twice, trata β como el control que determina cuánto aparece el modelo C.

Pesos por bloque: dirigir la fusión por etapa de la U-Net

Un alpha plano aplica la misma proporción a cada tensor. La fusión ponderada por bloques — "MBW" en SuperMerger, una cadena de 20 valores en CMM — fija una proporción distinta para cada bloque de la U-Net, de modo que un bloque puede inclinarse hacia el modelo A mientras otro se inclina hacia B.

¿Qué controlan los bloques IN, OUT, MID y BASE?

La U-Net de Stable Diffusion es una pila de etapas, y una fusión ponderada por bloques las aborda una por una. El orden oficial de bloques para SDXL es:

BASE, IN00, IN01, IN02, IN03, IN04, IN05, IN06, IN07, IN08, MID00, OUT00, OUT01, OUT02, OUT03, OUT04, OUT05, OUT06, OUT07, OUT08

Son 20 valores para SDXL; SD 1.5 y 2.x llegan a 26 (IN00–IN11 y OUT00–OUT11). BASE es el codificador de texto; IN, MID y OUT son las etapas de submuestreo, cuello de botella y sobremuestreo de la U-Net. SuperMerger plantea la ventaja sin rodeos: "cada bloque puede corresponder a la representación del fondo, los personajes, el estilo artístico, etc., puedes crear una variedad de modelos fusionados cambiando la proporción de cada bloque."

En un grano más fino, las notas de fusión elemental de SuperMerger destacan las capas de atención: "attn es responsable de la información de la cara y la ropa. Las capas IN07, OUT03, OUT04 y OUT05 parecen tener una influencia particularmente fuerte." Más allá de eso, las tablas precisas de roles por bloque (p. ej. "IN00 controla los dedos") provienen de practicantes individuales y no están documentadas oficialmente — trátalas como puntos de partida para probar, no como hecho establecido.

Escribir un vector de pesos por bloque

En CMM el argumento alpha acepta una cadena separada por comas que coincide con ese orden de bloques. Un ejemplo de Sum Twice con 20 valores:

CM A + B +S C "0,1,1,0.2,0.2,0.3,0.3,0,0,0,0,0.2,0.1,0.1,0.1,0.4,0.4,0.4,0.4,0.4" \
   "0,0,0,0.3,0.3,0.2,0.2,0.3,0,0,0,0.1,0.1,0.1,0.2,0.2,0.2,0.2,0.2,0.2" Result

Aquí BASE y los primeros bloques IN se inclinan hacia B, los IN tardíos y los MID permanecen cerca de A, y los bloques OUT incorporan C — un patrón para conservar la anatomía de un modelo mientras se toma prestado el acabado de otro.

Cuándo fusionar vs usar una LoRA

¿Cuándo debo fusionar dos checkpoints en lugar de entrenar o usar una LoRA?

Una fusión produce un checkpoint autocontenido sin archivo adaptador. Una LoRA (Low-Rank Adaptation) congela los pesos base e inyecta dos matrices pequeñas de bajo rango por capa adaptada, aplicadas sobre un checkpoint en inferencia. El artículo original de LoRA muestra que esto reduce los parámetros entrenables en unas 10.000× para modelos grandes; en la práctica una LoRA de Stable Diffusion pesa 2–200 MB frente a un checkpoint de 2–7 GB — "normalmente de 10 a 100 veces más pequeña", según la guía de stable-diffusion-art.

Esa diferencia de tamaño es el factor decisivo. Recurre a una fusión cuando quieras un solo modelo que "simplemente funcione" sin ajustar un peso de LoRA en cada prompt — una mezcla de personajes, una fusión de estilo permanente o una base para redistribuir. Recurre a una LoRA cuando quieras superponer efectos al vuelo, probar muchos estilos sin guardar checkpoints completos o apilar varios modificadores en una imagen. Dado que una LoRA "no puede usarse sola" y "debe usarse con un archivo de checkpoint de modelo", es la herramienta equivocada cuando tu objetivo es un entregable independiente.

Hornear una LoRA en un checkpoint

Los dos enfoques se encuentran en el "horneado". La función Merge-to-Checkpoint de SuperMerger y el lora_bake.py de CMM (el operador LB del Universal Model Merge Scripter) incorporan una o más LoRAs de forma permanente en los pesos de un checkpoint, con proporciones que "pueden ser cualquier valor, incluidos valores negativos. No hay ninguna restricción de que la total deba sumar 1." Hornear cambia la flexibilidad en tiempo de ejecución por un modelo autocontenido. Para el entrenamiento de LoRA en sí, consulta la guía gratuita de entrenamiento de LoRA y la referencia de parámetros de LoRA para Flux.

DARE: eliminar y reescalar parámetros delta

¿Qué es la fusión DARE y por qué elimina y reescala parámetros?

DARE (Drop And REscale) proviene del artículo de modelos de lenguaje "Language Models are Super Mario" y fue adaptado a Stable Diffusion por el repositorio safetensors-merge-supermario (la implementación de referencia del artículo es MergeLM). Cero aleatoriamente una fracción p de los parámetros delta (la diferencia entre los pesos de dos modelos) y reescala los supervivientes por $1/(1-p)$ para preservar la magnitud general de la capa.

El razonamiento del artículo es específico del ajuste fino supervisado: SFT cambia muy pocos parámetros, con magnitudes pequeñas, y la mayor parte de ese cambio es redundante. Eliminar el 90% o incluso el 99% de esos deltas y reescalar el resto "preserva aproximadamente los embeddings originales". Se derivan dos advertencias:

  • El reescalado es obligatorio. "La operación de reescalado es crucial para garantizar el éxito de DARE, y eliminar el 30% o el 40% de los parámetros delta sin reescalado produciría resultados notablemente peores."
  • DARE asume deltas pequeños. El artículo reporta deltas de SFT típicamente dentro de ~0.002, y advierte que "una vez que los modelos pasan por preentrenamiento continuo, los parámetros delta pueden alcanzar rápidamente alrededor de 0.03, haciendo DARE inviable." La adaptación a modelos de imagen aplica la misma aritmética a (model1 − model0), pero la garantía de poda del 90–99% se midió en tareas de lenguaje, no en checkpoints de difusión — no asumas que las mismas tasas se trasladan.

En CMM el operador +D corresponde al modo DARE, con alpha como fuerza de mezcla y beta como probabilidad de eliminación p, reproducible mediante --seed.

¿Necesito una GPU para fusionar checkpoints de Stable Diffusion?

No. La fusión es aritmética pura de pesos — sumar, escalar, lerp — ejecutada clave por clave sobre los state dicts, sin pasada hacia adelante, datos ni optimizador. CMM "se ejecuta en CPU por defecto (GPU opcional)", y el artículo de DARE describe el método como algo que no requiere "ninguna GPU". La restricción real es la memoria: el autor de SuperMerger señala que "se requiere un mínimo de 64 GB de memoria CPU para la fusión del modelo XL", y ejecutar otras aplicaciones junto a una fusión grande de SDXL puede desestabilizar el sistema.

Errores comunes y soluciones

Síntoma | Causa | Solución | Source ---|---|---|--- El modelo fusionado se ve "quemado" o sobresaturado tras varios pasos de Add Difference | Apilar diferencias grandes (B−C) con α alto acumula interferencia destructiva | Cambia a smoothAdd (add difference filtrada con mediana y gaussiano), o baja α; smoothAdd con α=1 es más débil que el Add normal, así que α puede subirse hacia 2 | SuperMerger calcmode trainDifference distorsiona el modelo objetivo | La base real del modelo es una mezcla desconocida (p. ej. SD1.4/1.5), así que el "entrenamiento" se mide desde el ancestro equivocado | Usa trainDifference solo en la dirección donde se conoce la base de preentrenamiento real del modelo | SuperMerger calcmode Los prompts simples "derraman" un concepto (p. ej. "ojos azules" tiñe toda la imagen) tras muchas fusiones | El entrenamiento acumulado hace que la comprensión del CLIP/codificador de texto se vuelva "pesada" | Divide el modelo fusionado en clipA (clip base) y clipB (clip entrenado) y haz una suma ponderada para suavizar el CLIP | SuperMerger calcmode DARE degrada con tasas de eliminación altas | Se omitió el reescalado | Reescala siempre por $1/(1-p)$; solo eliminar empeora visiblemente los resultados | Artículo DARE

Cómo evaluar un modelo fusionado

No existe una puntuación automatizada para "es buena esta fusión". El flujo de trabajo estándar es una cuadrícula XYZ: barre la(s) proporción(es) de fusión contra un prompt y una semilla fijos para poder ver cómo cada alpha, beta o preajuste de pesos por bloque cambia la salida sin guardar un checkpoint nuevo cada vez. El XYZ Plot de SuperMerger "realiza generación de imágenes de fusión secuencial" en todos los modos de fusión.

Para una lectura predictiva, la pestaña Analysis de SuperMerger cuantifica la diferencia por bloque entre dos modelos con similitud de coseno, y su modo "ASimilality" sobre tensores qkv "da un resultado que está más cerca de la diferencia en las imágenes de salida." Úsalo antes de fusionar para predecir qué bloques se moverán, luego confirma con la cuadrícula XYZ usando un muestreador, programador y semilla fijos (consulta la referencia de muestreadores y programadores) para que cualquier cambio visible provenga de la fusión, no de la configuración de generación.

FAQ

¿Cuál es la diferencia entre Suma Ponderada y Add Difference al fusionar checkpoints?

La Suma Ponderada mezcla dos modelos con (1−α)A + αB; la Add Difference añade una dirección escalada A + α(B − C), usando C como la base desde la que B fue ajustada. Usa WS para mezclar dos modelos similares; usa AD para injertar un concepto sobre una base que quieres preservar.

¿Por qué Sum Twice da al modelo C un peso de β y no α·β?

Sum Twice es un lerp anidado: lerp(lerp(A,B,α),C,β), que se expande como (1−β)((1−α)A + αB) + βC. El coeficiente de C es β, no α·β — esto último solo sería cierto si el segundo lerp usara α·β como proporción, y usa β.

¿Qué controlan los bloques IN, OUT, MID y BASE en una fusión de Stable Diffusion?

BASE es el codificador de texto; IN, MID y OUT son las etapas de submuestreo, cuello de botella y sobremuestreo de la U-Net. SuperMerger documenta que los bloques "pueden corresponder a la representación del fondo, los personajes, el estilo artístico", y que las capas de atención más IN07/OUT03/OUT04/OUT05 afectan fuertemente a caras y ropa. Las tablas de roles por bloque más granulares son intuición de practicantes, no documentación oficial.

¿Necesito una GPU para fusionar checkpoints de Stable Diffusion?

No. La fusión es aritmética sobre los tensores de peso sin pasada hacia adelante ni entrenamiento; CMM se ejecuta en CPU por defecto, y el artículo de DARE describe el método como algo que no requiere "ninguna GPU". La restricción real es la RAM del sistema — SuperMerger señala 64 GB como mínimo para fusiones SDXL.

¿Cuándo debo fusionar dos checkpoints en lugar de usar una LoRA?

Fusiona cuando quieras un único checkpoint autocontenido — una fusión de estilo permanente o un modelo que vas a redistribuir. Usa una LoRA cuando quieras intercambiar efectos por prompt o mantener el almacenamiento pequeño, ya que una LoRA no puede funcionar sola y es unas 10–100× más pequeña que un checkpoint.

¿Qué es la fusión DARE y por qué elimina y reescala parámetros?

DARE pone a cero una fracción p de los parámetros delta entre dos modelos y reescala los supervivientes por $1/(1-p)$. El artículo muestra que los deltas de SFT son pequeños y muy redundantes, así que la mayoría puede eliminarse sin perder capacidad — pero solo si el reescalado permanece activo y los deltas son realmente pequeños.

¿Cómo evalúo si un checkpoint fusionado es mejor que sus padres?

Ejecuta una cuadrícula XYZ barriendo las proporciones de fusión contra un prompt y una semilla fijos, manteniendo muestreador, pasos y CFG constantes. Para una comprobación predictiva, la pestaña Analysis de SuperMerger mide la similitud de coseno por bloque, con un modo ASimilality sobre tensores qkv que sigue la diferencia en las imágenes de salida.

¿Puedo hornear una LoRA de forma permanente en un checkpoint, y en qué se diferencia de una fusión?

Sí. Hornear incorpora los deltas de bajo rango de una LoRA en los pesos del checkpoint para que el resultado funcione sin archivo adaptador; varias LoRAs pueden hornearse a la vez con proporciones que no necesitan sumar 1. La diferencia con una fusión simple es la entrada — las pequeñas matrices delta de una LoRA frente a los pesos de dos modelos completos.