Kolors:用于逼真文本到图像合成的扩散模型的有效训练
Kolors 是一款基于潜在扩散的大规模文本到图像生成模型,由快手 Kolors 团队开发。Kolors 训练于数十亿对文本图像数据,在视觉质量、复杂语义准确性和中英文字符的文本渲染方面,均展现出优于开源和闭源模型的显著优势。此外,Kolors 支持中英文输入,在理解和生成中文特定内容方面表现出色。更多详情,请参考此技术报告。
技术报告摘要如下:
我们提出了 Kolors,一个用于文本到图像合成的潜在扩散模型,其特点是对英语和中文都有深刻的理解,并且具有令人印象深刻的写实程度。Kolors 的开发基于三个关键见解。首先,与 Imagen 和 Stable Diffusion 3 中使用的 T5 大型语言模型不同,Kolors 基于通用语言模型 (GLM) 构建,这增强了其对英语和中文的理解能力。此外,我们使用多模态大型语言模型对庞大的训练数据集进行重新描述,以实现细粒度的文本理解。这些策略显著提高了 Kolors 理解复杂语义(特别是涉及多个实体的语义)的能力,并使其能够实现先进的文本渲染功能。其次,我们将 Kolors 的训练分为两个阶段:拥有广泛知识的概念学习阶段和使用专门策划的高审美数据的质量提升阶段。此外,我们研究了噪声计划的关键作用,并引入了一种新的计划来优化高分辨率图像生成。这些策略共同增强了生成的高分辨率图像的视觉吸引力。最后,我们提出了一个类别平衡的基准 KolorsPrompts,作为 Kolors 训练和评估的指南。因此,即使使用常用的 U-Net 骨干网络,Kolors 在人类评估中也表现出卓越的性能,超过了现有的开源模型,并在视觉吸引力方面达到了 Midjourney-v6 的水平。我们将发布 Kolors 的代码和权重,网址为https://github.com/Kwai-Kolors/Kolors,并希望它能惠及视觉生成社区未来的研究和应用。
使用示例
import torch
from diffusers import DPMSolverMultistepScheduler, KolorsPipeline
pipe = KolorsPipeline.from_pretrained("Kwai-Kolors/Kolors-diffusers", torch_dtype=torch.float16, variant="fp16")
pipe.to("cuda")
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适配器
Kolors 需要不同的 IP 适配器才能工作,并且使用Openai-CLIP-336 作为图像编码器。
使用 Kolors 的 IP 适配器需要超过 24GB 的显存。为了使用它,我们建议在消费级 GPU 上使用enable_model_cpu_offload()。
虽然 Kolors 集成在 Diffusers 中,但您需要从一个版本加载图像编码器才能使用 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,
torch_dtype=torch.float16,
revision="refs/pr/4",
)
pipe = KolorsPipeline.from_pretrained(
"Kwai-Kolors/Kolors-diffusers", image_encoder=image_encoder, torch_dtype=torch.float16, variant="fp16"
).to("cuda")
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: AutoencoderKL text_encoder: ChatGLMModel tokenizer: ChatGLMTokenizer unet: UNet2DConditionModel scheduler: KarrasDiffusionSchedulers image_encoder: CLIPVisionModelWithProjection = None feature_extractor: CLIPImageProcessor = None force_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 进行文本到图像生成的管道。
此模型继承自 DiffusionPipeline。请查看超类文档以了解库为所有管道实现的通用方法(例如下载或保存、在特定设备上运行等)。
该管道还继承以下加载方法
- load_lora_weights() 用于加载 LoRA 权重
- save_lora_weights() 用于保存 LoRA 权重
- load_ip_adapter() 用于加载 IP 适配器
encode_prompt
< source >( prompt device: Optional = None num_images_per_prompt: int = 1 do_classifier_free_guidance: bool = True negative_prompt = None prompt_embeds: Optional = None pooled_prompt_embeds: Optional = None negative_prompt_embeds: Optional = None negative_pooled_prompt_embeds: Optional = None max_sequence_length: int = 256 )
参数
- 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.FloatTensor
, 可选) — 预生成的文本嵌入。可用于轻松调整文本输入,例如 提示加权。如果未提供,则将从prompt
输入参数生成文本嵌入。 - pooled_prompt_embeds (
torch.Tensor
, 可选) — 预生成的池化文本嵌入。可用于轻松调整文本输入,例如 提示加权。如果未提供,则将从prompt
输入参数生成池化文本嵌入。 - negative_prompt_embeds (
torch.FloatTensor
,可选) — 预生成的负面文本嵌入。可用于轻松调整文本输入,例如提示权重。如果未提供,则将从negative_prompt
输入参数生成negative_prompt_embeds。 - negative_pooled_prompt_embeds (
torch.Tensor
,可选) — 预生成的负面池化文本嵌入。可用于轻松调整文本输入,例如提示权重。如果未提供,则将从negative_prompt
输入参数生成池化negative_prompt_embeds。 - max_sequence_length (
int
,默认为 256) — 与prompt
一起使用的最大序列长度。
将提示编码为文本编码器隐藏状态。
get_guidance_scale_embedding
< 源代码 >( w: Tensor embedding_dim: int = 512 dtype: dtype = torch.float32 ) → torch.Tensor
- 全部
- 调用