Diffusers 文档

稳定 unCLIP

Hugging Face's logo
加入 Hugging Face 社区

并获得增强文档体验

开始使用

Stable unCLIP

Stable unCLIP 检查点是从 Stable Diffusion 2.1 检查点微调而来,以根据 CLIP 图像嵌入进行调节。Stable unCLIP 仍然以文本嵌入为条件。鉴于两种独立的调节方式,Stable unCLIP 可用于文本引导的图像变化。当与 unCLIP 先验结合时,它也可用于完整的文本到图像生成。

论文摘要如下

对比模型,例如 CLIP,已被证明可以学习图像的鲁棒表示,这些表示同时捕捉语义和风格。为了利用这些表示进行图像生成,我们提出了一种两阶段模型:一个先验模型,根据文本标题生成 CLIP 图像嵌入;以及一个解码器,根据图像嵌入生成图像。我们证明,显式地生成图像表示可以提高图像多样性,同时最大程度地减少照片真实感和标题相似性的损失。我们以图像表示为条件的解码器还可以生成图像的变体,这些变体保留其语义和风格,同时改变图像表示中不存在的非本质细节。此外,CLIP 的联合嵌入空间能够以零样本的方式进行语言引导的图像操作。我们使用扩散模型作为解码器,并对自回归模型和扩散模型作为先验模型进行了实验,发现后者在计算上更有效率,并能生成更高质量的样本。

提示

Stable unCLIP 在推理过程中将noise_level作为输入,用于确定添加到图像嵌入中的噪声量。较高的noise_level会增加最终去噪图像的变化。默认情况下,我们不会向图像嵌入添加任何额外的噪声(noise_level = 0)。

文本到图像生成

Stable unCLIP 可以通过与 KakaoBrain 开源 DALL-E 2 复现模型 Karlo 的先验模型进行流水线处理来用于文本到图像生成。

import torch
from diffusers import UnCLIPScheduler, DDPMScheduler, StableUnCLIPPipeline
from diffusers.models import PriorTransformer
from transformers import CLIPTokenizer, CLIPTextModelWithProjection

prior_model_id = "kakaobrain/karlo-v1-alpha"
data_type = torch.float16
prior = PriorTransformer.from_pretrained(prior_model_id, subfolder="prior", torch_dtype=data_type)

prior_text_model_id = "openai/clip-vit-large-patch14"
prior_tokenizer = CLIPTokenizer.from_pretrained(prior_text_model_id)
prior_text_model = CLIPTextModelWithProjection.from_pretrained(prior_text_model_id, torch_dtype=data_type)
prior_scheduler = UnCLIPScheduler.from_pretrained(prior_model_id, subfolder="prior_scheduler")
prior_scheduler = DDPMScheduler.from_config(prior_scheduler.config)

stable_unclip_model_id = "stabilityai/stable-diffusion-2-1-unclip-small"

pipe = StableUnCLIPPipeline.from_pretrained(
    stable_unclip_model_id,
    torch_dtype=data_type,
    variant="fp16",
    prior_tokenizer=prior_tokenizer,
    prior_text_encoder=prior_text_model,
    prior=prior,
    prior_scheduler=prior_scheduler,
)

pipe = pipe.to("cuda")
wave_prompt = "dramatic wave, the Oceans roar, Strong wave spiral across the oceans as the waves unfurl into roaring crests; perfect wave form; perfect wave shape; dramatic wave shape; wave shape unbelievable; wave; wave shape spectacular"

image = pipe(prompt=wave_prompt).images[0]
image

对于文本到图像,我们使用stabilityai/stable-diffusion-2-1-unclip-small,因为它是在 CLIP ViT-L/14 嵌入上训练的,与 Karlo 模型的先验模型相同。 stabilityai/stable-diffusion-2-1-unclip是在 OpenCLIP ViT-H 上训练的,因此我们不建议使用它。

文本引导的图像到图像变化

from diffusers import StableUnCLIPImg2ImgPipeline
from diffusers.utils import load_image
import torch

pipe = StableUnCLIPImg2ImgPipeline.from_pretrained(
    "stabilityai/stable-diffusion-2-1-unclip", torch_dtype=torch.float16, variation="fp16"
)
pipe = pipe.to("cuda")

url = "https://huggingface.co/datasets/hf-internal-testing/diffusers-images/resolve/main/stable_unclip/tarsila_do_amaral.png"
init_image = load_image(url)

