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。 检查超类文档以了解为所有管道实现的通用方法(下载、保存、在特定设备上运行等)。
该管道还继承以下加载方法
- load_textual_inversion() 用于加载文本反转嵌入
- load_lora_weights() 用于加载 LoRA 权重
- save_lora_weights() 用于保存 LoRA 权重
__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 ) → ImagePipelineOutput 或 tuple
参数
- prompt (
str
或List[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 (
str
或List[str]
, 可选) — 指导图像生成中不包含什么的提示或提示列表。如果未定义,则需要改为传递negative_prompt_embeds
。在不使用引导(guidance_scale < 1
)时忽略。 - num_images_per_prompt (
int
, 可选,默认为 1) — 每个提示生成图像的数量。 - eta (
float
, 可选,默认为 0.0) — 对应于 DDIM 论文中的参数 eta (η)。仅适用于 DDIMScheduler,在其他调度器中被忽略。 - generator (
torch.Generator
或List[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.Image
或np.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_latents (
torch.Tensor
, 可选) — 从高斯分布中预先生成的噪声潜在变量,用作先验去噪过程中图像嵌入生成的输入。可用于使用不同的提示微调相同的生成。如果未提供,则通过使用提供的随机generator
进行采样来生成潜在变量张量。 - clip_skip (
int
, 可选) — 计算提示嵌入时要从 CLIP 跳过的层数。值为 1 表示将使用倒数第二层的输出计算提示嵌入。
返回值
ImagePipelineOutput 或 tuple
如果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' )
启用分片注意力计算。启用此选项后,注意力模块会将输入张量拆分为切片,以分多个步骤计算注意力。对于多个注意力头,计算将按每个头的顺序执行。这有助于以牺牲少量速度降低为代价来节省一些内存。
⚠️ 如果您已经在使用 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]
禁用分片注意力计算。如果之前调用了enable_attention_slicing
,则注意力将一步计算。
启用分片 VAE 解码。启用此选项后,VAE 会将输入张量拆分为切片,以分多个步骤计算解码。这有助于节省一些内存并允许更大的批次大小。
禁用分片 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)
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 (
str
或List[str]
,可选) — 要编码的提示 device — (torch.device
): torch 设备 - num_images_per_prompt (
int
) — 每个提示应生成的图像数量 - do_classifier_free_guidance (
bool
) — 是否使用分类器自由引导 - negative_prompt (
str
或List[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_level
输入控制。较高的noise_level
会增加最终去噪图像的方差。
噪声以两种方式应用
- 噪声调度程序直接应用于嵌入。
- 正弦时间嵌入向量附加到输出。
在这两种情况下,噪声量都由相同的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。 检查超类文档以了解为所有管道实现的通用方法(下载、保存、在特定设备上运行等)。
该管道还继承以下加载方法
- load_textual_inversion() 用于加载文本反转嵌入
- load_lora_weights() 用于加载 LoRA 权重
- save_lora_weights() 用于保存 LoRA 权重
__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 ) → ImagePipelineOutput 或 tuple
参数
- prompt (
str
或List[str]
, 可选) — 用于指导图像生成的提示或提示列表。如果未定义,则将使用prompt_embeds
或将提示初始化为空字符串""
。 - image (
torch.Tensor
或PIL.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 (
str
或List[str]
,可选) — 用于指导图像生成中不包含什么的提示或提示。如果未定义,则需要传递negative_prompt_embeds
。在不使用引导(guidance_scale < 1
)时忽略。 - num_images_per_prompt (
int
,可选,默认为 1) — 每个提示生成图像的数量。 - eta (
float
,可选,默认为 0.0) — 对应于 DDIM 论文中的参数 eta (η)。仅适用于 DDIMScheduler,在其他调度器中被忽略。 - generator (
torch.Generator
或List[torch.Generator]
,可选) — 一个torch.Generator
用于使生成确定性。 - latents (
torch.Tensor
,可选) — 从高斯分布中采样的预生成的噪声潜在变量,用作图像生成的输入。可用于使用不同的提示调整相同的生成。如果未提供,则通过使用提供的随机generator
采样生成潜在变量张量。 - prompt_embeds (
torch.Tensor
,可选) — 预生成的文本嵌入。可用于轻松调整文本输入(提示加权)。如果未提供,则从prompt
输入参数生成文本嵌入。 - 是否返回字典 (
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 表示将使用倒数第二层的输出计算提示嵌入。
返回值
ImagePipelineOutput 或 tuple
如果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
< source > ( slice_size: Union = 'auto' )
启用分片注意力计算。启用此选项后,注意力模块会将输入张量拆分为切片,以分多个步骤计算注意力。对于多个注意力头,计算将按每个头的顺序执行。这有助于以牺牲少量速度降低为代价来节省一些内存。
⚠️ 如果您已经在使用 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]
禁用分片注意力计算。如果之前调用了enable_attention_slicing
,则注意力将一步计算。
启用分片 VAE 解码。启用此选项后,VAE 会将输入张量拆分为切片,以分多个步骤计算解码。这有助于节省一些内存并允许更大的批次大小。
禁用分片 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)
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 (
str
或List[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_level
输入控制。较高的noise_level
会增加最终去噪图像的方差。
噪声以两种方式应用
- 噪声调度程序直接应用于嵌入。
- 正弦时间嵌入向量附加到输出。
在这两种情况下,噪声量都由相同的noise_level
控制。
在应用噪声之前对嵌入进行归一化,并在应用噪声之后取消归一化。
ImagePipelineOutput
类 diffusers.ImagePipelineOutput
< 源代码 >( images: Union )
图像管道输出类。