# Pipelines y componentes de la comunidad

Los pipelines de la comunidad son clases [DiffusionPipeline](/docs/diffusers/v0.43.0/es/api/pipelines/overview#diffusers.DiffusionPipeline) que difieren de la implementación del artículo original. Proporcionan funcionalidad adicional o extienden la implementación del pipeline original.

> [!TIP]
> Echa un vistazo a los pipelines de la comunidad en [diffusers/examples/community](https://github.com/huggingface/diffusers/tree/main/examples/community), que incluyen ejemplos de inferencia y entrenamiento sobre cómo utilizarlos.

Los pipelines de la comunidad se almacenan en el Hub o en el repositorio de GitHub de Diffusers. Los pipelines del Hub son completamente personalizables (scheduler, modelos, código del pipeline, etc.), mientras que los pipelines de GitHub están limitados únicamente al código del pipeline personalizado. Compare los dos tipos de pipeline en la tabla siguiente.

|  | GitHub | Hub |
|---|---|---|
| Uso | `custom_pipeline="<filename_without_.py>"` | ID del repositorio de Hub o `trust_remote_code=True` cuando `_class_name` apunta a código personalizado |
| Proceso de revisión | Abre una Pull Request en GitHub y sométela a un proceso de revisión por parte del equipo de Diffusers antes de fusionarla. Esta opción es más lenta. | Sube directamente a un repositorio de Hub sin revisión. Esta es la opción más rápida. |
| Visibilidad | Incluido en el repositorio y la documentación oficiales de Diffusers. | Incluido en tu perfil de Hub y depende de tu propio uso y promoción para ganar visibilidad. |

## Carga de un pipeline de la comunidad

Cargue cualquier tipo de pipeline de la comunidad pasando `custom_pipeline` a [from_pretrained()](/docs/diffusers/v0.43.0/es/api/pipelines/overview#diffusers.DiffusionPipeline.from_pretrained).

```py
import torch
from diffusers import DiffusionPipeline

pipeline = DiffusionPipeline.from_pretrained(
    "stabilityai/stable-diffusion-3-medium-diffusers",
    custom_pipeline="pipeline_stable_diffusion_3_instruct_pix2pix",
    dtype=torch.float16,
    device_map="cuda"  # or "mps", "xpu", "cpu"
)
```

Agrega el argumento `custom_revision` a [from_pretrained()](/docs/diffusers/v0.43.0/es/api/pipelines/overview#diffusers.DiffusionPipeline.from_pretrained) para cargar un pipeline de la comunidad desde una versión específica (por ejemplo, `v0.30.0` o `main`). De forma predeterminada, los pipelines de la comunidad se cargan desde la última versión estable de Diffusers.

```py
import torch
from diffusers import DiffusionPipeline

pipeline = DiffusionPipeline.from_pretrained(
    "stabilityai/stable-diffusion-3-medium-diffusers",
    custom_pipeline="pipeline_stable_diffusion_3_instruct_pix2pix",
    custom_revision="main",
    dtype=torch.float16,
    device_map="cuda"  # or "mps", "xpu", "cpu"
)
```

> [!WARNING]
> Mientras el Hugging Face Hub [analiza](https://huggingface.co/docs/hub/security-malware) los archivos, debes inspeccionar el código de la pipeline del Hub y asegurarte de que sea seguro.

Hay varias formas de cargar un pipeline de la comunidad.

- Pase una ruta a `custom_pipeline` para cargar un pipeline de la comunidad local. El directorio debe contener un archivo `pipeline.py` que contenga la clase del pipeline.

  ```py
  import torch
  from diffusers import DiffusionPipeline

  pipeline = DiffusionPipeline.from_pretrained(
      "stabilityai/stable-diffusion-3-medium-diffusers",
      custom_pipeline="path/to/pipeline_directory",
      trust_remote_code=True,
      dtype=torch.float16,
      device_map="cuda"  # or "mps", "xpu", "cpu"
  )
  ```

- El argumento `custom_pipeline` también es compatible con [from_pipe()](/docs/diffusers/v0.43.0/es/api/pipelines/overview#diffusers.DiffusionPipeline.from_pipe), lo cual resulta útil para [reutilizar pipelines](./loading#reusing-models-in-multiple-pipelines) sin utilizar memoria adicional. Limita el uso de memoria a solo el pipeline más grande cargado.

  ```py
  import torch
  from diffusers import DiffusionPipeline

  pipeline_sd = DiffusionPipeline.from_pretrained(
      "emilianJR/CyberRealistic_V3", dtype=torch.float16, device_map="cuda"  # or "mps", "xpu", "cpu"
  )
  pipeline_lpw = DiffusionPipeline.from_pipe(
      pipeline_sd, custom_pipeline="lpw_stable_diffusion"
  )
  ```

  El método [from_pipe()](/docs/diffusers/v0.43.0/es/api/pipelines/overview#diffusers.DiffusionPipeline.from_pipe) resulta especialmente útil para cargar pipelines de la comunidad, ya que muchos de ellos no tienen pesos preentrenados. Los pipelines de la comunidad generalmente añaden una funcionalidad sobre un pipeline existente.

## Componentes de la comunidad

Los componentes de la comunidad permiten crear pipelines con transformadores, UNets, VAEs y programadores personalizados no admitidos por Diffusers. Estos componentes requieren sus propios módulos de Python.

Esta sección muestra cómo los usuarios pueden utilizar componentes de la comunidad para construir un pipeline de la comunidad, utilizando [showlab/show-1-base](https://huggingface.co/showlab/show-1-base) como ejemplo.

1. Cargue los componentes necesarios, el programador y el procesador de imágenes. El codificador de texto generalmente se importa desde [Transformers](https://huggingface.co/docs/transformers/index).

```python
from transformers import T5Tokenizer, T5EncoderModel, CLIPImageProcessor
from diffusers import DPMSolverMultistepScheduler

pipeline_id = "showlab/show-1-base"
tokenizer = T5Tokenizer.from_pretrained(pipeline_id, subfolder="tokenizer")
text_encoder = T5EncoderModel.from_pretrained(pipeline_id, subfolder="text_encoder")
scheduler = DPMSolverMultistepScheduler.from_pretrained(pipeline_id, subfolder="scheduler")
feature_extractor = CLIPImageProcessor.from_pretrained(pipeline_id, subfolder="feature_extractor")
```

> [!WARNING]
> En los pasos 2 y 3, la implementación personalizada de [UNet](https://github.com/showlab/Show-1/blob/main/showone/models/unet_3d_condition.py) y [pipeline](https://huggingface.co/sayakpaul/show-1-base-with-code/blob/main/unet/showone_unet_3d_condition.py) debe coincidir con el formato mostrado en sus archivos para que este ejemplo funcione.

2. Carga un [UNet personalizado](https://github.com/showlab/Show-1/blob/main/showone/models/unet_3d_condition.py) que ya está implementado en [showone_unet_3d_condition.py](https://huggingface.co/sayakpaul/show-1-base-with-code/blob/main/unet/showone_unet_3d_condition.py). El nombre de la clase [UNet3DConditionModel](/docs/diffusers/v0.43.0/es/api/models/unet3d-cond#diffusers.UNet3DConditionModel) se cambia a la implementación personalizada, `ShowOneUNet3DConditionModel`, porque [UNet3DConditionModel](/docs/diffusers/v0.43.0/es/api/models/unet3d-cond#diffusers.UNet3DConditionModel) ya existe en Diffusers. Todos los componentes necesarios para la clase `ShowOneUNet3DConditionModel` deben colocarse en `showone_unet_3d_condition.py`.

```python
from showone_unet_3d_condition import ShowOneUNet3DConditionModel

unet = ShowOneUNet3DConditionModel.from_pretrained(pipeline_id, subfolder="unet")
```

3. Cargue el código de la pipeline personalizada (ya implementado en [pipeline_t2v_base_pixel.py](https://huggingface.co/sayakpaul/show-1-base-with-code/blob/main/pipeline_t2v_base_pixel.py)). Este script contiene una clase personalizada `TextToVideoIFPipeline` para generar videos a partir de texto. Al igual que con la UNet personalizada, cualquier código necesario para `TextToVideoIFPipeline` debe colocarse en `pipeline_t2v_base_pixel.py`.

Inicializa `TextToVideoIFPipeline` con `ShowOneUNet3DConditionModel`.

```python
import torch
from pipeline_t2v_base_pixel import TextToVideoIFPipeline

pipeline = TextToVideoIFPipeline(
    unet=unet,
    text_encoder=text_encoder,
    tokenizer=tokenizer,
    scheduler=scheduler,
    feature_extractor=feature_extractor,
)
pipeline = pipeline.to("cuda")  # or "mps", "xpu", "cpu"
```

4. Sube el pipeline al Hub para compartirlo con la comunidad.

```python
pipeline.push_to_hub("custom-t2v-pipeline")
```

Después de que el pipeline se haya subido correctamente, realiza los siguientes cambios.

- Cambia el atributo `_class_name` en [model_index.json](https://huggingface.co/sayakpaul/show-1-base-with-code/blob/main/model_index.json#L2) a `["pipeline_t2v_base_pixel", "TextToVideoIFPipeline"]`.
- Sube `showone_unet_3d_condition.py` a la subcarpeta [unet](https://huggingface.co/sayakpaul/show-1-base-with-code/blob/main/unet/showone_unet_3d_condition.py).
- Sube `pipeline_t2v_base_pixel.py` al [repositorio](https://huggingface.co/sayakpaul/show-1-base-with-code/tree/main) de la pipeline.

Para ejecutar la inferencia, añade el argumento `trust_remote_code` al inicializar el pipeline para manejar toda la "magia" detrás de escena.

```python
import torch
from diffusers import DiffusionPipeline

pipeline = DiffusionPipeline.from_pretrained(
    "<change-username>/<change-id>", trust_remote_code=True, dtype=torch.float16
)
```

> [!WARNING]
> Como precaución adicional al usar `trust_remote_code=True`, pase un hash de commit al argumento `revision` en [from_pretrained()](/docs/diffusers/v0.43.0/es/api/pipelines/overview#diffusers.DiffusionPipeline.from_pretrained) para asegurarse de que el código no se haya actualizado con nuevo código malicioso (a menos que confíe por completo en los propietarios del modelo).

## Próximos pasos

- Echa un vistazo a la Issue [#841](https://github.com/huggingface/diffusers/issues/841) para obtener más contexto sobre por qué estamos añadiendo pipelines de la comunidad para ayudar a todos a compartir su trabajo fácilmente sin que se vean frenados.
- Echa un vistazo al repositorio [stabilityai/japanese-stable-diffusion-xl](https://huggingface.co/stabilityai/japanese-stable-diffusion-xl/) para un ejemplo adicional de un pipeline de la comunidad que también utiliza la función `trust_remote_code`.