images = pipe(init_image).images
images[0].save("variation_image.png")

或者,您还可以将提示传递给pipe,例如

prompt = "A fantasy landscape, trending on artstation"

image = pipe(init_image, prompt=prompt).images[0]
image

请务必查看调度器 指南,了解如何探索调度器速度和质量之间的权衡,并查看 跨流水线重用组件 部分,了解如何有效地将相同的组件加载到多个流水线中。

StableUnCLIPPipeline

diffusers.StableUnCLIPPipeline

< >

( prior_tokenizer: CLIPTokenizer prior_text_encoder: CLIPTextModelWithProjection prior: PriorTransformer prior_scheduler: KarrasDiffusionSchedulers image_normalizer: StableUnCLIPImageNormalizer image_noising_scheduler: KarrasDiffusionSchedulers tokenizer: CLIPTokenizer text_encoder: CLIPTextModelWithProjection unet: UNet2DConditionModel scheduler: KarrasDiffusionSchedulers vae: AutoencoderKL )

参数

  • prior_tokenizer (CLIPTokenizer) — 一个 CLIPTokenizer
  • prior_text_encoder (CLIPTextModelWithProjection) — 冻结的 CLIPTextModelWithProjection 文本编码器。
  • prior (PriorTransformer) — 用于从文本嵌入近似图像嵌入的规范 unCLIP 先验模型。
  • prior_scheduler (KarrasDiffusionSchedulers) — 用于先验去噪过程的调度器。
  • image_normalizer (StableUnCLIPImageNormalizer) — 用于在应用噪声之前规范化预测的图像嵌入,并在应用噪声之后取消规范化图像嵌入。
  • image_noising_scheduler (KarrasDiffusionSchedulers) — 用于向预测的图像嵌入添加噪声的噪声调度器。 添加噪声的数量由noise_level确定。
  • tokenizer (CLIPTokenizer) — 一个CLIPTokenizer
  • text_encoder (CLIPTextModel) — 冻结的CLIPTextModel文本编码器。
  • unet (UNet2DConditionModel) — 一个UNet2DConditionModel,用于对编码的图像潜在变量进行去噪。
  • scheduler (KarrasDiffusionSchedulers) — 用于与unet结合对编码的图像潜在变量进行去噪的调度器。
  • vae (AutoencoderKL) — 变分自动编码器 (VAE) 模型,用于将图像编码和解码到潜在表示中以及从潜在表示中解码。

使用 stable unCLIP 进行文本到图像生成的管道。

此模型继承自DiffusionPipeline。 检查超类文档以了解为所有管道实现的通用方法(下载、保存、在特定设备上运行等)。

该管道还继承以下加载方法

__call__

< >

( prompt: Union = None height: Optional = None width: Optional = None num_inference_steps: int = 20 guidance_scale: float = 10.0 negative_prompt: Union = None num_images_per_prompt: Optional = 1 eta: float = 0.0 generator: Optional = None latents: Optional = None prompt_embeds: Optional = None negative_prompt_embeds: Optional = None output_type: Optional = 'pil' return_dict: bool = True callback: Optional = None callback_steps: int = 1 cross_attention_kwargs: Optional = None noise_level: int = 0 prior_num_inference_steps: int = 25 prior_guidance_scale: float = 4.0 prior_latents: Optional = None clip_skip: Optional = None ) ImagePipelineOutputtuple

