Diffusers documentation

社区流水线与组件

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v0.42.1).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

社区流水线与组件

社区流水线是 DiffusionPipeline 类,它们与原始论文中的实现有所不同。这些流水线提供了额外的功能,或对原始流水线实现进行了扩展。

请查看 diffusers/examples/community 中的社区流水线,其中包含推理和训练示例,演示了如何使用它们。

社区流水线存储在 Hub 或 Diffusers 的 GitHub 仓库中。Hub 流水线完全可定制(调度器、模型、流水线代码等),而 GitHub 流水线仅限于自定义流水线代码。下表对比了这两种流水线类型。

GitHubHub
用法custom_pipeline="<filename_without_.py>"Hub 仓库 ID,或者当 _class_name 指向自定义代码时使用 trust_remote_code=True
审查流程在 GitHub 上发起 Pull Request,并在合并前接受 Diffusers 团队的审查流程。此选项速度较慢。直接上传到 Hub 仓库,无需审核。这是最快的选项。
可见性包含在官方的 Diffusers 仓库和文档中。包含在您的 Hub 个人资料中,并依赖于您自身的使用和推广来获得曝光度。

加载社区流水线

通过向 from_pretrained() 传递 custom_pipeline 来加载任意类型的社区流水线。

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

将 custom_revision 参数添加到 from_pretrained() 中,以从特定版本(例如 v0.30.0 或 main)加载社区流水线。默认情况下,社区流水线从 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"
)

在 Hugging Face Hub 扫描文件的同时,您仍应检查 Hub 流水线代码,确保其安全。

加载社区 pipeline 有几种方法。

  • 将路径传递给 custom_pipeline 以加载本地社区流水线。该目录必须包含一个 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"
    )
  • custom_pipeline 参数同样受 from_pipe() 支持,这对于在不占用额外内存的情况下复用流水线非常有用。它将内存使用量限制为仅加载的最大流水线。

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

    from_pipe() 方法对于加载社区流水线特别有用,因为许多社区流水线没有预训练权重。社区流水线通常是在现有流水线的基础上增加一项功能。

社区组件

社区组件允许您使用 Diffusers 不支持的自定义 transformer、UNet、VAE 和调度器来构建流水线。这些组件需要拥有自己的 Python 模块。

本节以 showlab/show-1-base 为例,展示用户如何使用社区组件来构建社区流水线。

  1. 加载所需的组件,即调度器和图像处理器。文本编码器通常从 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")

在第 2 步和第 3 步中,自定义的 UNet 和 pipeline 实现必须与其文件中的格式一致,本示例才能正常运行。

  1. 加载一个已在 showone_unet_3d_condition.py 中实现的自定义 UNet。由于 UNet3DConditionModel 在 Diffusers 中已存在,因此将 UNet3DConditionModel 类名重命名为自定义实现 ShowOneUNet3DConditionModel。ShowOneUNet3DConditionModel 类所需的任何组件都应放置在 showone_unet_3d_condition.py 中。
from showone_unet_3d_condition import ShowOneUNet3DConditionModel

unet = ShowOneUNet3DConditionModel.from_pretrained(pipeline_id, subfolder="unet")
  1. 加载自定义流水线代码(已在 pipeline_t2v_base_pixel.py 中实现)。该脚本包含一个用于从文本生成视频的自定义 TextToVideoIFPipeline 类。与自定义 UNet 类似,TextToVideoIFPipeline 所需的任何代码都应放置在 pipeline_t2v_base_pixel.py 中。

使用 ShowOneUNet3DConditionModel 初始化 TextToVideoIFPipeline。

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. 将流水线推送到 Hub,与社区共享。
pipeline.push_to_hub("custom-t2v-pipeline")

成功推送流水线后,进行以下更改。

  • 将 model_index.json 中的 _class_name 属性更改为 ["pipeline_t2v_base_pixel", "TextToVideoIFPipeline"]。
  • 将 showone_unet_3d_condition.py 上传到 unet 子文件夹中。
  • 将 pipeline_t2v_base_pixel.py 上传到 pipeline 仓库。

要运行推理,请在初始化 pipeline 时添加 trust_remote_code 参数,以处理幕后所有的“魔法”操作。

import torch
from diffusers import DiffusionPipeline

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

作为使用 trust_remote_code=True 时的额外预防措施,请在 from_pretrained() 中向 revision 参数传入一个 commit hash,以确保代码未被更新为包含新的恶意代码(除非你完全信任模型所有者)。

后续步骤

  • 请查看 Issue #841,以了解更多关于我们为何要添加社区流水线(community pipelines)的背景信息,旨在帮助大家轻松分享自己的工作,而不受阻碍。
  • 请查看 stabilityai/japanese-stable-diffusion-xl 仓库,了解另一个同样使用 trust_remote_code 功能的社区流水线示例。
Update on GitHub