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

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
< source >( 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 还继承了以下加载方法:
- 用于加载 LoRA 权重的 load_lora_weights()
- 用于保存 LoRA 权重的 save_lora_weights()
- 用于加载 IP Adapter 的 load_ip_adapter()
encode_prompt
< source >( 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
< source >( w: Tensorembedding_dim: int = 512dtype: dtype = torch.float32 ) → torch.Tensor
- 全部
- 调用
KolorsImg2ImgPipeline
class diffusers.KolorsImg2ImgPipeline
< source >( 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 还继承了以下加载方法:
- 用于加载 LoRA 权重的 load_lora_weights()
- 用于保存 LoRA 权重的 save_lora_weights()
- 用于加载 IP Adapter 的 load_ip_adapter()
encode_prompt
< source >( 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
< source >( w: Tensorembedding_dim: int = 512dtype: dtype = torch.float32 ) → torch.Tensor
- 全部
- 调用