Diffusers documentation

Kolors:用于照片级真实感文本到图像合成的扩散模型高效训练

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v0.42.1).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Kolors:用于照片级真实感文本到图像合成的扩散模型高效训练

LoRA MPS

Kolors 是由快手 Kolors 团队开发的大规模文本到图像生成模型,基于潜在扩散技术。在数十亿文本-图像对上进行训练后,Kolors 在视觉质量、复杂语义准确性以及中英文字符的文本渲染方面,相较于开源和闭源模型均展现出显著优势。此外,Kolors 支持中英文输入,在理解和生成中文特定内容方面表现出色。更多详情请参阅此技术报告。

技术报告的摘要如下:

我们提出了 Kolors,一种用于文本到图像合成的潜在扩散模型,其特点是对英文和中文都具有深刻的理解能力,并展现出令人印象深刻的照片级真实感。Kolors 的开发得益于三个关键洞察。首先,与 Imagen 和 Stable Diffusion 3 中使用的大型语言模型 T5 不同,Kolors 基于通用语言模型(GLM)构建,从而增强了其对英文和中文的理解能力。此外,我们采用多模态大型语言模型对大规模训练数据集进行重新标注,以实现细粒度的文本理解。这些策略显著提升了 Kolors 理解复杂语义的能力,尤其是涉及多个实体的语义,并使其具备先进的文本渲染能力。其次,我们将 Kolors 的训练分为两个阶段:具有广泛知识的概念学习阶段,以及使用专门策划的高美学数据的质量提升阶段。此外,我们研究了噪声调度(noise schedule)的关键作用,并引入了一种新的调度方案以优化高分辨率图像生成。这些策略共同提升了所生成高分辨率图像的视觉吸引力。最后,我们提出了一个类别均衡的基准 KolorsPrompts,作为 Kolors 训练和评估的指南。因此,即使采用常用的 U-Net 骨干网络,Kolors 在人工评估中也展现了卓越的性能,超越了现有的开源模型,并达到了 Midjourney-v6 级别的性能,尤其是在视觉吸引力方面。我们将在 https://github.com/Kwai-Kolors/Kolors 发布 Kolors 的代码和权重,希望它能为视觉生成领域的未来研究和应用带来益处。

使用示例

import torch

from diffusers import DPMSolverMultistepScheduler, KolorsPipeline

pipe = KolorsPipeline.from_pretrained("Kwai-Kolors/Kolors-diffusers", dtype=torch.float16, variant="fp16")
pipe.to("cuda")  # or "mps", "xpu", "cpu"
pipe.scheduler = DPMSolverMultistepScheduler.from_config(pipe.scheduler.config, use_karras_sigmas=True)

image = pipe(
    prompt='一张瓢虫的照片,微距,变焦,高质量,电影,拿着一个牌子,写着"可图"',
    negative_prompt="",
    guidance_scale=6.5,
    num_inference_steps=25,
).images[0]

image.save("kolors_sample.png")

IP Adapter

Kolors 需要不同的 IP Adapter 才能运行,并且它使用 Openai-CLIP-336 作为图像编码器。

在 Kolors 中使用 IP Adapter 需要超过 24GB 的显存。要在消费级 GPU 上使用它,我们建议对 enable_model_cpu_offload() 进行调用。

虽然 Kolors 已集成到 Diffusers 中,但你需要从特定 revision 加载图像编码器才能使用 safetensor 文件。如果你习惯加载 pickle 检查点,仍然可以使用原始仓库的主分支。

import torch
from transformers import CLIPVisionModelWithProjection

from diffusers import DPMSolverMultistepScheduler, KolorsPipeline
from diffusers.utils import load_image

image_encoder = CLIPVisionModelWithProjection.from_pretrained(
    "Kwai-Kolors/Kolors-IP-Adapter-Plus",
    subfolder="image_encoder",
    low_cpu_mem_usage=True,
    dtype=torch.float16,
    revision="refs/pr/4",
)

pipe = KolorsPipeline.from_pretrained(
    "Kwai-Kolors/Kolors-diffusers", image_encoder=image_encoder, dtype=torch.float16, variant="fp16"
)
pipe.scheduler = DPMSolverMultistepScheduler.from_config(pipe.scheduler.config, use_karras_sigmas=True)

pipe.load_ip_adapter(
    "Kwai-Kolors/Kolors-IP-Adapter-Plus",
    subfolder="",
    weight_name="ip_adapter_plus_general.safetensors",
    revision="refs/pr/4",
    image_encoder_folder=None,
)
pipe.enable_model_cpu_offload()

ipa_image = load_image("https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/kolors/cat_square.png")

