Diffusers documentation

Kolors: Huấn luyện hiệu quả mô hình khuếch tán cho tổng hợp văn bản thành ảnh chân thực

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: Huấn luyện hiệu quả mô hình khuếch tán cho tổng hợp văn bản thành ảnh chân thực

LoRA MPS

Kolors là mô hình tạo ảnh từ văn bản quy mô lớn dựa trên latent diffusion, do đội ngũ Kuaishou Kolors phát triển. Được huấn luyện trên hàng tỷ cặp văn bản - ảnh, Kolors thể hiện những ưu thế vượt trội so với cả các mô hình mã nguồn mở lẫn mã nguồn đóng về chất lượng hình ảnh, độ chính xác của ngữ nghĩa phức tạp và khả năng hiển thị chữ cho cả ký tự tiếng Trung và tiếng Anh. Hơn nữa, Kolors hỗ trợ cả đầu vào tiếng Trung và tiếng Anh, cho thấy hiệu suất mạnh mẽ trong việc hiểu và tạo nội dung đặc thù của tiếng Trung. Để biết thêm chi tiết, vui lòng tham khảo báo cáo kỹ thuật này.

Tóm tắt từ báo cáo kỹ thuật là:

Chúng tôi giới thiệu Kolors, một mô hình khuếch tán tiềm ẩn (latent diffusion model) cho tổng hợp hình ảnh từ văn bản, nổi bật với khả năng hiểu sâu cả tiếng Anh và tiếng Trung, cùng mức độ chân thực về mặt quang học ấn tượng. Có ba nhận thức then chốt đóng góp vào sự phát triển của Kolors. Thứ nhất, khác với mô hình ngôn ngữ lớn T5 được sử dụng trong Imagen và Stable Diffusion 3, Kolors được xây dựng dựa trên General Language Model (GLM), giúp tăng cường khả năng hiểu của nó trong cả tiếng Anh và tiếng Trung. Hơn nữa, chúng tôi sử dụng một mô hình ngôn ngữ lớn đa phương thức để chú thích lại (recaption) bộ dữ liệu huấn luyện rộng lớn nhằm hiểu văn bản ở mức độ chi tiết. Các chiến lược này cải thiện đáng kể khả năng của Kolors trong việc hiểu các ngữ nghĩa phức tạp, đặc biệt là những ngữ nghĩa liên quan đến nhiều thực thể, và cho phép khả năng hiển thị văn bản tiên tiến của nó. Thứ hai, chúng tôi chia quá trình huấn luyện Kolors thành hai giai đoạn: giai đoạn học khái niệm với kiến thức rộng và giai đoạn cải thiện chất lượng với dữ liệu thẩm mỹ cao được tuyển chọn đặc biệt. Ngoài ra, chúng tôi nghiên cứu vai trò quan trọng của lịch trình nhiễu (noise schedule) và giới thiệu một lịch trình mới để tối ưu hóa việc tạo hình ảnh độ phân giải cao. Các chiến lược này cùng nhau nâng cao sức hấp dẫn thị giác của các hình ảnh độ phân giải cao được tạo ra. Cuối cùng, chúng tôi đề xuất một bộ chuẩn đánh giá cân bằng theo danh mục KolorsPrompts, đóng vai trò là hướng dẫn cho việc huấn luyện và đánh giá Kolors. Do đó, ngay cả khi sử dụng khung xương U-Net phổ biến, Kolors đã thể hiện hiệu suất đáng kể trong các đánh giá của con người, vượt qua các mô hình mã nguồn mở hiện có và đạt hiệu suất ở cấp độ Midjourney-v6, đặc biệt là về mặt sức hấp dẫn thị giác. Chúng tôi sẽ phát hành mã và trọng số của Kolors tại https://github.com/Kwai-Kolors/Kolors, và hy vọng rằng nó sẽ có lợi cho các nghiên cứu và ứng dụng trong tương lai của cộng đồng tạo hình ảnh thị giác.

Ví dụ sử dụng

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 cần một IP Adapter khác để hoạt động, và nó sử dụng Openai-CLIP-336 làm bộ mã hóa hình ảnh.

Việc sử dụng IP Adapter với Kolors đòi hỏi hơn 24GB VRAM. Để sử dụng, chúng tôi khuyến nghị dùng enable_model_cpu_offload() trên GPU tiêu dùng.

Mặc dù Kolors đã được tích hợp trong Diffusers, bạn cần tải image encoder từ một revision để sử dụng các tệp safetensor. Bạn vẫn có thể sử dụng nhánh chính của kho lưu trữ gốc nếu bạn thoải mái khi tải các checkpoint 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

