Buckets:

mishig's picture
|
download
raw
10.8 kB
# Texto a imagen
> [!WARNING]
> El script de texto a imagen es experimental y es fácil sobreajustar y encontrarse con problemas como el olvido catastrófico. Pruebe explorar diferentes hiperparámetros para obtener los mejores resultados en su conjunto de datos.
Los modelos de texto a imagen, como Stable Diffusion, están condicionados para generar imágenes a partir de un prompt de texto.
Entrenar un modelo puede ser exigente para tu hardware, pero si activas `gradient_checkpointing` y `mixed_precision`, es posible entrenar un modelo en una sola GPU de 24 GB. Si estás entrenando con tamaños de lote más grandes o quieres entrenar más rápido, es mejor usar GPUs con más de 30 GB de memoria. Puedes reducir tu huella de memoria activando la atención eficiente en memoria con [xFormers](../optimization/attention_backends).
Esta guía explorará el script de entrenamiento [train_text_to_image.py](https://github.com/huggingface/diffusers/blob/main/examples/text_to_image/train_text_to_image.py) para que se familiarice con él y para que pueda adaptarlo a su caso de uso.
Antes de ejecutar el script, asegúrate de instalar la biblioteca desde el código fuente:
```bash
git clone https://github.com/huggingface/diffusers
cd diffusers
pip install .
```
Luego, navegue a la carpeta de ejemplo que contiene el script de entrenamiento e instale las dependencias requeridas para el script que está utilizando:
```bash
cd examples/text_to_image
pip install -r requirements.txt
```
> [!TIP]
> 🤗 Accelerate es una biblioteca para ayudarte a entrenar en varias GPUs/TPUs o con precisión mixta. Configura automáticamente tu configuración de entrenamiento en función de tu hardware y entorno. Echa un vistazo al [Quick tour](https://huggingface.co/docs/accelerate/quicktour) de 🤗 Accelerate para saber más.
Inicializa un entorno de 🤗 Accelerate:
```bash
accelerate config
```
Para configurar un entorno predeterminado de 🤗 Accelerate sin elegir ninguna configuración:
```bash
accelerate config default
```
O si su entorno no admite una shell interactiva, como un notebook, puede usar:
```py
from accelerate.utils import write_basic_config
write_basic_config()
```
Por último, si deseas entrenar un modelo con tu propio conjunto de datos, consulta la guía [Crear un conjunto de datos para el entrenamiento](create_dataset) para aprender a crear un conjunto de datos que funcione con el script de entrenamiento.
## Parámetros del script
> [!TIP]
> Las siguientes secciones resaltan las partes del script de entrenamiento que son importantes para entender cómo modificarlo, pero no abordan todos los aspectos del script en detalle. Si te interesa aprender más, no dudes en leer el [script](https://github.com/huggingface/diffusers/blob/main/examples/text_to_image/train_text_to_image.py) e informarnos si tienes alguna pregunta o inquietud.
El script de entrenamiento ofrece muchos parámetros para ayudarte a personalizar tu ejecución de entrenamiento. Todos los parámetros y sus descripciones se encuentran en la función [`parse_args()`](https://github.com/huggingface/diffusers/blob/8959c5b9dec1c94d6ba482c94a58d2215c5fd026/examples/text_to_image/train_text_to_image.py#L193). Esta función proporciona valores predeterminados para cada parámetro, como el tamaño del lote de entrenamiento y la tasa de aprendizaje, pero también puedes establecer tus propios valores en el comando de entrenamiento si lo deseas.
Por ejemplo, para acelerar el entrenamiento con precisión mixta usando el formato fp16, añade el parámetro `--mixed_precision` al comando de entrenamiento:
```bash
accelerate launch train_text_to_image.py \
--mixed_precision="fp16"
```
Algunos parámetros básicos e importantes incluyen:
- `--pretrained_model_name_or_path`: el nombre del modelo en el Hub o una ruta local al modelo preentrenado
- `--dataset_name`: el nombre del conjunto de datos en el Hub o una ruta local al conjunto de datos en el que se va a entrenar
- `--image_column`: el nombre de la columna de imágenes en el conjunto de datos sobre el que se entrena
- `--caption_column`: el nombre de la columna de texto en el conjunto de datos sobre el que se va a entrenar
- `--output_dir`: dónde guardar el modelo entrenado
- `--push_to_hub`: si se debe subir el modelo entrenado al Hub
- `--checkpointing_steps`: frecuencia de guardado de un punto de control durante el entrenamiento del modelo; esto es útil si, por alguna razón, el entrenamiento se interrumpe, ya que puedes continuar el entrenamiento desde ese punto de control añadiendo `--resume_from_checkpoint` a tu comando de entrenamiento
### Ponderación Min-SNR
La estrategia de ponderación [Min-SNR](https://huggingface.co/papers/2303.09556) puede ayudar en el entrenamiento al reequilibrar la pérdida para lograr una convergencia más rápida. El script de entrenamiento admite la predicción de `epsilon` (ruido) o `v_prediction`, pero Min-SNR es compatible con ambos tipos de predicción. Esta estrategia de ponderación solo está soportada por PyTorch.
Agrega el parámetro `--snr_gamma` y establécelo en el valor recomendado de 5.0:
```bash
accelerate launch train_text_to_image.py \
--snr_gamma=5.0
```
Puede comparar las superficies de pérdida para diferentes valores de `snr_gamma` en este informe de [Weights and Biases](https://wandb.ai/sayakpaul/text2image-finetune-minsnr). Para conjuntos de datos más pequeños, los efectos de Min-SNR pueden no ser tan evidentes en comparación con conjuntos de datos más grandes.
## Script de entrenamiento
El código de preprocesamiento del conjunto de datos y el bucle de entrenamiento se encuentran en la función [`main()`](https://github.com/huggingface/diffusers/blob/8959c5b9dec1c94d6ba482c94a58d2215c5fd026/examples/text_to_image/train_text_to_image.py#L490). Si necesitas adaptar el script de entrenamiento, este es el lugar donde debes realizar los cambios.
El script `train_text_to_image` comienza [cargando un scheduler](https://github.com/huggingface/diffusers/blob/8959c5b9dec1c94d6ba482c94a58d2215c5fd026/examples/text_to_image/train_text_to_image.py#L543) y un tokenizer. Puedes optar por usar un scheduler diferente aquí si lo deseas:
```py
noise_scheduler = DDPMScheduler.from_pretrained(args.pretrained_model_name_or_path, subfolder="scheduler")
tokenizer = CLIPTokenizer.from_pretrained(
args.pretrained_model_name_or_path, subfolder="tokenizer", revision=args.revision
)
```
Luego, el script [carga el modelo UNet](https://github.com/huggingface/diffusers/blob/8959c5b9dec1c94d6ba482c94a58d2215c5fd026/examples/text_to_image/train_text_to_image.py#L619):
```py
load_model = UNet2DConditionModel.from_pretrained(input_dir, subfolder="unet")
model.register_to_config(**load_model.config)
model.load_state_dict(load_model.state_dict())
```
A continuación, las columnas de texto e imagen del conjunto de datos deben preprocesarse. La función [`tokenize_captions`](https://github.com/huggingface/diffusers/blob/8959c5b9dec1c94d6ba482c94a58d2215c5fd026/examples/text_to_image/train_text_to_image.py#L724) se encarga de tokenizar las entradas, y la función [`train_transforms`](https://github.com/huggingface/diffusers/blob/8959c5b9dec1c94d6ba482c94a58d2215c5fd026/examples/text_to_image/train_text_to_image.py#L742) especifica el tipo de transformaciones que se aplican a la imagen. Ambas funciones se agrupan en `preprocess_train`:
```py
def preprocess_train(examples):
images = [image.convert("RGB") for image in examples[image_column]]
examples["pixel_values"] = [train_transforms(image) for image in images]
examples["input_ids"] = tokenize_captions(examples)
return examples
```
Por último, el [bucle de entrenamiento](https://github.com/huggingface/diffusers/blob/8959c5b9dec1c94d6ba482c94a58d2215c5fd026/examples/text_to_image/train_text_to_image.py#L878) se encarga de todo lo demás. Codifica las imágenes en el espacio latente, añade ruido a los latentes, calcula los embeddings de texto sobre los que condicionar, actualiza los parámetros del modelo y guarda y publica el modelo en el Hub. Si quieres aprender más sobre cómo funciona el bucle de entrenamiento, consulta el tutorial [Understanding pipelines, models and schedulers](../using-diffusers/write_own_pipeline), que desglosa el patrón básico del proceso de denoising.
## Ejecutar el script
Una vez que hayas realizado todos tus cambios o estés conforme con la configuración predeterminada, ¡estás listo para lanzar el script de entrenamiento! 🚀
Entrenemos con el conjunto de datos [Naruto BLIP captions](https://huggingface.co/datasets/lambdalabs/naruto-blip-captions) para generar tus propios personajes de Naruto. Establece las variables de entorno `MODEL_NAME` y `dataset_name` con el modelo y el conjunto de datos (ya sea desde el Hub o una ruta local). Si entrenas en más de una GPU, añade el parámetro `--multi_gpu` al comando `accelerate launch`.
> [!TIP]
> Para entrenar con un conjunto de datos local, establezca las variables de entorno `TRAIN_DIR` y `OUTPUT_DIR` en la ruta del conjunto de datos y en el lugar donde se guardará el modelo.
```bash
export MODEL_NAME="stable-diffusion-v1-5/stable-diffusion-v1-5"
export dataset_name="lambdalabs/naruto-blip-captions"
accelerate launch --mixed_precision="fp16" train_text_to_image.py \
--pretrained_model_name_or_path=$MODEL_NAME \
--dataset_name=$dataset_name \
--use_ema \
--resolution=512 --center_crop --random_flip \
--train_batch_size=1 \
--gradient_accumulation_steps=4 \
--gradient_checkpointing \
--max_train_steps=15000 \
--learning_rate=1e-05 \
--max_grad_norm=1 \
--enable_xformers_memory_efficient_attention \
--lr_scheduler="constant" --lr_warmup_steps=0 \
--output_dir="sd-naruto-model" \
--push_to_hub
```
Una vez completado el entrenamiento, puedes usar tu modelo recién entrenado para inferencia:
```py
from diffusers import StableDiffusionPipeline
import torch
pipeline = StableDiffusionPipeline.from_pretrained("path/to/saved_model", dtype=torch.float16, use_safetensors=True).to("cuda") # or "mps", "xpu", "cpu"
image = pipeline(prompt="yoda").images[0]
image.save("yoda-naruto.png")
```
## Próximos pasos
¡Felicidades por entrenar tu propio modelo de texto a imagen! Para aprender más sobre cómo usar tu nuevo modelo, las siguientes guías pueden ser útiles:
- Aprende a [cargar los pesos de LoRA](../tutorials/using_peft_for_inference) para la inferencia si entrenaste tu modelo con LoRA.
- Obtenga más información sobre cómo ciertos parámetros, como la escala de orientación, o técnicas como el ponderado de prompts pueden ayudarle a controlar la inferencia en la guía de la tarea [Texto a imagen](../using-diffusers/conditional_image_generation).

Xet Storage Details

Size:
10.8 kB
·
Xet hash:
c292e2bf5eb9eb4f8e32f216be70c89cdbf24602680a257b367d22ff20fd567a

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.