Flow-DPO y Masked Flow-DPO¶
Flow-DPO es un método experimental de destilación para modelos flow-matching que entrena un adapter de bajo rango con pares preferred/rejected. En SimpleTuner solo se admite LoRA/LyCORIS. No se admite full-model Flow-DPO, y el entrenamiento del text encoder queda bloqueado para los métodos de destilación.
SimpleTuner reutiliza el sistema de reference datasets. El dataset normal image o video aporta la muestra preferred, y un dataset conditioning emparejado con conditioning_type=reference_strict aporta la muestra rejected. Consulta conditioning_type y conditioning_data.
Qué Hace¶
En cada batch, SimpleTuner:
- Ejecuta el modelo con adapter activado sobre los latentes preferred.
- Ejecuta el modelo con adapter activado sobre los latentes rejected con el mismo prompt, noise y timestep.
- Desactiva el adapter LoRA/LyCORIS y repite ambas predicciones como reference congelada.
- Aplica la pérdida de margen Flow-DPO.
win_adv = L(reference_win, target_win) - L(policy_win, target_win)
lose_adv = L(policy_lose, target_lose) - L(reference_lose, target_lose)
loss = -logsigmoid(beta / 2 * (win_adv + lose_adv))
Para modelos flow-matching, el target es noise - latents.
Masked Flow-DPO¶
Si el batch también incluye un dataset conditioning_type=mask o conditioning_type=segmentation, SimpleTuner aplica esa mask a los errores DPO antes de reducirlos. Esto concentra la señal de preferencia en la región que cambia entre preferred y rejected.
anchor_alpha añade un regularizador MSE global entre las predicciones con adapter activado y desactivado tanto en las muestras preferred como rejected. Este anchor no usa mask, así que limita el drift de todo el frame.
Configuración¶
Configuración mínima:
--model_type=lora
--distillation_method=flow_dpo
--flow_custom_timesteps=801,694,548,338
--flow_timesteps_mode=round-robin
Claves comunes de distillation_config:
{
"flow_dpo": {
"beta": 1.0,
"auto_beta": true,
"auto_beta_target_gf": 0.2,
"auto_beta_decay": 0.99,
"norm_type": "sum",
"mask_dilate": 1,
"anchor_alpha": 0.0,
"sft_loss_weight": 0.0
}
}
norm_type=sumcoincide con la formulación habitual de Flow-DPO.meanpromedia todos los elementos latentes, ymasked_meanpromedia los elementos activos de la mask cuando hay una mask.auto_beta=trueadapta beta con la magnitud media de la margen, útil para datasets pareados pequeños.flow_timesteps_mode=fixed-listmuestrea aleatoriamente deflow_custom_timesteps.flow_timesteps_mode=round-robinrecorreflow_custom_timestepsen ciclo. Los ranks distribuidos usan offsets distintos, y los checkpoints guardan el cursor para que los runs reanudados continúen la misma secuencia de microbatches.sft_loss_weightpor defecto es0.0, así que no se mezcla la diffusion loss normal.
SimpleTuner registra los valores principales de salud Flow-DPO: beta, margin, ventajas win/lose, errores policy/reference, porcentaje de margins negativos y gradient factor. Las métricas extendidas de reward-hacking del model card original pertenecen al tooling de análisis de esa release y todavía no se emiten todas desde SimpleTuner.
Forma del Dataset¶
El dataset rejected debe emparejarse con el preferred usando reference_strict:
[
{
"id": "preferred",
"dataset_type": "image",
"type": "local",
"instance_data_dir": "/data/win",
"conditioning_data": ["rejected"]
},
{
"id": "rejected",
"dataset_type": "conditioning",
"conditioning_type": "reference_strict",
"type": "local",
"instance_data_dir": "/data/lose",
"source_dataset_id": "preferred"
}
]
Para Masked Flow-DPO, añade también el dataset de mask a la misma lista conditioning_data.
Límites¶
Flow-DPO actualmente requiere:
- Un modelo flow-matching.
model_type=lora.- Un dataset conditioning emparejado con
reference_strict. - Sin entrenamiento de text encoder.
No carga una segunda copia completa de los pesos. El reference pass desactiva el adapter entrenable, incluidos los multipliers LyCORIS, y luego lo reactiva para la ruta policy.