lớp diffusers.KolorsPipeline

< >

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

Tham số

  • vae (AutoencoderKL) — Mô hình Variational Auto-Encoder (VAE) để mã hóa và giải mã hình ảnh từ và sang các biểu diễn ẩn.
  • text_encoder (ChatGLMModel) — Bộ mã hóa văn bản đóng băng. Kolors sử dụng ChatGLM3-6B.
  • tokenizer (ChatGLMTokenizer) — Tokenizer của lớp ChatGLMTokenizer.
  • unet (UNet2DConditionModel) — Kiến trúc U-Net có điều kiện để khử nhiễu các latents ảnh đã mã hóa.
  • scheduler (SchedulerMixin) — Một scheduler được sử dụng kết hợp với unet để khử nhiễu các latents của ảnh đã mã hóa. Có thể là một trong DDIMScheduler, LMSDiscreteScheduler, hoặc PNDMScheduler.
  • force_zeros_for_empty_prompt (bool, tùy chọn, mặc định là "False") — Xác định xem các embedding của prompt tiêu cực có nên được ép luôn về 0 hay không. Xem thêm cấu hình của Kwai-Kolors/Kolors-diffusers.

Pipeline để tạo ảnh từ văn bản sử dụng Kolors.

Mô hình này kế thừa từ DiffusionPipeline. Xem tài liệu của lớp cha để biết các phương thức chung mà thư viện triển khai cho tất cả các pipeline (chẳng hạn như tải xuống hoặc lưu, chạy trên một thiết bị cụ thể, v.v.)

Pipeline cũng kế thừa các phương thức nạp sau:

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 )

Tham số

  • prompt (str hoặc list[str], tùy chọn) — prompt cần được mã hóa
  • device — (torch.device): thiết bị torch
  • num_images_per_prompt (int) — số lượng hình ảnh cần được tạo cho mỗi prompt
  • do_classifier_free_guidance (bool) — có sử dụng classifier free guidance hay không
  • negative_prompt (str hoặc list[str], tùy chọn) — Prompt hoặc các prompt không dùng để định hướng việc tạo ảnh. Nếu không được định nghĩa, cần truyền negative_prompt_embeds thay thế. Bỏ qua khi không sử dụng guidance (tức là bị bỏ qua nếu guidance_scale nhỏ hơn 1).
  • prompt_embeds (torch.FloatTensor, tùy chọn) — Các embedding văn bản đã được tạo trước. Có thể dùng để dễ dàng điều chỉnh đầu vào văn bản, vd. trọng số prompt. Nếu không được cung cấp, các embedding văn bản sẽ được tạo từ đối số đầu vào prompt.
  • pooled_prompt_embeds (torch.Tensor, tùy chọn) — Các embedding văn bản đã được gộp (pooled) sẵn. Có thể dùng để dễ dàng điều chỉnh đầu vào văn bản, vd. trọng số prompt. Nếu không được cung cấp, các embedding văn bản đã gộp sẽ được tạo từ đối số đầu vào prompt.
  • negative_prompt_embeds (torch.FloatTensor, tùy chọn) — Các embedding văn bản âm đã được tạo trước. Có thể dùng để dễ dàng điều chỉnh đầu vào văn bản, vd. trọng số prompt. Nếu không được cung cấp, negative_prompt_embeds sẽ được tạo từ đối số đầu vào negative_prompt.
  • negative_pooled_prompt_embeds (torch.Tensor, tùy chọn) — Các embedding văn bản pooled âm đã được tạo trước. Có thể dùng để dễ dàng điều chỉnh đầu vào văn bản, vd. trọng số prompt. Nếu không được cung cấp, pooled negative_prompt_embeds sẽ được tạo từ đối số đầu vào negative_prompt.
  • max_sequence_length (int, mặc định là 256) — Độ dài tối đa của chuỗi để sử dụng với prompt.

Mã hóa prompt thành các trạng thái ẩn của text encoder.

get_guidance_scale_embedding

< >

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

Tham số

  • w (torch.Tensor) — Tạo các vector nhúng với thang độ dẫn hướng được chỉ định để sau đó làm phong phú các nhúng bước thời gian.
  • embedding_dim (int, tùy chọn, mặc định là 512) — Kích thước của các embedding cần tạo.
  • dtype (torch.dtype, tùy chọn, mặc định là torch.float32) — Kiểu dữ liệu của các embedding được tạo ra.

Trả về

torch.Tensor

Các vector nhúng có hình dạng (len(w), embedding_dim).

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

  • tất cả
  • call

