Flow-DPO e Masked Flow-DPO¶
Flow-DPO é um método experimental de destilação para modelos flow-matching que treina um adapter de baixo rank com pares preferred/rejected. No SimpleTuner ele é apenas para LoRA/LyCORIS. Full-model Flow-DPO não é suportado, e treino de text encoder é bloqueado para métodos de destilação.
O SimpleTuner reutiliza o sistema de reference dataset. O dataset normal image ou video fornece a amostra preferred, e um dataset conditioning pareado com conditioning_type=reference_strict fornece a amostra rejected. Veja conditioning_type e conditioning_data.
Como Funciona¶
Em cada batch, o SimpleTuner:
- Roda o modelo com adapter ligado nos latentes preferred.
- Roda o modelo com adapter ligado nos latentes rejected usando o mesmo prompt, noise e timestep.
- Desliga o adapter LoRA/LyCORIS e roda as duas predições como reference congelada.
- Aplica a loss de margem 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, o target é noise - latents.
Masked Flow-DPO¶
Se o batch também inclui um dataset conditioning_type=mask ou conditioning_type=segmentation, o SimpleTuner aplica a mask aos erros DPO antes da redução. Isso concentra o sinal de preferência na região que difere entre preferred e rejected.
anchor_alpha adiciona um regularizador MSE global entre as predições com adapter ligado e desligado nas amostras preferred e rejected. Esse anchor não usa mask, então limita o drift do frame inteiro.
Configuração¶
Configuração mínima:
--model_type=lora
--distillation_method=flow_dpo
--flow_custom_timesteps=801,694,548,338
--flow_timesteps_mode=round-robin
Chaves comuns 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=sumcorresponde à formulação comum do Flow-DPO.meancalcula a média de todos os elementos latentes, emasked_meancalcula a média dos elementos ativos da mask quando houver uma mask.auto_beta=trueajusta beta pela magnitude média da margem, útil em datasets pareados pequenos.flow_timesteps_mode=fixed-listamostra aleatoriamente deflow_custom_timesteps.flow_timesteps_mode=round-robinpercorreflow_custom_timestepsem ciclo. Ranks distribuídos usam offsets diferentes, e checkpoints salvam o cursor para que runs retomados continuem a mesma sequência de microbatches.sft_loss_weightpadrão é0.0, então a loss diffusion normal não é misturada.
O SimpleTuner registra os principais valores de saúde do Flow-DPO: beta, margin, vantagens win/lose, erros policy/reference, porcentagem de margins negativos e gradient factor. As métricas estendidas de reward-hacking do model card original pertencem ao tooling de análise daquele release e ainda não são todas emitidas pelo SimpleTuner.
Formato do Dataset¶
O dataset rejected deve ser pareado ao preferred com 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, adicione também o dataset de mask na mesma lista conditioning_data.
Limites¶
Flow-DPO atualmente exige:
- Modelo flow-matching.
model_type=lora.- Dataset conditioning pareado com
reference_strict. - Sem treino de text encoder.
Ele não carrega uma segunda cópia completa dos pesos. O reference pass desliga o adapter treinável, incluindo multipliers LyCORIS, e depois religa para o caminho policy.