diffusers - 🤗Diffusers 提供跨多种模式(例如视觉和音频)的预训练扩散模型,并用作扩散模型推理和训练的模块化工具箱。

Created at: 2022-05-31 00:04:02
Language: Python
License: Apache-2.0



GitHub GitHub 发布 贡献者契约

🤗扩散器提供跨多种模态(如视觉和音频)的预训练扩散模型,并用作推理和训练扩散模型的模块化工具箱。

更准确地说,🤗扩散器提供:

  • 最先进的扩散管道,只需几行代码即可在推理中运行(请参阅src/扩散器/管道)。
  • 各种噪声调度器,可以互换使用,用于推理中的首选速度与质量权衡(参见src/扩散器/调度器)。
  • 多种类型的模型(如 UNet)可用作端到端扩散系统中的构建块(请参见 src/扩散器/模型)。
  • 训练示例,以演示如何训练最流行的扩散模型(请参阅示例/训练)。
  • 推理示例,用于演示如何为高级任务(如 image2image、画中)创建自定义管道(请参阅示例/推理)

快速入门

为了开始使用,我们建议你看一下两个笔记本:

  • 扩散器在科拉布中打开入门笔记本,其中展示了扩散模型、调度程序和管道的端到端用法示例。看看这本笔记本,了解如何使用管道抽象,它为你处理了一切(模型、调度程序、噪声处理),并了解库中的每个独立构建基块。
  • 训练扩散器模型在科拉布中打开笔记本总结了扩散器模型训练方法。此笔记本采用循序渐进的方法,在图像数据集上训练扩散器模型,并带有解释性图形。

新增功能 🎨🎨🎨Stable Diffusion 现在与 !
diffusers

Stable Diffusion是由CompVisStability AILAION的研究人员和工程师创建的文本到图像潜在扩散模型。它是在来自LAION-5B数据库子集的512x512图像上训练的。此模型使用冻结的 CLIP ViT-L/14 文本编码器根据文本提示对模型进行调理。凭借其860M UNet和123M文本编码器,该型号相对轻巧,可在具有至少10GB VRAM的GPU上运行。有关详细信息,请参阅型号卡

你需要先接受模型许可,然后才能下载或使用稳定扩散权重。如果你同意,请访问模型卡,阅读许可证并勾选复选框。你必须是 Hugging Face Hub 中的🤗注册用户,并且还需要使用访问令牌才能使代码正常工作。有关访问令牌的详细信息,请参阅文档的此部分

# make sure you're logged in with `huggingface-cli login`
from torch import autocast
from diffusers import StableDiffusionPipeline, LMSDiscreteScheduler

lms = LMSDiscreteScheduler(
    beta_start=0.00085, 
    beta_end=0.012, 
    beta_schedule="scaled_linear"
)

pipe = StableDiffusionPipeline.from_pretrained(
    "CompVis/stable-diffusion-v1-3", 
    scheduler=lms,
    use_auth_token=True
).to("cuda")

prompt = "a photo of an astronaut riding a horse on mars"
with autocast("cuda"):
    image = pipe(prompt)["sample"][0]  
    
image.save("astronaut_rides_horse.png")

有关更多详细信息,请查看稳定扩散笔记本在科拉布中打开并查看发行说明

例子

如果你想自己💻运行代码,你可以试试:

# !pip install diffusers transformers
from diffusers import DiffusionPipeline

model_id = "CompVis/ldm-text2im-large-256"

# load model and scheduler
ldm = DiffusionPipeline.from_pretrained(model_id)

# run pipeline in inference (sample random noise and denoise)
prompt = "A painting of a squirrel eating a burger"
images = ldm([prompt], num_inference_steps=50, eta=0.3, guidance_scale=6)["sample"]

# save images
for idx, image in enumerate(images):
    image.save(f"squirrel-{idx}.png")
# !pip install diffusers
from diffusers import DDPMPipeline, DDIMPipeline, PNDMPipeline

model_id = "google/ddpm-celebahq-256"

# load model and scheduler
ddpm = DDPMPipeline.from_pretrained(model_id)  # you can replace DDPMPipeline with DDIMPipeline or PNDMPipeline for faster inference

# run pipeline in inference (sample random noise and denoise)
image = ddpm()["sample"]

# save image
image[0].save("ddpm_generated_image.png")

如果你只想玩一些网络演示,可以尝试以下🚀空间:

拥抱面部空间
文本到图像潜在扩散 拥抱面部空间
人脸生成器 拥抱面部空间
具有不同调度程序的 DDPM 拥抱面部空间

定义

模型:神经网络,$p_\theta(\mathbf{x}_{t-1}|\mathbf{x}_t)$(见下图)进行建模,并经过端到端训练以消除图像的噪声输入。示例:UNet、条件 UNet、3D UNet、Transformer UNet


图来自 DDPM 纸张(https://arxiv.org/abs/2006.11239)。

调度程序:用于推理和训练算法类。该类提供了根据 alpha、beta 计划计算先前图像以及预测训练噪声的功能。示例DDPMDDIMPNDMDEIS


采样和训练算法。图来自 DDPM 纸张(https://arxiv.org/abs/2006.11239)。

扩散管道:端到端管道,包括多个扩散模型,可能的文本编码器,...示例:滑动、潜扩散、成像、DALL-E 2


图来自ImageGen(https://imagen.research.google/)。

哲学

  • 可读性和清晰度优于高度优化的代码。提供可读性,直观和基本的代码设计非常重要。例如,提供的调度程序与提供的模型分开,并提供可以与原始论文一起读取的注释良好的代码。
  • 扩散器是独立于模态的,专注于提供预先训练的模型和工具,以构建生成连续输出的系统,例如视觉和音频。
  • 扩散模型和调度程序作为简洁的基本构建块提供。相比之下,扩散管道是端到端扩散系统的集合,可以开箱即用,应尽可能接近其原始实现,并且可以包含另一个库的组件,例如文本编码器。扩散管道的示例包括滑动潜在扩散

安装

pip install --upgrade diffusers  # should install diffusers 0.2.4

康达

conda install -c conda-forge diffusers

制作中

对于第一个版本,🤗扩散器专注于文本到图像的扩散技术。然而,扩散器可以用于更多!在即将发布的版本中,我们将重点关注:

一些管道组件已经在开发中,即:

  • BDDMPipeline 用于频谱图到声音的发声
  • GLIDEPipeline支持OpenAI的GLIDE模型
  • 用于文本到音频生成/条件音频生成的 Grad-TTS

我们希望扩散器成为一般扩散器模型有用的工具箱;如果你发现自己受到当前 API 的任何限制,或者希望看到其他模型、调度程序或技术,请打开 GitHub 问题,提及你希望看到的内容。

捐赠

这个库具体化了许多不同作者以前的工作,如果没有他们伟大的研究和实现,这是不可能实现的。我们要特别感谢以下实现,这些实现帮助我们进行开发,没有这些实现,API就不会像今天这样完善:

  • @CompVis的潜在扩散模型库,可在此处获取
  • @hojonathanho原始的DDPM实现,可在此处获得,以及@pesser的PyTorch非常有用的翻译,可在此处获得
  • @ermongroup的DDIM实现,可在此处获得
  • @yang-song的Score-VE和Score-VP实现,可在此处获得

我们还要感谢@heejkoo对扩散模型的论文、代码和资源的非常有用的概述,以及@crowsonkb和@rromb,以进行有用的讨论和见解。