Diffusers documentation

Pipelines y componentes de la comunidad

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Pipelines y componentes de la comunidad

Los pipelines de la comunidad son clases DiffusionPipeline que difieren de la implementación del artículo original. Proporcionan funcionalidad adicional o extienden la implementación del pipeline original.

Echa un vistazo a los pipelines de la comunidad en diffusers/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.

GitHubHub
Usocustom_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ónAbre 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.
VisibilidadIncluido 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().

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() 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.

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"
)

Mientras el Hugging Face Hub analiza 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.

    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(), lo cual resulta útil para reutilizar pipelines sin utilizar memoria adicional. Limita el uso de memoria a solo el pipeline más grande cargado.

    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() 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 como ejemplo.

  1. Cargue los componentes necesarios, el programador y el procesador de imágenes. El codificador de texto generalmente se importa desde Transformers.
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")

En los pasos 2 y 3, la implementación personalizada de UNet y pipeline debe coincidir con el formato mostrado en sus archivos para que este ejemplo funcione.

  1. Carga un UNet personalizado que ya está implementado en showone_unet_3d_condition.py. El nombre de la clase UNet3DConditionModel se cambia a la implementación personalizada, ShowOneUNet3DConditionModel, porque UNet3DConditionModel ya existe en Diffusers. Todos los componentes necesarios para la clase ShowOneUNet3DConditionModel deben colocarse en showone_unet_3d_condition.py.
from showone_unet_3d_condition import ShowOneUNet3DConditionModel

unet = ShowOneUNet3DConditionModel.from_pretrained(pipeline_id, subfolder="unet")
  1. Cargue el código de la pipeline personalizada (ya implementado en 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.

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"
  1. Sube el pipeline al Hub para compartirlo con la comunidad.
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 a ["pipeline_t2v_base_pixel", "TextToVideoIFPipeline"].
  • Sube showone_unet_3d_condition.py a la subcarpeta unet.
  • Sube pipeline_t2v_base_pixel.py al repositorio 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.

import torch
from diffusers import DiffusionPipeline

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

Como precaución adicional con trust_remote_code=True, pase un hash de commit al argumento revision en 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 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 para un ejemplo adicional de un pipeline de la comunidad que también utiliza la función trust_remote_code.
Update on GitHub