Skip to content

Commit d1bc070

Browse files
authored
Merge pull request #2434 from bghira/main
4.0.1 merge
2 parents 52efc0b + 59cd5a5 commit d1bc070

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

64 files changed

+3763
-376
lines changed

documentation/DATALOADER.es.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,12 @@ Tanto `textfile` como `parquet` soportan multi-captions:
178178
- Los textfiles se dividen por saltos de línea. Cada nueva línea será un caption independiente.
179179
- Las tablas parquet pueden tener un tipo iterable en el campo.
180180

181+
### `disable_multiline_split`
182+
183+
- Cuando se establece a `true`, evita que los archivos de texto de caption se dividan por saltos de línea en múltiples variantes de caption.
184+
- Útil cuando tus captions contienen saltos de línea intencionales que deben preservarse como un único caption.
185+
- Por defecto: `false` (los captions se dividen por saltos de línea)
186+
181187
### `metadata_backend`
182188

183189
- **Valores:** `discovery` | `parquet` | `huggingface`
@@ -662,6 +668,7 @@ En orden, las líneas se comportan así:
662668
"instance_prompt": "something to label every image",
663669
"only_instance_prompt": false,
664670
"caption_strategy": "filename|instanceprompt|parquet|textfile",
671+
"disable_multiline_split": false,
665672
"cache_dir_vae": "/path/to/vaecache",
666673
"vae_cache_clear_each_epoch": true,
667674
"probability": 1.0,

documentation/DATALOADER.hi.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,12 @@ Metadata discovery के दौरान loader प्रत्येक file
178178
- textfiles नई पंक्तियों पर split होते हैं। हर नई पंक्ति अलग caption होगी।
179179
- parquet tables में field iterable type हो सकता है।
180180

181+
### `disable_multiline_split`
182+
183+
- जब `true` पर सेट किया जाता है, तो caption text files को newlines द्वारा multiple caption variants में split होने से रोकता है।
184+
- उपयोगी जब आपके captions में intentional line breaks हों जिन्हें एक single caption के रूप में संरक्षित रखना हो।
185+
- Default: `false` (captions newlines द्वारा split होते हैं)
186+
181187
### `metadata_backend`
182188

183189
- **Values:** `discovery` | `parquet` | `huggingface`
@@ -662,6 +668,7 @@ s/this/will be found and replaced/
662668
"instance_prompt": "something to label every image",
663669
"only_instance_prompt": false,
664670
"caption_strategy": "filename|instanceprompt|parquet|textfile",
671+
"disable_multiline_split": false,
665672
"cache_dir_vae": "/path/to/vaecache",
666673
"vae_cache_clear_each_epoch": true,
667674
"probability": 1.0,