参数

  • prompt (strList[str], 可选) — 指导图像生成的提示或提示列表。如果未定义,则需要传递 prompt_embeds
  • height (int, 可选,默认为 self.unet.config.sample_size * self.vae_scale_factor) — 生成的图像的高度(以像素为单位)。
  • width (int, 可选,默认为 self.unet.config.sample_size * self.vae_scale_factor) — 生成的图像的宽度(以像素为单位)。
  • num_inference_steps (int, 可选,默认为 20) — 降噪步骤的数量。更多的降噪步骤通常会导致更高的图像质量,但推理速度会变慢。
  • guidance_scale (float, 可选,默认为 10.0) — 较高的引导比例值鼓励模型生成与文本 prompt 密切相关的图像,但会牺牲图像质量。当 guidance_scale > 1 时启用引导比例。
  • negative_prompt (strList[str], 可选) — 指导图像生成中不包含什么的提示或提示列表。如果未定义,则需要改为传递 negative_prompt_embeds。在不使用引导(guidance_scale < 1)时忽略。
  • num_images_per_prompt (int, 可选,默认为 1) — 每个提示生成图像的数量。
  • eta (float, 可选,默认为 0.0) — 对应于 DDIM 论文中的参数 eta (η)。仅适用于 DDIMScheduler,在其他调度器中被忽略。
  • generator (torch.GeneratorList[torch.Generator], 可选) — 用于使生成确定性的 torch.Generator
  • latents (torch.Tensor, 可选) — 从高斯分布采样的预生成的噪声潜在变量,用作图像生成的输入。可用于使用不同的提示微调相同的生成。如果未提供,则通过使用提供的随机 generator 采样生成潜在变量张量。
  • prompt_embeds (torch.Tensor, 可选) — 预生成的文本嵌入。可用于轻松调整文本输入(提示加权)。如果未提供,则从 prompt 输入参数生成文本嵌入。
  • negative_prompt_embeds (torch.Tensor, 可选) — 预生成的负文本嵌入。可用于轻松调整文本输入(提示加权)。如果未提供,则从 negative_prompt 输入参数生成 negative_prompt_embeds
  • output_type (str, 可选,默认为 "pil") — 生成的图像的输出格式。在 PIL.Imagenp.array 之间选择。
  • return_dict (bool, 可选,默认为 True) — 是否返回 ImagePipelineOutput 而不是普通元组。
  • callback (Callable, 可选) — 在推理期间每隔 callback_steps 步调用一次的函数。该函数使用以下参数调用:callback(step: int, timestep: int, latents: torch.Tensor)
  • callback_steps (int, 可选,默认为 1) — 调用 callback 函数的频率。如果未指定,则在每个步骤都调用回调。
  • cross_attention_kwargs (dict, 可选) — 如果指定,则传递给 self.processor 中定义的 AttentionProcessor 的 kwargs 字典。
  • noise_level (int, 可选,默认为 0) — 要添加到图像嵌入中的噪声量。较高的 noise_level 会增加最终去噪图像中的方差。有关更多详细信息,请参阅 StableUnCLIPPipeline.noise_image_embeddings()
  • prior_guidance_scale (float, 可选, 默认为 4.0) — 更高的引导尺度值鼓励模型生成与文本prompt紧密相关的图像,但会以降低图像质量为代价。当guidance_scale > 1时启用引导尺度。
  • prior_latents (torch.Tensor, 可选) — 从高斯分布中预先生成的噪声潜在变量,用作先验去噪过程中图像嵌入生成的输入。可用于使用不同的提示微调相同的生成。如果未提供,则通过使用提供的随机generator进行采样来生成潜在变量张量。
  • clip_skip (int, 可选) — 计算提示嵌入时要从 CLIP 跳过的层数。值为 1 表示将使用倒数第二层的输出计算提示嵌入。

返回值

ImagePipelineOutputtuple

如果return_dict为 True,则为~ pipeline_utils.ImagePipelineOutput,否则为tuple。返回元组时,第一个元素是包含生成图像的列表。

管道生成调用函数。

示例

>>> import torch
>>> from diffusers import StableUnCLIPPipeline

>>> pipe = StableUnCLIPPipeline.from_pretrained(
...     "fusing/stable-unclip-2-1-l", torch_dtype=torch.float16
... )  # TODO update model path
>>> pipe = pipe.to("cuda")

>>> prompt = "a photo of an astronaut riding a horse on mars"
>>> images = pipe(prompt).images
>>> images[0].save("astronaut_horse.png")

enable_attention_slicing

< >

( slice_size: Union = 'auto' )

参数

  • slice_size (strint, 可选, 默认为 "auto") — 当为 "auto" 时,将输入到注意力头的输入减半,因此注意力将分两步计算。如果为 "max",则通过一次仅运行一个切片来节省最大的内存。如果提供了一个数字,则使用与 attention_head_dim // slice_size 相同数量的切片。在这种情况下,attention_head_dim 必须是 slice_size 的倍数。

启用分片注意力计算。启用此选项后,注意力模块会将输入张量拆分为切片,以分多个步骤计算注意力。对于多个注意力头,计算将按每个头的顺序执行。这有助于以牺牲少量速度降低为代价来节省一些内存。

