Models: Single neural network that models p_ΞΈ(x_t-1|x_t) and is trained to βdenoiseβ to image Examples: UNet, Conditioned UNet, 3D UNet, Transformer UNet
Schedulers: Algorithm to sample noise schedule for both training and inference. Defines alpha and beta schedule, timesteps, etc.. Example: Gaussian DDPM, DDIM, PMLS, DEIN
Diffusion Pipeline: End-to-end pipeline that includes multiple diffusion models, possible text encoders, CLIP Example: GLIDE,CompVis/Latent-Diffusion, Imagen, DALL-E
diffusers
is more modularized than transformers
. The idea is that researchers and engineers can use only parts of the library easily for the own use cases.
It could become a central place for all kinds of models, schedulers, training utils and processors that one can mix and match for one's own use case.
Both models and scredulers should be load- and saveable from the Hub.
Example:
import torch
from diffusers import UNetModel, GaussianDDPMScheduler
import PIL
import numpy as np
generator = torch.Generator()
generator = generator.manual_seed(6694729458485568)
torch_device = "cuda" if torch.cuda.is_available() else "cpu"
# 1. Load models
scheduler = GaussianDDPMScheduler.from_config("fusing/ddpm-lsun-church")
model = UNetModel.from_pretrained("fusing/ddpm-lsun-church").to(torch_device)
# 2. Sample gaussian noise
image = scheduler.sample_noise((1, model.in_channels, model.resolution, model.resolution), device=torch_device, generator=generator)
# 3. Denoise
for t in reversed(range(len(scheduler))):
# i) define coefficients for time step t
clipped_image_coeff = 1 / torch.sqrt(scheduler.get_alpha_prod(t))
clipped_noise_coeff = torch.sqrt(1 / scheduler.get_alpha_prod(t) - 1)
image_coeff = (1 - scheduler.get_alpha_prod(t - 1)) * torch.sqrt(scheduler.get_alpha(t)) / (1 - scheduler.get_alpha_prod(t))
clipped_coeff = torch.sqrt(scheduler.get_alpha_prod(t - 1)) * scheduler.get_beta(t) / (1 - scheduler.get_alpha_prod(t))
# ii) predict noise residual
with torch.no_grad():
noise_residual = model(image, t)
# iii) compute predicted image from residual
# See 2nd formula at https://github.com/hojonathanho/diffusion/issues/5#issue-896554416 for comparison
pred_mean = clipped_image_coeff * image - clipped_noise_coeff * noise_residual
pred_mean = torch.clamp(pred_mean, -1, 1)
prev_image = clipped_coeff * pred_mean + image_coeff * image
# iv) sample variance
prev_variance = scheduler.sample_variance(t, prev_image.shape, device=torch_device, generator=generator)
# v) sample x_{t-1} ~ N(prev_image, prev_variance)
sampled_prev_image = prev_image + prev_variance
image = sampled_prev_image
# process image to PIL
image_processed = image.cpu().permute(0, 2, 3, 1)
image_processed = (image_processed + 1.0) * 127.5
image_processed = image_processed.numpy().astype(np.uint8)
image_pil = PIL.Image.fromarray(image_processed[0])
# save image
image_pil.save("test.png")
models
directory in repository hosts the complete code necessary for running a diffusion system as well as to train it. A DiffusionPipeline
class allows to easily run the diffusion model in inference:
Example:
from diffusers import DiffusionPipeline
import PIL.Image
import numpy as np
# load model and scheduler
ddpm = DiffusionPipeline.from_pretrained("fusing/ddpm-lsun-bedroom")
# run pipeline in inference (sample random noise and denoise)
image = ddpm()
# process image to PIL
image_processed = image.cpu().permute(0, 2, 3, 1)
image_processed = (image_processed + 1.0) * 127.5
image_processed = image_processed.numpy().astype(np.uint8)
image_pil = PIL.Image.fromarray(image_processed[0])
# save image
image_pil.save("test.png")
βββ models
βΒ Β βββ audio
βΒ Β βΒ Β βββ fastdiff
βΒ Β βΒ Β βββ modeling_fastdiff.py
βΒ Β βΒ Β βββ README.md
βΒ Β βΒ Β βββ run_fastdiff.py
βΒ Β βββ __init__.py
βΒ Β βββ vision
βΒ Β βββ dalle2
βΒ Β βΒ Β βββ modeling_dalle2.py
βΒ Β βΒ Β βββ README.md
βΒ Β βΒ Β βββ run_dalle2.py
βΒ Β βββ ddpm
βΒ Β βΒ Β βββ example.py
βΒ Β βΒ Β βββ modeling_ddpm.py
βΒ Β βΒ Β βββ README.md
βΒ Β βΒ Β βββ run_ddpm.py
βΒ Β βββ glide
βΒ Β βΒ Β βββ modeling_glide.py
βΒ Β βΒ Β βββ modeling_vqvae.py.py
βΒ Β βΒ Β βββ README.md
βΒ Β βΒ Β βββ run_glide.py
βΒ Β βββ imagen
βΒ Β βΒ Β βββ modeling_dalle2.py
βΒ Β βΒ Β βββ README.md
βΒ Β βΒ Β βββ run_dalle2.py
βΒ Β βββ __init__.py
βΒ Β βββ latent_diffusion
βΒ Β βββ modeling_latent_diffusion.py
βΒ Β βββ README.md
βΒ Β βββ run_latent_diffusion.py
βββ pyproject.toml
βββ README.md
βββ setup.cfg
βββ setup.py
βββ src
βΒ Β βββ diffusers
βΒ Β βββ configuration_utils.py
βΒ Β βββ __init__.py
βΒ Β βββ modeling_utils.py
βΒ Β βββ models
βΒ Β βΒ Β βββ __init__.py
βΒ Β βΒ Β βββ unet_glide.py
βΒ Β βΒ Β βββ unet.py
βΒ Β βββ pipeline_utils.py
βΒ Β βββ schedulers
βΒ Β βββ gaussian_ddpm.py
βΒ Β βββ __init__.py
βββ tests
βΒ Β βββ test_modeling_utils.py