image = pipe(
    prompt="best quality, high quality",
    negative_prompt="",
    guidance_scale=6.5,
    num_inference_steps=25,
    ip_adapter_image=ipa_image,
).images[0]

image.save("kolors_ipa_sample.png")

KolorsPipeline

类 diffusers.KolorsPipeline

< >

( vae: AutoencoderKLtext_encoder: ChatGLMModeltokenizer: ChatGLMTokenizerunet: UNet2DConditionModelscheduler: KarrasDiffusionSchedulersimage_encoder: CLIPVisionModelWithProjection = Nonefeature_extractor: CLIPImageProcessorPil = Noneforce_zeros_for_empty_prompt: bool = False )

参数

  • vae (AutoencoderKL) — 变分自编码器(VAE)模型,用于将图像编码为潜在表示,以及从潜在表示解码回图像。
  • text_encoder (ChatGLMModel) — 冻结的文本编码器。Kolors 使用 ChatGLM3-6B。
  • tokenizer (ChatGLMTokenizer) — ChatGLMTokenizer 类的分词器。
  • unet (UNet2DConditionModel) — 用于对编码后的图像潜变量进行去噪的条件 U-Net 架构。
  • scheduler (SchedulerMixin) — 用于与 unet 配合,对编码后的图像潜变量进行去噪的调度器。可以是 DDIMScheduler、LMSDiscreteScheduler 或 PNDMScheduler 之一。
  • force_zeros_for_empty_prompt (bool,可选,默认为 "False") — 是否强制将负提示嵌入始终设置为 0。另请参阅 Kwai-Kolors/Kolors-diffusers 的配置。

使用 Kolors 进行文本到图像生成的 Pipeline。

该模型继承自 DiffusionPipeline。有关该库为所有流水线实现的通用方法(例如下载或保存、在特定设备上运行等),请参阅父类文档。

该 pipeline 还继承了以下加载方法:

encode_prompt

< >

( promptdevice: typing.Optional[torch.device] = Nonenum_images_per_prompt: int = 1do_classifier_free_guidance: bool = Truenegative_prompt = Noneprompt_embeds: typing.Optional[torch.FloatTensor] = Nonepooled_prompt_embeds: typing.Optional[torch.Tensor] = Nonenegative_prompt_embeds: typing.Optional[torch.FloatTensor] = Nonenegative_pooled_prompt_embeds: typing.Optional[torch.Tensor] = Nonemax_sequence_length: int = 256 )

参数

  • prompt (str 或 list[str],可选) — 要编码的提示
  • device — (torch.device): torch 设备
  • num_images_per_prompt (int) — 每个提示词应生成的图像数量
  • do_classifier_free_guidance (bool) — 是否使用 classifier free guidance
  • negative_prompt (str 或 list[str],可选) — 用于不引导图像生成的提示词。如果未定义,则必须传入 negative_prompt_embeds。在未使用引导时会被忽略(即当 guidance_scale 小于 1 时忽略)。
  • prompt_embeds (torch.FloatTensor, 可选) — 预生成的文本嵌入。可用于轻松调整文本输入,例如 提示词加权。如果未提供,文本嵌入将从 prompt 输入参数生成。
  • pooled_prompt_embeds (torch.Tensor, 可选) — 预生成的池化文本嵌入。可用于轻松调整文本输入,例如提示词加权。 如果未提供,将从 prompt 输入参数生成池化文本嵌入。
  • negative_prompt_embeds (torch.FloatTensor, 可选) — 预生成的负向文本嵌入。可用于轻松调整文本输入,例如提示词加权。如果未提供,negative_prompt_embeds 将根据 negative_prompt 输入参数生成。
  • negative_pooled_prompt_embeds (torch.Tensor, 可选) — 预生成的负向池化文本嵌入。可用于轻松调整文本输入,例如提示词加权。如果未提供,将从 negative_prompt 输入参数生成池化的 negative_prompt_embeds。
  • max_sequence_length (int,默认为 256) — 与 prompt 配合使用的最大序列长度。

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

get_guidance_scale_embedding

< >

( w: Tensorembedding_dim: int = 512dtype: dtype = torch.float32 ) → torch.Tensor

参数

  • w (torch.Tensor) — 生成具有指定 guidance scale 的嵌入向量,以用于后续丰富时间步嵌入。
  • embedding_dim (int,可选,默认为 512) — 要生成的嵌入的维度。
  • dtype (torch.dtype,可选,默认为 torch.float32) — 生成嵌入的数据类型。

返回值

torch.Tensor

形状为 (len(w), embedding_dim) 的嵌入向量。

