Diffusers documentation
Pipelines y componentes de la comunidad
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.
| 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().
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_pipelinepara cargar un pipeline de la comunidad local. El directorio debe contener un archivopipeline.pyque 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_pipelinetambié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.
- 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.
- 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 claseShowOneUNet3DConditionModeldeben colocarse enshowone_unet_3d_condition.py.
from showone_unet_3d_condition import ShowOneUNet3DConditionModel
unet = ShowOneUNet3DConditionModel.from_pretrained(pipeline_id, subfolder="unet")- Cargue el código de la pipeline personalizada (ya implementado en pipeline_t2v_base_pixel.py). Este script contiene una clase personalizada
TextToVideoIFPipelinepara generar videos a partir de texto. Al igual que con la UNet personalizada, cualquier código necesario paraTextToVideoIFPipelinedebe colocarse enpipeline_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"- 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_nameen model_index.json a["pipeline_t2v_base_pixel", "TextToVideoIFPipeline"]. - Sube
showone_unet_3d_condition.pya la subcarpeta unet. - Sube
pipeline_t2v_base_pixel.pyal 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 argumentorevisionen 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.