Diffusers documentation
Pipelines e componentes da comunidade
Pipelines e componentes da comunidade
Os pipelines da comunidade são classes DiffusionPipeline que diferem da implementação do artigo original. Eles fornecem funcionalidade adicional ou estendem a implementação original do pipeline.
Confira os pipelines da comunidade em diffusers/examples/community, com exemplos de inferência e treinamento sobre como usá-los.
Os pipelines da comunidade são armazenados no Hub ou no repositório do GitHub do Diffusers. Os pipelines do Hub são totalmente personalizáveis (scheduler, modelos, código do pipeline, etc.), enquanto os pipelines do GitHub são limitados apenas ao código do pipeline personalizado. Compare os dois tipos de pipeline na tabela abaixo.
| GitHub | Hub | |
|---|---|---|
| Uso | custom_pipeline="<filename_without_.py>" | ID do repositório no Hub ou trust_remote_code=True quando _class_name aponta para código personalizado |
| Processo de revisão | Abra um Pull Request no GitHub e passe por um processo de revisão da equipe do Diffusers antes da mesclagem. Essa opção é mais lenta. | Envie diretamente para um repositório do Hub sem revisão. Esta é a opção mais rápida. |
| Visibilidade | Incluído no repositório e na documentação oficiais do Diffusers. | Incluído no seu perfil do Hub e depende do seu próprio uso e promoção para ganhar visibilidade. |
Carregando um pipeline da comunidade
Carregue qualquer tipo de pipeline da comunidade passando custom_pipeline para 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"
)Adicione o argumento custom_revision ao from_pretrained() para carregar um pipeline da comunidade de uma versão específica (por exemplo, v0.30.0 ou main). Por padrão, os pipelines da comunidade são carregados da versão estável mais recente do 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"
)Enquanto o Hugging Face Hub varre os arquivos, você ainda deve inspecionar o código do pipeline do Hub e garantir que ele é seguro.
Existem algumas maneiras de carregar um pipeline da comunidade.
Passe um caminho para
custom_pipelinepara carregar um pipeline de comunidade local. O diretório deve conter um arquivopipeline.pycontendo a classe do 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" )O argumento
custom_pipelinetambém é suportado por from_pipe(), o que é útil para reutilizar pipelines sem usar memória adicional. Isso limita o uso de memória apenas ao maior pipeline carregado.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" )O método from_pipe() é especialmente útil para carregar pipelines da comunidade, pois muitos deles não possuem pesos pré-treinados. Os pipelines da comunidade geralmente adicionam um recurso em cima de um pipeline existente.
Componentes da comunidade
Os componentes da comunidade permitem que você crie pipelines com transformers, UNets, VAEs e schedulers personalizados não suportados pelo Diffusers. Esses componentes precisam de seus próprios módulos Python.
Esta seção mostra como os usuários podem usar componentes da comunidade para construir um pipeline da comunidade, usando showlab/show-1-base como exemplo.
- Carregue os componentes necessários, o agendador e o processador de imagem. O codificador de texto geralmente é importado do 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")Nas etapas 2 e 3, a implementação personalizada de UNet e pipeline deve corresponder ao formato mostrado nos respectivos arquivos para que este exemplo funcione.
- Carregue um UNet personalizado que já está implementado em showone_unet_3d_condition.py. O nome da classe UNet3DConditionModel é renomeado para a implementação personalizada,
ShowOneUNet3DConditionModel, porque UNet3DConditionModel já existe no Diffusers. Todos os componentes necessários para a classeShowOneUNet3DConditionModeldevem ser colocados emshowone_unet_3d_condition.py.
from showone_unet_3d_condition import ShowOneUNet3DConditionModel
unet = ShowOneUNet3DConditionModel.from_pretrained(pipeline_id, subfolder="unet")- Carregue o código do pipeline personalizado (já implementado em pipeline_t2v_base_pixel.py). Este script contém uma classe personalizada
TextToVideoIFPipelinepara gerar vídeos a partir de texto. Assim como no caso do UNet personalizado, qualquer código necessário para oTextToVideoIFPipelinedeve ser colocado empipeline_t2v_base_pixel.py.
Inicialize o TextToVideoIFPipeline com o 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"- Envie o pipeline para o Hub para compartilhar com a comunidade.
pipeline.push_to_hub("custom-t2v-pipeline")Após o pipeline ser enviado com sucesso, faça as seguintes alterações.
- Alterne o atributo
_class_nameem model_index.json para["pipeline_t2v_base_pixel", "TextToVideoIFPipeline"]. - Envie
showone_unet_3d_condition.pypara a subpasta unet. - Envie
pipeline_t2v_base_pixel.pypara o repositório do pipeline.
Para executar a inferência, adicione o argumento trust_remote_code ao inicializar o pipeline para lidar com toda a “mágica” nos bastidores.
import torch
from diffusers import DiffusionPipeline
pipeline = DiffusionPipeline.from_pretrained(
"<change-username>/<change-id>", trust_remote_code=True, dtype=torch.float16
)Como precaução adicional ao usar
trust_remote_code=True, passe um hash de commit para o argumentorevisionem from_pretrained() para garantir que o código não tenha sido atualizado com novo código malicioso (a menos que você confie totalmente nos proprietários do modelo).
Próximas etapas
- Dê uma olhada na Issue #841 para mais contexto sobre por que estamos adicionando pipelines da comunidade para ajudar todos a compartilhar facilmente seu trabalho sem serem atrasados.
- Confira o repositório stabilityai/japanese-stable-diffusion-xl para um exemplo adicional de um pipeline da comunidade que também utiliza o recurso
trust_remote_code.