⚠️ 如果您已经在使用 PyTorch 2.0 或 xFormers 的 scaled_dot_product_attention (SDPA),请不要启用注意力分片。这些注意力计算已经非常节省内存,因此您无需启用此功能。如果使用 SDPA 或 xFormers 启用注意力分片,会导致严重的减速!

示例

>>> import torch
>>> from diffusers import StableDiffusionPipeline

>>> pipe = StableDiffusionPipeline.from_pretrained(
...     "runwayml/stable-diffusion-v1-5",
...     torch_dtype=torch.float16,
...     use_safetensors=True,
... )

>>> prompt = "a photo of an astronaut riding a horse on mars"
>>> pipe.enable_attention_slicing()
>>> image = pipe(prompt).images[0]

disable_attention_slicing

< >

( )

禁用分片注意力计算。如果之前调用了enable_attention_slicing,则注意力将一步计算。

enable_vae_slicing

< >

( )

启用分片 VAE 解码。启用此选项后,VAE 会将输入张量拆分为切片,以分多个步骤计算解码。这有助于节省一些内存并允许更大的批次大小。

disable_vae_slicing

< >

( )

禁用分片 VAE 解码。如果之前启用了enable_vae_slicing,则此方法将恢复一步计算解码。

enable_xformers_memory_efficient_attention

< >

( attention_op: Optional = None )

参数

  • attention_op (Callable可选) — 覆盖默认的 None 操作符,用作 memory_efficient_attention() 函数(xFormers)中的 op 参数。

启用来自 xFormers 的内存高效注意力机制。启用此选项后,您应该会观察到更低的 GPU 内存使用率,并在推理过程中可能加速。训练过程的加速无法保证。

⚠️ 当同时启用内存高效注意力机制和切片注意力机制时,内存高效注意力机制优先。

示例

>>> import torch
>>> from diffusers import DiffusionPipeline
>>> from xformers.ops import MemoryEfficientAttentionFlashAttentionOp

>>> pipe = DiffusionPipeline.from_pretrained("stabilityai/stable-diffusion-2-1", torch_dtype=torch.float16)
>>> pipe = pipe.to("cuda")
>>> pipe.enable_xformers_memory_efficient_attention(attention_op=MemoryEfficientAttentionFlashAttentionOp)
>>> # Workaround for not accepting attention shape using VAE for Flash Attention
>>> pipe.vae.enable_xformers_memory_efficient_attention(attention_op=None)

disable_xformers_memory_efficient_attention

< >

( )

禁用来自 xFormers 的内存高效注意力机制。

encode_prompt

< >

( prompt device num_images_per_prompt do_classifier_free_guidance negative_prompt = None prompt_embeds: Optional = None negative_prompt_embeds: Optional = None lora_scale: Optional = None clip_skip: Optional = None )

参数

  • prompt (strList[str]可选) — 要编码的提示 device — (torch.device): torch 设备
  • num_images_per_prompt (int) — 每个提示应生成的图像数量
  • do_classifier_free_guidance (bool) — 是否使用分类器自由引导
  • negative_prompt (strList[str]可选) — 不引导图像生成的提示或提示。如果未定义,则必须传递 negative_prompt_embeds。在不使用引导时忽略(即,如果 guidance_scale 小于 1,则忽略)。
  • prompt_embeds (torch.Tensor可选) — 预生成的文本嵌入。可用于轻松调整文本输入,例如 提示加权。如果未提供,则将根据 prompt 输入参数生成文本嵌入。
  • negative_prompt_embeds (torch.Tensor可选) — 预生成的负文本嵌入。可用于轻松调整文本输入,例如 提示加权。如果未提供,则将根据 negative_prompt 输入参数生成 negative_prompt_embeds
  • lora_scale (float, 可选) — 如果加载了 LoRA 层,则将应用于文本编码器所有 LoRA 层的 LoRA 比例。
  • clip_skip (int, 可选) — 计算提示嵌入时要跳过的 CLIP 层数。值为 1 表示将使用倒数第二层的输出计算提示嵌入。

将提示编码为文本编码器隐藏状态。

noise_image_embeddings

< >

( image_embeds: 张量 noise_level: int noise: 可选 generator: 可选 )

为图像嵌入添加噪声。噪声量由noise_level输入控制。较高的noise_level会增加最终去噪图像的方差。

噪声以两种方式应用

  1. 噪声调度程序直接应用于嵌入。
  2. 正弦时间嵌入向量附加到输出。

