# Planificadores

🤗 Diffusers ofrece muchas funciones de programador para el proceso de difusión. Un programador toma la salida de un modelo (la muestra sobre la que el proceso de difusión está iterando) y un paso de tiempo para devolver una muestra desruidada. El paso de tiempo es importante porque determina en qué punto del proceso de difusión se encuentra el paso; los datos se generan iterando hacia adelante *n* pasos de tiempo y la inferencia se produce propagando hacia atrás a través de los pasos de tiempo. En función del paso de tiempo, un programador puede ser *discreto*, en cuyo caso el paso de tiempo es un `int`, o *continuo*, en cuyo caso el paso de tiempo es un `float`.

Según el contexto, un scheduler define cómo añadir ruido de forma iterativa a una imagen o cómo actualizar una muestra en función de la salida de un modelo:

- durante el *entrenamiento*, un programador añade ruido (existen diferentes algoritmos para añadir ruido) a una muestra para entrenar un modelo de difusión
- durante la *inferencia*, un programador define cómo actualizar una muestra en función de la salida de un modelo preentrenado

Muchos de los programadores están implementados a partir de la biblioteca [k-diffusion](https://github.com/crowsonkb/k-diffusion) de [Katherine Crowson](https://github.com/crowsonkb/) y también se utilizan ampliamente en A1111. Para ayudarte a asociar los programadores de k-diffusion y A1111 con los programadores de 🤗 Diffusers, consulta la siguiente tabla:

| A1111/k-diffusion    | 🤗 Diffusers                         | Uso                                                                                                         |
|---------------------|-------------------------------------|---------------------------------------------------------------------------------------------------------------|
| DPM++ 2M            | [DPMSolverMultistepScheduler](/docs/diffusers/v0.43.0/es/api/schedulers/multistep_dpm_solver#diffusers.DPMSolverMultistepScheduler)     |                                                                                                               |
| DPM++ 2M Karras     | [DPMSolverMultistepScheduler](/docs/diffusers/v0.43.0/es/api/schedulers/multistep_dpm_solver#diffusers.DPMSolverMultistepScheduler)     | inicializar con `use_karras_sigmas=True`                                                                            |
| DPM++ 2M SDE        | [DPMSolverMultistepScheduler](/docs/diffusers/v0.43.0/es/api/schedulers/multistep_dpm_solver#diffusers.DPMSolverMultistepScheduler)     | inicializar con `algorithm_type="sde-dpmsolver++"`                                                                  |
| DPM++ 2M SDE Karras | [DPMSolverMultistepScheduler](/docs/diffusers/v0.43.0/es/api/schedulers/multistep_dpm_solver#diffusers.DPMSolverMultistepScheduler)     | inicializar con `use_karras_sigmas=True` y `algorithm_type="sde-dpmsolver++"`                                     |
| DPM++ 2S a          | N/A                                 | muy similar a `DPMSolverSinglestepScheduler`                         |
| DPM++ 2S a Karras   | N/A                                 | muy similar a `DPMSolverSinglestepScheduler(use_karras_sigmas=True, ...)` |
| DPM++ SDE           | [DPMSolverSinglestepScheduler](/docs/diffusers/v0.43.0/es/api/schedulers/singlestep_dpm_solver#diffusers.DPMSolverSinglestepScheduler)    |                                                                                                               |
| DPM++ SDE Karras    | [DPMSolverSinglestepScheduler](/docs/diffusers/v0.43.0/es/api/schedulers/singlestep_dpm_solver#diffusers.DPMSolverSinglestepScheduler)    | inicializar con `use_karras_sigmas=True`                                                                            |
| DPM2                | [KDPM2DiscreteScheduler](/docs/diffusers/v0.43.0/es/api/schedulers/dpm_discrete#diffusers.KDPM2DiscreteScheduler)          |                                                                                                               |
| DPM2 Karras         | [KDPM2DiscreteScheduler](/docs/diffusers/v0.43.0/es/api/schedulers/dpm_discrete#diffusers.KDPM2DiscreteScheduler)          | inicializar con `use_karras_sigmas=True`                                                                            |
| DPM2 a              | [KDPM2AncestralDiscreteScheduler](/docs/diffusers/v0.43.0/es/api/schedulers/dpm_discrete_ancestral#diffusers.KDPM2AncestralDiscreteScheduler) |                                                                                                               |
| DPM2 a Karras       | [KDPM2AncestralDiscreteScheduler](/docs/diffusers/v0.43.0/es/api/schedulers/dpm_discrete_ancestral#diffusers.KDPM2AncestralDiscreteScheduler) | inicializar con `use_karras_sigmas=True`                                                                            |
| DPM adaptativo        | N/A                                 |                                                                                                               |
| DPM rápido            | N/A                                 |                                                                                                               |
| Euler               | [EulerDiscreteScheduler](/docs/diffusers/v0.43.0/es/api/schedulers/euler#diffusers.EulerDiscreteScheduler)          |                                                                                                               |
| Euler a             | [EulerAncestralDiscreteScheduler](/docs/diffusers/v0.43.0/es/api/schedulers/euler_ancestral#diffusers.EulerAncestralDiscreteScheduler) |                                                                                                               |
| Heun                | [HeunDiscreteScheduler](/docs/diffusers/v0.43.0/es/api/schedulers/heun#diffusers.HeunDiscreteScheduler)           |                                                                                                               |
| LMS                 | [LMSDiscreteScheduler](/docs/diffusers/v0.43.0/es/api/schedulers/lms_discrete#diffusers.LMSDiscreteScheduler)            |                                                                                                               |
| LMS Karras          | [LMSDiscreteScheduler](/docs/diffusers/v0.43.0/es/api/schedulers/lms_discrete#diffusers.LMSDiscreteScheduler)            | inicializar con `use_karras_sigmas=True`                                                                            |
| N/A                 | [DEISMultistepScheduler](/docs/diffusers/v0.43.0/es/api/schedulers/deis#diffusers.DEISMultistepScheduler)          |                                                                                                               |
| N/A                 | [UniPCMultistepScheduler](/docs/diffusers/v0.43.0/es/api/schedulers/unipc#diffusers.UniPCMultistepScheduler)         |                                                                                                               |

## Programas de ruido y tipos de programa
| A1111/k-diffusion        | 🤗 Diffusers                                                               |
|--------------------------|----------------------------------------------------------------------------|
| Karras                   | inicializar con `use_karras_sigmas=True`                                         |
| sgm_uniform              | inicializar con `timestep_spacing="trailing"`                                    |
| simple                   | inicializar con `timestep_spacing="trailing"`                                    |
| exponencial              | inicializar con `timestep_spacing="linspace"`, `use_exponential_sigmas=True`     |
| beta                     | inicializar con `timestep_spacing="linspace"`, `use_beta_sigmas=True`            |

Todos los programadores se construyen a partir de la clase base [SchedulerMixin](/docs/diffusers/v0.43.0/es/api/schedulers/overview#diffusers.SchedulerMixin), que implementa utilidades de bajo nivel compartidas por todos los programadores.

## SchedulerMixin[[diffusers.SchedulerMixin]]

#### diffusers.SchedulerMixin[[diffusers.SchedulerMixin]]

```python
diffusers.SchedulerMixin()
```

[Fuente](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/schedulers/scheduling_utils.py#L79)

Clase base para todos los programadores.

[SchedulerMixin](/docs/diffusers/v0.43.0/es/api/schedulers/overview#diffusers.SchedulerMixin) contiene funciones comunes compartidas por todos los programadores, como las funcionalidades generales de carga y guardado.

[ConfigMixin](/docs/diffusers/v0.43.0/es/api/configuration#diffusers.ConfigMixin) se encarga de almacenar los atributos de configuración (como `num_train_timesteps`) que se pasan a la función `__init__` del programador, y los atributos se pueden acceder mediante `scheduler.config.num_train_timesteps`.

Atributos de clase:
- **_compatibles** (`list[str]`) -- Una lista de clases de programadores compatibles con la clase de programador principal. Utilice [from_config()](/docs/diffusers/v0.43.0/es/api/configuration#diffusers.ConfigMixin.from_config) para cargar una clase de programador compatible diferente (debe ser sobrescrita por la clase principal).

#### from_pretrained[[diffusers.SchedulerMixin.from_pretrained]]

```python
from_pretrained(pretrained_model_name_or_path: str | os.PathLike | None = None, subfolder: str | None = None, return_unused_kwargs: bool = False, **kwargs: Any)
```

[Fuente](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/schedulers/scheduling_utils.py#L99)

**Parámetros:**

pretrained_model_name_or_path (`str` o `os.PathLike`, *opcional*) : Puede ser:  - Una cadena, el *model id* (por ejemplo `google/ddpm-celebahq-256`) de un modelo preentrenado alojado en el Hub. - Una ruta a un *directorio* (por ejemplo `./my_model_directory`) que contiene la configuración del programador guardada con [save_pretrained()](/docs/diffusers/v0.43.0/es/api/schedulers/overview#diffusers.SchedulerMixin.save_pretrained).

subfolder (`str`, *opcional*) : La ubicación de la subcarpeta de un archivo de modelo dentro de un repositorio de modelos más grande en el Hub o localmente.

return_unused_kwargs (`bool`, *opcional*, por defecto `False`) : Si los kwargs que no son consumidos por la clase de Python deben devolverse o no.

cache_dir (`str` o `os.PathLike`, *opcional*) : Ruta a un directorio donde se almacena en caché la configuración de un modelo preentrenado descargado si no se utiliza la caché estándar.

force_download (`bool`, *opcional*, valor predeterminado `False`) : Indica si se debe forzar la (re)descarga de los pesos del modelo y los archivos de configuración, reemplazando las versiones en caché si existen.

proxies (`dict[str, str]`, *opcional*) : Un diccionario de servidores proxy a utilizar por protocolo o punto de acceso, por ejemplo, `{'http': 'foo.bar:3128', 'http://hostname': 'foo.bar:4012'}`. Los proxies se utilizan en cada solicitud.

output_loading_info (`bool`, *opcional*, por defecto `False`) : Si se debe devolver también un diccionario que contenga las claves faltantes, las claves inesperadas y los mensajes de error.

local_files_only (`bool`, *opcional*, valor predeterminado `False`) : Indica si se deben cargar únicamente los pesos y archivos de configuración del modelo localmente. Si se establece en `True`, el modelo no se descargará desde el Hub.

token (`str` o `bool`, *opcional*) : El token que se usará como autorización HTTP bearer para archivos remotos. Si es `True`, se utiliza el token generado desde `diffusers-cli login` (almacenado en `~/.huggingface`).

revision (`str`, *opcional*, valor predeterminado `"main"`) : La versión específica del modelo que se va a utilizar. Puede ser el nombre de una rama, el nombre de una etiqueta, un id de commit o cualquier identificador permitido por Git.

**Devuelve:** [SchedulerMixin](/docs/diffusers/v0.43.0/es/api/schedulers/overview#diffusers.SchedulerMixin) o `tuple[SchedulerMixin, dict[str, Any]]`

El programador instanciado a partir de la configuración. Si `return_unused_kwargs` es `True`, se devuelve una tupla donde el segundo elemento es un diccionario de argumentos de palabra clave no utilizados.

Instanciar un programador desde un archivo de configuración JSON predefinido en un directorio local o un repositorio de Hub.

> [!TIP] > Para usar modelos privados o [con acceso restringido](https://huggingface.co/docs/hub/models-gated#gated-models), inicia sesión
con `hf > auth login`. También puedes activar el modo especial > ["offline-mode"](https://huggingface.co/diffusers/installation.html#offline-mode) para usar este método en un > entorno con cortafuegos.

#### save_pretrained[[diffusers.SchedulerMixin.save_pretrained]]

```python
save_pretrained(save_directory: str | os.PathLike, push_to_hub: bool = False, **kwargs: Any)
```

[Fuente](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/schedulers/scheduling_utils.py#L164)

**Parámetros:**

save_directory (`str` o `os.PathLike`) : Directorio donde se guardará el archivo JSON de configuración (se creará si no existe).

push_to_hub (`bool`, *opcional*, por defecto `False`) : Si se sube o no el modelo al Hugging Face Hub después de guardarlo. Puede especificar el repositorio al que desea subirlo con `repo_id` (por defecto, usará el nombre de `save_directory` en su espacio de nombres).

kwargs (`dict[str, Any]`, *opcional*) : Argumentos de palabra clave adicionales que se pasan al método [push_to_hub()](/docs/diffusers/v0.43.0/es/api/schedulers/overview#diffusers.utils.PushToHubMixin.push_to_hub).

Guarde un objeto de configuración de programador en un directorio para que pueda recargarse mediante el método de clase [from_pretrained()](/docs/diffusers/v0.43.0/es/api/schedulers/overview#diffusers.SchedulerMixin.from_pretrained).

## SchedulerOutput[[diffusers.schedulers.scheduling_utils.SchedulerOutput]]

#### diffusers.schedulers.scheduling_utils.SchedulerOutput[[diffusers.schedulers.scheduling_utils.SchedulerOutput]]

```python
diffusers.schedulers.scheduling_utils.SchedulerOutput(prev_sample: Tensor)
```

[Fuente](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/schedulers/scheduling_utils.py#L66)

**Parámetros:**

prev_sample (`torch.Tensor` de forma `(batch_size, num_channels, height, width)` para imágenes) : Muestra `(x_{t-1})` calculada del paso de tiempo anterior. `prev_sample` debe usarse como entrada del modelo en la siguiente iteración del bucle de desruido.

Clase base para la salida de la función `step` de un programador.

## KarrasDiffusionSchedulers

`KarrasDiffusionSchedulers` son una generalización amplia de los programadores en 🤗 Diffusers. Los programadores de esta clase se distinguen a un nivel alto por su estrategia de muestreo de ruido, el tipo de red y escalado, la estrategia de entrenamiento y cómo se pondera la pérdida.

Los distintos programadores de esta clase, según el tipo de solver de ecuaciones diferenciales ordinarias (ODE), encajan en la taxonomía anterior y proporcionan una buena abstracción para el diseño de los programadores principales implementados en 🤗 Diffusers. Los programadores de esta clase se encuentran [aquí](https://github.com/huggingface/diffusers/blob/a69754bb879ed55b9b6dc9dd0b3cf4fa4124c765/src/diffusers/schedulers/scheduling_utils.py#L32).

## PushToHubMixin[[diffusers.utils.PushToHubMixin]]

#### diffusers.utils.PushToHubMixin[[diffusers.utils.PushToHubMixin]]

```python
diffusers.utils.PushToHubMixin()
```

[Fuente](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/utils/hub_utils.py#L491)

Un Mixin para subir un modelo, un programador o un pipeline al Hugging Face Hub.

#### push_to_hub[[diffusers.utils.PushToHubMixin.push_to_hub]]

```python
push_to_hub(repo_id: str, commit_message: str | None = None, private: bool | None = None, token: str | None = None, create_pr: bool = False, safe_serialization: bool = True, variant: str | None = None, subfolder: str | None = None)
```

[Fuente](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/utils/hub_utils.py#L526)

**Parámetros:**

repo_id (`str`) : El nombre del repositorio al que deseas subir tus archivos de modelo, programador o pipeline. Debe incluir el nombre de tu organización cuando subas a una organización. `repo_id` también puede ser una ruta a un directorio local.

commit_message (`str`, *opcional*) : Mensaje para el commit al hacer push. El valor predeterminado es `"Upload {object}"`.

private (`bool`, *opcional*) : Si se debe hacer el repositorio privado. Si es `None` (predeterminado), el repositorio será público a menos que el valor predeterminado de la organización sea privado. Este valor se ignora si el repositorio ya existe.

token (`str`, *opcional*) : El token que se usará como autorización HTTP bearer para archivos remotos. El token generado al ejecutar `hf auth login` (guardado en `~/.huggingface`).

create_pr (`bool`, *opcional*, por defecto `False`) : Si se debe crear una PR con los archivos subidos o realizar el commit directamente.

safe_serialization (`bool`, *opcional*, por defecto `True`) : Si se deben convertir o no los pesos del modelo al formato `safetensors`.

variant (`str`, *opcional*) : Si se especifica, los pesos se guardan en el formato `pytorch_model.<variant>.bin`.

Sube archivos de modelo, programador o pipeline al 🤗 Hugging Face Hub.

Ejemplos:

```python
from diffusers import UNet2DConditionModel

unet = UNet2DConditionModel.from_pretrained("stabilityai/stable-diffusion-2", subfolder="unet")

# Push the `unet` to your namespace with the name "my-finetuned-unet".
unet.push_to_hub("my-finetuned-unet")

# Push the `unet` to an organization with the name "my-finetuned-unet".
unet.push_to_hub("your-org/my-finetuned-unet")
```