参见 https://github.com/google-research/vdm/blob/dc27b98a554f65cdc654b800da5aa1846545d41b/model_vdm.py#L298

  • 全部
  • 调用

KolorsImg2ImgPipeline

class diffusers.KolorsImg2ImgPipeline

< >

( vae: AutoencoderKLtext_encoder: ChatGLMModeltokenizer: ChatGLMTokenizerunet: UNet2DConditionModelscheduler: KarrasDiffusionSchedulersimage_encoder: CLIPVisionModelWithProjection = Nonefeature_extractor: CLIPImageProcessorPil = Noneforce_zeros_for_empty_prompt: bool = False )

参数

  • vae (AutoencoderKL) — 变分自编码器(VAE)模型,用于将图像编码为潜在表示,以及从潜在表示解码回图像。
  • text_encoder (ChatGLMModel) — 冻结的文本编码器。Kolors 使用 ChatGLM3-6B。
  • tokenizer (ChatGLMTokenizer) — ChatGLMTokenizer 类的分词器。
  • unet (UNet2DConditionModel) — 用于对编码后的图像潜变量进行去噪的条件 U-Net 架构。
  • scheduler (SchedulerMixin) — 用于与 unet 配合,对编码后的图像潜变量进行去噪的调度器。可以是 DDIMScheduler、LMSDiscreteScheduler 或 PNDMScheduler 之一。
  • force_zeros_for_empty_prompt (bool,可选,默认为 "False") — 是否强制将负提示嵌入始终设置为 0。另请参阅 Kwai-Kolors/Kolors-diffusers 的配置。

使用 Kolors 进行文本到图像生成的 Pipeline。

该模型继承自 DiffusionPipeline。有关该库为所有流水线实现的通用方法(例如下载或保存、在特定设备上运行等),请参阅父类文档。

该 pipeline 还继承了以下加载方法:

encode_prompt

< >

( promptdevice: typing.Optional[torch.device] = Nonenum_images_per_prompt: int = 1do_classifier_free_guidance: bool = Truenegative_prompt = Noneprompt_embeds: typing.Optional[torch.FloatTensor] = Nonepooled_prompt_embeds: typing.Optional[torch.Tensor] = Nonenegative_prompt_embeds: typing.Optional[torch.FloatTensor] = Nonenegative_pooled_prompt_embeds: typing.Optional[torch.Tensor] = Nonemax_sequence_length: int = 256 )

参数

  • prompt (str 或 list[str],可选) — 要编码的提示
  • device — (torch.device): torch 设备
  • num_images_per_prompt (int) — 每个提示词应生成的图像数量
  • do_classifier_free_guidance (bool) — 是否使用 classifier free guidance
  • negative_prompt (str 或 list[str],可选) — 用于不引导图像生成的提示词。如果未定义,则必须传入 negative_prompt_embeds。在未使用引导时会被忽略(即当 guidance_scale 小于 1 时忽略)。
  • prompt_embeds (torch.FloatTensor, 可选) — 预生成的文本嵌入。可用于轻松调整文本输入,例如 提示词加权。如果未提供,文本嵌入将从 prompt 输入参数生成。
  • pooled_prompt_embeds (torch.Tensor, 可选) — 预生成的池化文本嵌入。可用于轻松调整文本输入,例如提示词加权。 如果未提供,将从 prompt 输入参数生成池化文本嵌入。
  • negative_prompt_embeds (torch.FloatTensor, 可选) — 预生成的负向文本嵌入。可用于轻松调整文本输入,例如提示词加权。如果未提供,negative_prompt_embeds 将根据 negative_prompt 输入参数生成。
  • negative_pooled_prompt_embeds (torch.Tensor, 可选) — 预生成的负向池化文本嵌入。可用于轻松调整文本输入,例如提示词加权。如果未提供,将从 negative_prompt 输入参数生成池化的 negative_prompt_embeds。
  • max_sequence_length (int,默认为 256) — 与 prompt 配合使用的最大序列长度。

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

get_guidance_scale_embedding

< >

( w: Tensorembedding_dim: int = 512dtype: dtype = torch.float32 ) → torch.Tensor

参数

  • w (torch.Tensor) — 生成具有指定 guidance scale 的嵌入向量,以用于后续丰富时间步嵌入。
  • embedding_dim (int,可选,默认为 512) — 要生成的嵌入的维度。
  • dtype (torch.dtype,可选,默认为 torch.float32) — 生成嵌入的数据类型。

返回值

torch.Tensor

形状为 (len(w), embedding_dim) 的嵌入向量。

参见 https://github.com/google-research/vdm/blob/dc27b98a554f65cdc654b800da5aa1846545d41b/model_vdm.py#L298

  • 全部
  • 调用
Update on GitHub