KolorsImg2ImgPipeline

lớp diffusers.KolorsImg2ImgPipeline

< >

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

Tham số

  • vae (AutoencoderKL) — Mô hình Variational Auto-Encoder (VAE) để mã hóa và giải mã hình ảnh từ và sang các biểu diễn ẩn.
  • text_encoder (ChatGLMModel) — Bộ mã hóa văn bản đóng băng. Kolors sử dụng ChatGLM3-6B.
  • tokenizer (ChatGLMTokenizer) — Tokenizer của lớp ChatGLMTokenizer.
  • unet (UNet2DConditionModel) — Kiến trúc U-Net có điều kiện để khử nhiễu các latents ảnh đã mã hóa.
  • scheduler (SchedulerMixin) — Một scheduler được sử dụng kết hợp với unet để khử nhiễu các latents của ảnh đã mã hóa. Có thể là một trong DDIMScheduler, LMSDiscreteScheduler, hoặc PNDMScheduler.
  • force_zeros_for_empty_prompt (bool, tùy chọn, mặc định là "False") — Xác định xem các embedding của prompt tiêu cực có nên được ép luôn về 0 hay không. Xem thêm cấu hình của Kwai-Kolors/Kolors-diffusers.

Pipeline để tạo ảnh từ văn bản sử dụng Kolors.

Mô hình này kế thừa từ DiffusionPipeline. Xem tài liệu của lớp cha để biết các phương thức chung mà thư viện triển khai cho tất cả các pipeline (chẳng hạn như tải xuống hoặc lưu, chạy trên một thiết bị cụ thể, v.v.)

Pipeline cũng kế thừa các phương thức nạp sau:

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 )

Tham số

  • prompt (str hoặc list[str], tùy chọn) — prompt cần được mã hóa
  • device — (torch.device): thiết bị torch
  • num_images_per_prompt (int) — số lượng hình ảnh cần được tạo cho mỗi prompt
  • do_classifier_free_guidance (bool) — có sử dụng classifier free guidance hay không
  • negative_prompt (str hoặc list[str], tùy chọn) — Prompt hoặc các prompt không dùng để định hướng việc tạo ảnh. Nếu không được định nghĩa, cần truyền negative_prompt_embeds thay thế. Bỏ qua khi không sử dụng guidance (tức là bị bỏ qua nếu guidance_scale nhỏ hơn 1).
  • prompt_embeds (torch.FloatTensor, tùy chọn) — Các embedding văn bản đã được tạo trước. Có thể dùng để dễ dàng điều chỉnh đầu vào văn bản, vd. trọng số prompt. Nếu không được cung cấp, các embedding văn bản sẽ được tạo từ đối số đầu vào prompt.
  • pooled_prompt_embeds (torch.Tensor, tùy chọn) — Các embedding văn bản đã được gộp (pooled) sẵn. Có thể dùng để dễ dàng điều chỉnh đầu vào văn bản, vd. trọng số prompt. Nếu không được cung cấp, các embedding văn bản đã gộp sẽ được tạo từ đối số đầu vào prompt.
  • negative_prompt_embeds (torch.FloatTensor, tùy chọn) — Các embedding văn bản âm đã được tạo trước. Có thể dùng để dễ dàng điều chỉnh đầu vào văn bản, vd. trọng số prompt. Nếu không được cung cấp, negative_prompt_embeds sẽ được tạo từ đối số đầu vào negative_prompt.
  • negative_pooled_prompt_embeds (torch.Tensor, tùy chọn) — Các embedding văn bản pooled âm đã được tạo trước. Có thể dùng để dễ dàng điều chỉnh đầu vào văn bản, vd. trọng số prompt. Nếu không được cung cấp, pooled negative_prompt_embeds sẽ được tạo từ đối số đầu vào negative_prompt.
  • max_sequence_length (int, mặc định là 256) — Độ dài tối đa của chuỗi để sử dụng với prompt.

Mã hóa prompt thành các trạng thái ẩn của text encoder.

get_guidance_scale_embedding

< >

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

Tham số

  • w (torch.Tensor) — Tạo các vector nhúng với thang độ dẫn hướng được chỉ định để sau đó làm phong phú các nhúng bước thời gian.
  • embedding_dim (int, tùy chọn, mặc định là 512) — Kích thước của các embedding cần tạo.
  • dtype (torch.dtype, tùy chọn, mặc định là torch.float32) — Kiểu dữ liệu của các embedding được tạo ra.

Trả về

torch.Tensor

Các vector nhúng có hình dạng (len(w), embedding_dim).

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

  • tất cả
  • call
Update on GitHub