在这两种情况下,噪声量都由相同的noise_level控制。

在应用噪声之前对嵌入进行归一化,并在应用噪声之后取消归一化。

StableUnCLIPImg2ImgPipeline

diffusers.StableUnCLIPImg2ImgPipeline

< >

( feature_extractor: CLIPImageProcessor image_encoder: CLIPVisionModelWithProjection image_normalizer: StableUnCLIPImageNormalizer image_noising_scheduler: KarrasDiffusionSchedulers tokenizer: CLIPTokenizer text_encoder: CLIPTextModel unet: UNet2DConditionModel scheduler: KarrasDiffusionSchedulers vae: AutoencoderKL )

参数

  • feature_extractor (CLIPImageProcessor) — 用于在编码之前预处理图像的特征提取器。
  • image_encoder (CLIPVisionModelWithProjection) — 用于编码图像的 CLIP 视觉模型。
  • image_normalizer (StableUnCLIPImageNormalizer) — 用于在应用噪声之前对预测的图像嵌入进行归一化,并在应用噪声之后取消对图像嵌入的归一化。
  • image_noising_scheduler (KarrasDiffusionSchedulers) — 用于向预测的图像嵌入添加噪声的噪声调度程序。要添加的噪声量由noise_level决定。
  • tokenizer (~transformers.CLIPTokenizer) — 一个 [~transformers.CLIPTokenizer]。
  • text_encoder (CLIPTextModel) — 冻结的 CLIPTextModel 文本编码器。
  • unet (UNet2DConditionModel) — 用于对编码图像潜在变量进行去噪的 UNet2DConditionModel
  • scheduler (KarrasDiffusionSchedulers) — 与 unet 结合使用,用于对编码图像潜在变量进行去噪的调度器。
  • vae (AutoencoderKL) — 用于将图像编码和解码到潜在表示的变分自动编码器 (VAE) 模型。

使用 stable unCLIP 进行文本引导的图像到图像生成的管道。

此模型继承自DiffusionPipeline。 检查超类文档以了解为所有管道实现的通用方法(下载、保存、在特定设备上运行等)。

该管道还继承以下加载方法

__call__

< >

( image: Union = None prompt: Union = None height: Optional = None width: Optional = None num_inference_steps: int = 20 guidance_scale: float = 10 negative_prompt: Union = None num_images_per_prompt: Optional = 1 eta: float = 0.0 generator: Optional = None latents: Optional = None prompt_embeds: Optional = None negative_prompt_embeds: Optional = None output_type: Optional = 'pil' return_dict: bool = True callback: Optional = None callback_steps: int = 1 cross_attention_kwargs: Optional = None noise_level: int = 0 image_embeds: Optional = None clip_skip: Optional = None ) ImagePipelineOutputtuple