documentation/DATALOADER.ja.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,12 @@ Hugging Face の音声データセットでは、キャプション(プロン
178178
- textfile は改行で分割され、各行が別キャプションになります。
179179
- parquet テーブルはフィールドに iterable 型を持てます。
180180

181+
### `disable_multiline_split`
182+
183+
- `true` に設定すると、キャプションテキストファイルが改行で複数のキャプションバリアントに分割されなくなります。
184+
- 意図的な改行を含むキャプションを単一のキャプションとして保持したい場合に便利です。
185+
- デフォルト: `false`(改行でキャプションを分割)
186+
181187
### `metadata_backend`
182188

183189
- **値:** `discovery` | `parquet` | `huggingface`
@@ -663,6 +669,7 @@ s/this/will be found and replaced/
663669
"instance_prompt": "something to label every image",
664670
"only_instance_prompt": false,
665671
"caption_strategy": "filename|instanceprompt|parquet|textfile",
672+
"disable_multiline_split": false,
666673
"cache_dir_vae": "/path/to/vaecache",
667674
"vae_cache_clear_each_epoch": true,
668675
"probability": 1.0,

documentation/DATALOADER.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,12 @@ Both `textfile` and `parquet` support multi-captions:
212212
- textfiles are split by newlines. Each new line will be its own separate caption.
213213
- parquet tables can have an iterable type in the field.
214214

215+
### `disable_multiline_split`
216+
217+
- When set to `true`, prevents caption text files from being split by newlines into multiple caption variants.
218+
- Useful when your captions contain intentional line breaks that should be preserved as a single caption.
219+
- Default: `false` (captions are split by newlines)
220+
215221
### `metadata_backend`
216222

217223
- **Values:** `discovery` | `parquet` | `huggingface`
@@ -696,6 +702,7 @@ In order, the lines behave as follows:
696702
"instance_prompt": "something to label every image",
697703
"only_instance_prompt": false,
698704
"caption_strategy": "filename|instanceprompt|parquet|textfile",
705+
"disable_multiline_split": false,
699706
"cache_dir_vae": "/path/to/vaecache",
700707
"vae_cache_clear_each_epoch": true,
701708
"probability": 1.0,

documentation/DATALOADER.pt-BR.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,12 @@ Tanto `textfile` quanto `parquet` suportam multi-captions:
178178
- textfiles são separadas por novas linhas. Cada nova linha será sua própria caption.
179179
- tabelas parquet podem ter um tipo iterável no campo.
180180

181+
### `disable_multiline_split`
182+
183+
- Quando definido como `true`, impede que arquivos de texto de caption sejam divididos por novas linhas em múltiplas variantes de caption.
184+
- Útil quando suas captions contêm quebras de linha intencionais que devem ser preservadas como uma única caption.
185+
- Padrão: `false` (captions são divididas por novas linhas)
186+
181187
### `metadata_backend`
182188

183189
- **Valores:** `discovery` | `parquet` | `huggingface`
@@ -662,6 +668,7 @@ Em ordem, as linhas se comportam da seguinte forma:
662668
"instance_prompt": "something to label every image",
663669
"only_instance_prompt": false,
664670
"caption_strategy": "filename|instanceprompt|parquet|textfile",
671+
"disable_multiline_split": false,
665672
"cache_dir_vae": "/path/to/vaecache",
666673
"vae_cache_clear_each_epoch": true,
667674
"probability": 1.0,

documentation/DATALOADER.zh.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,12 @@
178178
- textfile 以换行拆分,每行作为一个字幕。
179179
- parquet 表的字段可以是可迭代类型。
180180

181+
### `disable_multiline_split`
182+
183+
- 当设为 `true` 时,阻止字幕文本文件按换行符拆分为多个字幕变体。
184+
- 适用于包含有意换行的字幕,希望保持为单一字幕的情况。
185+
- 默认值: `false`(按换行符拆分字幕)
186+
181187
### `metadata_backend`
182188

183189
- **取值:** `discovery` | `parquet` | `huggingface`
@@ -663,6 +669,7 @@ s/this/will be found and replaced/
663669
"instance_prompt": "something to label every image",
664670
"only_instance_prompt": false,
665671
"caption_strategy": "filename|instanceprompt|parquet|textfile",
672+
"disable_multiline_split": false,
666673
"cache_dir_vae": "/path/to/vaecache",
667674
"vae_cache_clear_each_epoch": true,
668675
"probability": 1.0,

documentation/OPTIONS.es.md

Lines changed: 175 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,16 @@ Donde `foo` es tu entorno de configuración; o simplemente usa `config/config.js
171171
- **Qué**: Ruta al modelo Gemma preentrenado o su identificador en <https://huggingface.co/models>.
172172
- **Por qué**: Al entrenar modelos basados en Gemma (por ejemplo LTX-2, Sana o Lumina2), puedes apuntar a un checkpoint Gemma compartido sin cambiar la ruta del modelo base de difusión.
173173

174+
### `--custom_text_encoder_intermediary_layers`
175+
176+
- **Qué**: Sobrescribe qué capas de estado oculto extraer del encoder de texto para modelos FLUX.2.
177+
- **Formato**: Array JSON de índices de capas, ej: `[10, 20, 30]`
178+
- **Por defecto**: Se usan los valores por defecto específicos del modelo cuando no se establece:
179+
- FLUX.2-dev (Mistral-3): `[10, 20, 30]`
180+
- FLUX.2-klein (Qwen3): `[9, 18, 27]`
181+
- **Por qué**: Permite experimentar con diferentes combinaciones de estados ocultos del encoder de texto para alineación personalizada o propósitos de investigación.
182+
- **Nota**: Esta opción es experimental y solo aplica a modelos FLUX.2. Cambiar los índices de capas invalidará los embeddings de texto en caché y requerirá regenerarlos. El número de capas debe coincidir con la entrada esperada por el modelo (3 capas).
183+
174184
### `--gradient_checkpointing`
175185

176186
- **Qué**: Durante el entrenamiento, los gradientes se calcularán por capa y se acumularán para ahorrar en los requisitos máximos de VRAM a costa de un entrenamiento más lento.
@@ -393,6 +403,30 @@ Esto es útil para herramientas de monitoreo que reciben webhooks de múltiples
393403
- **Qué**: El nombre del modelo en Huggingface Hub y el directorio de resultados locales.
394404
- **Por qué**: Este valor se usa como nombre de directorio bajo la ubicación especificada como `--output_dir`. Si se proporciona `--push_to_hub`, este se convertirá en el nombre del modelo en Huggingface Hub.
395405

406+
### `--modelspec_comment`
407+
408+
- **Qué**: Texto incorporado en los metadatos del archivo safetensors como `modelspec.comment`
409+
- **Por defecto**: None (deshabilitado)
410+
- **Notas**:
411+
- Visible en visualizadores de modelos externos (ComfyUI, herramientas de info de modelos)
412+
- Acepta una cadena o un array de cadenas (unidas con saltos de línea)
413+
- Soporta marcadores `{env:VAR_NAME}` para sustitución de variables de entorno
414+
- Cada checkpoint usa el valor de configuración actual en el momento del guardado
415+
416+
**Ejemplo (cadena)**:
417+
```json
418+
"modelspec_comment": "Entrenado en mi dataset personalizado v2.1"
419+
```
420+
421+
**Ejemplo (array para múltiples líneas)**:
422+
```json
423+
"modelspec_comment": [
424+
"Ejecución de entrenamiento: experiment-42",
425+
"Dataset: custom-portraits-v2",
426+
"Notas: {env:TRAINING_NOTES}"
427+
]
428+
```
429+
396430
### `--disable_benchmark`
397431

398432
- **Qué**: Desactiva la validación/benchmark de arranque que ocurre en el paso 0 sobre el modelo base. Estas salidas se concatenan al lado izquierdo de tus imágenes de validación del modelo entrenado.
@@ -612,6 +646,79 @@ Muchas configuraciones se establecen a través del [dataloader config](DATALOADE
612646
- **Qué**: Desactiva el cálculo de pérdida de evaluación durante la validación.
613647
- **Por qué**: Cuando se configura un dataset de eval, la pérdida se calcula automáticamente. Si la evaluación CLIP también está habilitada, ambas se ejecutarán. Este flag te permite desactivar selectivamente la pérdida de eval manteniendo la evaluación CLIP habilitada.
614648

649+
### `--validation_using_datasets`
650+
651+
- **Qué**: Usa imágenes de datasets de entrenamiento para validación en lugar de generación pura de texto a imagen.
652+
- **Por qué**: Habilita el modo de validación imagen-a-imagen (img2img) donde el modelo des-ruido parcialmente imágenes de entrenamiento en lugar de generar desde ruido puro. Útil para:
653+
- Probar modelos de edición/inpainting que requieren imágenes de entrada
654+
- Evaluar qué tan bien el modelo preserva la estructura de imagen
655+
- Modelos que soportan flujos duales texto-a-imagen E imagen-a-imagen (ej., Flux2, LTXVideo2)
656+
- **Notas**:
657+
- Requiere que el modelo tenga un pipeline `IMG2IMG` registrado
658+
- Puede combinarse con `--eval_dataset_id` para obtener imágenes de un dataset específico
659+
- La fuerza de des-ruido se controla con los ajustes normales de timestep de validación
660+
661+
### `--eval_dataset_id`
662+
663+
- **Qué**: ID de dataset específico a usar para obtener imágenes de evaluación/validación.
664+
- **Por qué**: Al usar `--validation_using_datasets` o validación basada en conditioning, controla qué dataset provee las imágenes de entrada:
665+
- Sin esta opción, las imágenes se seleccionan aleatoriamente de todos los datasets de entrenamiento
666+
- Con esta opción, solo se usa el dataset especificado para entradas de validación
667+
- **Notas**:
668+
- El ID de dataset debe coincidir con un dataset configurado en tu config de dataloader
669+
- Útil para mantener evaluación consistente usando un dataset de eval dedicado
670+
- Para modelos de conditioning, los datos de conditioning del dataset (si existen) también se usarán
671+
672+
---
673+
674+
## Entendiendo Modos de Conditioning y Validación
675+
676+
SimpleTuner soporta tres paradigmas principales para modelos que usan entradas de conditioning (imágenes de referencia, señales de control, etc.):
677+
678+
### 1. Modelos que REQUIEREN Conditioning
679+
680+
Algunos modelos no pueden funcionar sin entradas de conditioning:
681+
682+
- **Flux Kontext**: Siempre necesita imágenes de referencia para entrenamiento estilo edición
683+
- **Entrenamiento ControlNet**: Requiere imágenes de señal de control
684+
685+
Para estos modelos, un dataset de conditioning es obligatorio. La WebUI mostrará opciones de conditioning como requeridas, y el entrenamiento fallará sin ellas.
686+
687+
### 2. Modelos que SOPORTAN Conditioning Opcional
688+
689+
Algunos modelos pueden operar en modos texto-a-imagen E imagen-a-imagen:
690+
691+
- **Flux2**: Soporta entrenamiento dual T2I/I2I con imágenes de referencia opcionales
692+
- **LTXVideo2**: Soporta T2V e I2V (imagen-a-video) con conditioning de primer frame opcional
693+
- **LongCat-Video**: Soporta conditioning de frames opcional
694+
695+
Para estos modelos, PUEDES agregar datasets de conditioning pero no es obligatorio. La WebUI mostrará opciones de conditioning como opcionales.
696+
697+
### 3. Modos de Validación
698+
699+
| Modo | Flag | Comportamiento |
700+
|------|------|----------------|
701+
| **Texto-a-Imagen** | (por defecto) | Genera solo desde prompts de texto |
702+
| **Basado en Dataset** | `--validation_using_datasets` | Des-ruido parcial de imágenes de datasets (img2img) |
703+
| **Basado en Conditioning** | (auto cuando se configura conditioning) | Usa entradas de conditioning durante validación |
704+
705+
**Combinando modos**: Cuando un modelo soporta conditioning Y `--validation_using_datasets` está habilitado:
706+
- El sistema de validación obtiene imágenes de datasets
707+
- Si esos datasets tienen datos de conditioning, se usan automáticamente
708+
- Usa `--eval_dataset_id` para controlar qué dataset provee entradas
709+
710+
### Tipos de Datos de Conditioning
711+
712+
Diferentes modelos esperan diferentes datos de conditioning:
713+
714+
| Tipo | Modelos | Configuración de Dataset |
715+
|------|---------|-------------------------|
716+
| `conditioning` | ControlNet, Control | `type: conditioning` en config de dataset |
717+
| `image` | Flux Kontext | `type: image` (dataset de imagen estándar) |
718+
| `latents` | Flux, Flux2 | Conditioning se codifica con VAE automáticamente |
719+
720+
---
721+
615722
### `--caption_strategy`
616723

617724
- **Qué**: Estrategia para derivar captions de imagen. **Opciones**: `textfile`, `filename`, `parquet`, `instanceprompt`
@@ -930,6 +1037,61 @@ CREPA es una técnica de regularización para fine-tuning de modelos de difusió
9301037
- **Por qué**: Los modelos DINOv2 funcionan mejor a su resolución de entrenamiento. El modelo gigante usa 518x518.
9311038
- **Predeterminado**: `518`
9321039

1040+
### `--crepa_scheduler`
1041+
1042+
- **Qué**: Programa para el decaimiento del coeficiente CREPA durante el entrenamiento.
1043+
- **Por qué**: Permite reducir la fuerza de regularización CREPA a medida que avanza el entrenamiento, previniendo el sobreajuste en características profundas del encoder.
1044+
- **Opciones**: `constant`, `linear`, `cosine`, `polynomial`
1045+
- **Predeterminado**: `constant`
1046+
1047+
### `--crepa_warmup_steps`
1048+
1049+
- **Qué**: Número de pasos para incrementar linealmente el peso CREPA desde 0 hasta `crepa_lambda`.
1050+
- **Por qué**: Un calentamiento gradual puede ayudar a estabilizar el entrenamiento temprano antes de que la regularización CREPA entre en efecto.
1051+
- **Predeterminado**: `0`
1052+
1053+
### `--crepa_decay_steps`
1054+
1055+
- **Qué**: Pasos totales para el decaimiento (después del calentamiento). Establece a 0 para decaer durante todo el entrenamiento.
1056+
- **Por qué**: Controla la duración de la fase de decaimiento. El decaimiento comienza después de que se completa el calentamiento.
1057+
- **Predeterminado**: `0` (usa `max_train_steps`)
1058+
1059+
### `--crepa_lambda_end`
1060+
1061+
- **Qué**: Peso CREPA final después de que se completa el decaimiento.
1062+
- **Por qué**: Establecerlo a 0 desactiva efectivamente CREPA al final del entrenamiento, útil para text2video donde CREPA puede causar artefactos.
1063+
- **Predeterminado**: `0.0`
1064+
1065+
### `--crepa_power`
1066+
1067+
- **Qué**: Factor de potencia para el decaimiento polinomial. 1.0 = lineal, 2.0 = cuadrático, etc.
1068+
- **Por qué**: Valores más altos causan un decaimiento inicial más rápido que se ralentiza hacia el final.
1069+
- **Predeterminado**: `1.0`
1070+
1071+
### `--crepa_cutoff_step`
1072+
1073+
- **Qué**: Paso de corte duro después del cual CREPA se desactiva.
1074+
- **Por qué**: Útil para desactivar CREPA después de que el modelo ha convergido en el alineamiento temporal.
1075+
- **Predeterminado**: `0` (sin corte basado en pasos)
1076+
1077+
### `--crepa_similarity_threshold`
1078+
1079+
- **Qué**: Umbral de EMA de similitud en el cual se activa el corte de CREPA.
1080+
- **Por qué**: Cuando el promedio móvil exponencial de similitud alcanza este valor, CREPA se desactiva para prevenir el sobreajuste en características profundas del encoder. Esto es particularmente útil para entrenamiento text2video.
1081+
- **Predeterminado**: None (desactivado)
1082+
1083+
### `--crepa_similarity_ema_decay`
1084+
1085+
- **Qué**: Factor de decaimiento del promedio móvil exponencial para el seguimiento de similitud.
1086+
- **Por qué**: Valores más altos proporcionan un seguimiento más suave (0.99 ≈ ventana de 100 pasos), valores más bajos reaccionan más rápido a los cambios.
1087+
- **Predeterminado**: `0.99`
1088+
1089+
### `--crepa_threshold_mode`
1090+
1091+
- **Qué**: Comportamiento cuando se alcanza el umbral de similitud.
1092+
- **Opciones**: `permanent` (CREPA permanece desactivado una vez que se alcanza el umbral), `recoverable` (CREPA se reactiva si la similitud cae)
1093+
- **Predeterminado**: `permanent`
1094+
9331095
### Ejemplo de configuración
9341096

9351097
```toml
@@ -947,6 +1109,15 @@ crepa_encoder_frames_batch_size = -1
9471109
crepa_use_backbone_features = false
9481110
# crepa_teacher_block_index = 16
9491111
crepa_encoder_image_size = 518
1112+
1113+
# Programación CREPA (opcional)
1114+
# crepa_scheduler = "cosine" # Tipo de decaimiento: constant, linear, cosine, polynomial
1115+
# crepa_warmup_steps = 100 # Calentamiento antes de que CREPA entre en efecto
1116+
# crepa_decay_steps = 1000 # Pasos para el decaimiento (0 = todo el entrenamiento)
1117+
# crepa_lambda_end = 0.0 # Peso final después del decaimiento
1118+
# crepa_cutoff_step = 5000 # Paso de corte duro (0 = desactivado)
1119+
# crepa_similarity_threshold = 0.9 # Corte basado en similitud
1120+
# crepa_threshold_mode = "permanent" # permanent o recoverable
9501121
```
9511122

9521123
---
@@ -1265,6 +1436,7 @@ usage: train.py [-h] --model_family
12651436
[--model_card_private [MODEL_CARD_PRIVATE]]
12661437
[--model_card_safe_for_work [MODEL_CARD_SAFE_FOR_WORK]]
12671438
[--model_card_note MODEL_CARD_NOTE]
1439+
[--modelspec_comment MODELSPEC_COMMENT]
12681440
[--report_to {tensorboard,wandb,comet_ml,all,none}]
12691441
[--checkpoint_step_interval CHECKPOINT_STEP_INTERVAL]
12701442
[--checkpoint_epoch_interval CHECKPOINT_EPOCH_INTERVAL]
@@ -1935,6 +2107,9 @@ options:
19352107
--model_card_note MODEL_CARD_NOTE
19362108
Optional note that appears at the top of the generated
19372109
model card.
2110+
--modelspec_comment MODELSPEC_COMMENT
2111+
Text embedded in safetensors file metadata as
2112+
modelspec.comment, visible in external model viewers.
19382113
--report_to {tensorboard,wandb,comet_ml,all,none}
19392114
Where to log training metrics
19402115
--checkpoint_step_interval CHECKPOINT_STEP_INTERVAL

0 commit comments

Comments
 (0)