Diffusers documentation

社区流水线与组件

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