参数

  • prompt (strList[str], 可选) — 用于指导图像生成的提示或提示列表。如果未定义,则将使用 prompt_embeds 或将提示初始化为空字符串 ""
  • image (torch.TensorPIL.Image.Image) — 表示图像批次的 Image 或张量。图像被编码为其 CLIP 嵌入,unet 以此为条件。与标准的 Stable Diffusion 文本引导图像变化过程不同,图像**不会**由 vae 编码,然后用作去噪过程中的潜在变量。
  • height (int可选,默认为 self.unet.config.sample_size * self.vae_scale_factor) — 生成的图像的高度(以像素为单位)。
  • width (int可选,默认为 self.unet.config.sample_size * self.vae_scale_factor) — 生成的图像的宽度(以像素为单位)。
  • num_inference_steps (int可选,默认为 20) — 降噪步骤的数量。更多的降噪步骤通常会导致更高的图像质量,但推理速度会变慢。
  • guidance_scale (float可选,默认为 10.0) — 更高的引导尺度值会鼓励模型生成与文本 prompt 密切相关的图像,但会牺牲图像质量。当 guidance_scale > 1 时启用引导尺度。
  • negative_prompt (strList[str]可选) — 用于指导图像生成中不包含什么的提示或提示。如果未定义,则需要传递 negative_prompt_embeds。在不使用引导(guidance_scale < 1)时忽略。
  • num_images_per_prompt (int可选,默认为 1) — 每个提示生成图像的数量。
  • eta (float可选,默认为 0.0) — 对应于 DDIM 论文中的参数 eta (η)。仅适用于 DDIMScheduler,在其他调度器中被忽略。
  • generator (torch.GeneratorList[torch.Generator]可选) — 一个 torch.Generator 用于使生成确定性。
  • latents (torch.Tensor可选) — 从高斯分布中采样的预生成的噪声潜在变量,用作图像生成的输入。可用于使用不同的提示调整相同的生成。如果未提供,则通过使用提供的随机 generator 采样生成潜在变量张量。
  • prompt_embeds (torch.Tensor可选) — 预生成的文本嵌入。可用于轻松调整文本输入(提示加权)。如果未提供,则从 prompt 输入参数生成文本嵌入。
  • 输出类型 (str, 可选, 默认为 "pil") — 生成的图像的输出格式。在 PIL.Imagenp.array 之间选择。
  • 是否返回字典 (bool, 可选, 默认为 True) — 是否返回一个 ImagePipelineOutput 而不是一个普通元组。
  • 回调函数 (Callable, 可选) — 在推理过程中每隔 callback_steps 步调用一次的函数。该函数使用以下参数调用:callback(step: int, timestep: int, latents: torch.Tensor)
  • 回调步长 (int, 可选, 默认为 1) — 调用 callback 函数的频率。如果未指定,则在每个步骤都调用回调函数。
  • 交叉注意力关键字参数 (dict, 可选) — 如果指定,则传递给 self.processor 中定义的 AttentionProcessor 的关键字参数字典。
  • 噪声级别 (int, 可选, 默认为 0) — 要添加到图像嵌入中的噪声量。较高的 noise_level 会增加最终去噪图像的变化。有关更多详细信息,请参阅 StableUnCLIPPipeline.noise_image_embeddings()
  • 图像嵌入 (torch.Tensor, 可选) — 预生成的 CLIP 嵌入,用于对 unet 进行条件化。这些潜在变量不用于去噪过程。如果要提供预生成的潜在变量,请将其作为 latents 传递给 __call__
  • CLIP 跳过层数 (int, 可选) — 计算提示嵌入时要从 CLIP 跳过的层数。值为 1 表示将使用倒数第二层的输出计算提示嵌入。

返回值

ImagePipelineOutputtuple

如果return_dict为 True,则为~ pipeline_utils.ImagePipelineOutput,否则为tuple。返回元组时,第一个元素是包含生成图像的列表。

管道生成调用函数。

示例

>>> import requests
>>> import torch
>>> from PIL import Image
>>> from io import BytesIO

>>> from diffusers import StableUnCLIPImg2ImgPipeline

>>> pipe = StableUnCLIPImg2ImgPipeline.from_pretrained(
...     "stabilityai/stable-diffusion-2-1-unclip-small", torch_dtype=torch.float16
... )
>>> pipe = pipe.to("cuda")

>>> url = "https://raw.githubusercontent.com/CompVis/stable-diffusion/main/assets/stable-samples/img2img/sketch-mountains-input.jpg"

>>> response = requests.get(url)
>>> init_image = Image.open(BytesIO(response.content)).convert("RGB")
>>> init_image = init_image.resize((768, 512))

>>> prompt = "A fantasy landscape, trending on artstation"

>>> images = pipe(init_image, prompt).images
>>> images[0].save("fantasy_landscape.png")

enable_attention_slicing

< >

( slice_size: Union = 'auto' )

参数

  • 切片大小 (strint, 可选, 默认为 "auto") — 当为 "auto" 时,将注意力头的输入减半,因此注意力将分两步计算。如果为 "max",则将通过一次运行一个切片来节省最多的内存。如果提供了一个数字,则使用与 attention_head_dim // slice_size 相同数量的切片。在这种情况下,attention_head_dim 必须是 slice_size 的倍数。

启用分片注意力计算。启用此选项后,注意力模块会将输入张量拆分为切片,以分多个步骤计算注意力。对于多个注意力头,计算将按每个头的顺序执行。这有助于以牺牲少量速度降低为代价来节省一些内存。

⚠️ 如果您已经在使用 PyTorch 2.0 或 xFormers 的 scaled_dot_product_attention (SDPA),请不要启用注意力分片。这些注意力计算已经非常节省内存,因此您无需启用此功能。如果使用 SDPA 或 xFormers 启用注意力分片,会导致严重的减速!

示例

>>> import torch
>>> from diffusers import StableDiffusionPipeline

>>> pipe = StableDiffusionPipeline.from_pretrained(
...     "runwayml/stable-diffusion-v1-5",
...     torch_dtype=torch.float16,
...     use_safetensors=True,
... )

>>> prompt = "a photo of an astronaut riding a horse on mars"
>>> pipe.enable_attention_slicing()
>>> image = pipe(prompt).images[0]

disable_attention_slicing

< >

( )

禁用分片注意力计算。如果之前调用了enable_attention_slicing,则注意力将一步计算。

enable_vae_slicing

< >

( )

启用分片 VAE 解码。启用此选项后,VAE 会将输入张量拆分为切片,以分多个步骤计算解码。这有助于节省一些内存并允许更大的批次大小。

disable_vae_slicing

< >

( )

禁用分片 VAE 解码。如果之前启用了enable_vae_slicing,则此方法将恢复一步计算解码。

enable_xformers_memory_efficient_attention

< >

( attention_op: Optional = None )

参数

  • attention_op (Callable, 可选) — 覆盖默认的 None 运算符,用作 xFormers 的 memory_efficient_attention() 函数的 op 参数。

启用来自 xFormers 的内存高效注意力机制。启用此选项后,您应该会观察到更低的 GPU 内存使用率,并在推理过程中可能加速。训练过程的加速无法保证。

⚠️ 当同时启用内存高效注意力机制和切片注意力机制时,内存高效注意力机制优先。

示例

>>> import torch
>>> from diffusers import DiffusionPipeline
>>> from xformers.ops import MemoryEfficientAttentionFlashAttentionOp

>>> pipe = DiffusionPipeline.from_pretrained("stabilityai/stable-diffusion-2-1", torch_dtype=torch.float16)
>>> pipe = pipe.to("cuda")
>>> pipe.enable_xformers_memory_efficient_attention(attention_op=MemoryEfficientAttentionFlashAttentionOp)
>>> # Workaround for not accepting attention shape using VAE for Flash Attention
>>> pipe.vae.enable_xformers_memory_efficient_attention(attention_op=None)

disable_xformers_memory_efficient_attention

< >

( )

禁用来自 xFormers 的内存高效注意力机制。

encode_prompt

< >

( prompt device num_images_per_prompt do_classifier_free_guidance negative_prompt = None prompt_embeds: Optional = None negative_prompt_embeds: Optional = None lora_scale: Optional = None clip_skip: Optional = None )

参数

  • prompt (strList[str], 可选) — 要编码的提示 device — (torch.device): torch 设备
  • num_images_per_prompt (int) — 每个提示应生成的图像数量
  • do_classifier_free_guidance (bool) — 是否使用分类器免费引导
  • prompt_embeds (torch.Tensor可选) — 预生成的文本嵌入。可用于轻松调整文本输入,例如提示加权。如果未提供,则将从prompt输入参数生成文本嵌入。
  • negative_prompt_embeds (torch.Tensor可选) — 预生成的负文本嵌入。可用于轻松调整文本输入,例如提示加权。如果未提供,则将从negative_prompt输入参数生成negative_prompt_embeds。
  • lora_scale (float可选) — 如果加载了LoRA层,则将应用于文本编码器所有LoRA层的LoRA缩放比例。
  • clip_skip (int可选) — 计算提示嵌入时要从CLIP跳过的层数。值为1表示将使用倒数第二层的输出计算提示嵌入。

将提示编码为文本编码器隐藏状态。

noise_image_embeddings

< >

( image_embeds: 张量 noise_level: int noise: 可选 generator: 可选 )

为图像嵌入添加噪声。噪声量由noise_level输入控制。较高的noise_level会增加最终去噪图像的方差。

噪声以两种方式应用

  1. 噪声调度程序直接应用于嵌入。
  2. 正弦时间嵌入向量附加到输出。

在这两种情况下,噪声量都由相同的noise_level控制。

在应用噪声之前对嵌入进行归一化,并在应用噪声之后取消归一化。

ImagePipelineOutput

diffusers.ImagePipelineOutput

< >

( images: Union )

参数

  • images (List[PIL.Image.Image]np.ndarray) — 长度为batch_size的去噪PIL图像列表或形状为(batch_size, height, width, num_channels)的NumPy数组。

图像管道输出类。

< > 在GitHub上更新