Diffusers documentation
PixArt-Σ
PixArt-Σ

PixArt-Σ: Weak-to-Strong Training of Diffusion Transformer for 4K Text-to-Image Generation là của Junsong Chen, Jincheng Yu, Chongjian Ge, Lewei Yao, Enze Xie, Yue Wu, Zhongdao Wang, James Kwok, Ping Luo, Huchuan Lu, và Zhenguo Li.
Tóm tắt từ bài báo là:
Trong bài báo này, chúng tôi giới thiệu PixArt-Σ, một mô hình Diffusion Transformer (DiT) có khả năng trực tiếp tạo ảnh ở độ phân giải 4K. PixArt-Σ là một bước tiến vượt bậc so với phiên bản tiền nhiệm, PixArt-α, mang lại hình ảnh có độ trung thực cao hơn rõ rệt và khả năng bám sát prompt văn bản tốt hơn. Một tính năng chính của PixArt-Σ là hiệu quả trong quá trình huấn luyện. Tận dụng quá trình huấn luyện trước nền tảng của PixArt-α, mô hình này tiến hóa từ baseline ‘yếu hơn’ sang một mô hình ‘mạnh hơn’ thông qua việc tích hợp dữ liệu có chất lượng cao hơn, một quy trình mà chúng tôi gọi là “weak-to-strong training”. Những cải tiến của PixArt-Σ bao gồm hai khía cạnh: (1) Dữ liệu huấn luyện chất lượng cao: PixArt-Σ tích hợp dữ liệu hình ảnh có chất lượng vượt trội, được ghép cặp với các chú thích hình ảnh chính xác và chi tiết hơn. (2) Nén token hiệu quả: chúng tôi đề xuất một module attention mới trong khung DiT, nén cả keys và values, cải thiện đáng kể hiệu quả và hỗ trợ việc tạo ảnh ở độ phân giải siêu cao. Nhờ những cải tiến này, PixArt-Σ đạt được chất lượng hình ảnh và khả năng tuân thủ prompt của người dùng vượt trội với kích thước mô hình nhỏ hơn đáng kể (0,6B tham số) so với các mô hình diffusion từ văn bản sang hình ảnh hiện có, chẳng hạn như SDXL (2,6B tham số) và SD Cascade (5,1B tham số). Hơn nữa, khả năng tạo ảnh 4K của PixArt-Σ hỗ trợ việc tạo ra các poster và hình nền độ phân giải cao, thúc đẩy hiệu quả việc sản xuất nội dung thị giác chất lượng cao trong các ngành công nghiệp như điện ảnh và trò chơi điện tử.
Bạn có thể tìm thấy mã nguồn gốc tại PixArt-alpha/PixArt-sigma và tất cả các checkpoint khả dụng tại PixArt-alpha.
Một số lưu ý về pipeline này:
- Nó sử dụng bộ khung Transformer (thay vì UNet) để khử nhiễu. Do đó, nó có kiến trúc tương tự như DiT.
- Mô hình được huấn luyện bằng các điều kiện văn bản được tính toán từ T5. Khía cạnh này giúp pipeline thực hiện tốt hơn trong việc tuân theo các prompt văn bản phức tạp với các chi tiết tinh vi.
- Mô hình này có khả năng tạo ra các hình ảnh độ phân giải cao với nhiều tỷ lệ khung hình khác nhau. Để đạt được kết quả tốt nhất, các tác giả khuyến nghị một số khoảng kích thước, có thể tìm thấy tại đây.
- Mô hình này sánh ngang về chất lượng với các hệ thống tạo ảnh từ văn bản tiên tiến nhất (tại thời điểm viết bài) như PixArt-α, Stable Diffusion XL, Playground V2.0 và DALL-E 3, đồng thời hiệu quả hơn chúng.
- Nó cho thấy khả năng tạo ra các hình ảnh có độ phân giải cực cao, chẳng hạn như 2048px hoặc thậm chí 4K.
- Điều này cho thấy các mô hình từ văn bản sang hình ảnh có thể phát triển từ một mô hình yếu thành một mô hình mạnh hơn thông qua một số cải tiến (VAE, bộ dữ liệu, v.v.)
Hãy chắc chắn xem qua hướng dẫn về Schedulers để tìm hiểu cách khám phá sự đánh đổi giữa tốc độ và chất lượng của scheduler, và xem phần tái sử dụng các thành phần giữa các pipeline để tìm hiểu cách nạp các thành phần giống nhau vào nhiều pipeline một cách hiệu quả.
Bạn có thể cải thiện chất lượng hình ảnh sinh ra hơn nữa bằng cách truyền hình ảnh do PixArtSigmaPipeline tạo ra vào mô hình SDXL refiner.
Suy luận với GPU VRAM dưới 8GB
Chạy PixArtSigmaPipeline với dưới 8GB VRAM GPU bằng cách nạp text encoder ở độ chính xác 8-bit. Hãy cùng xem qua một ví dụ hoàn chỉnh.
Đầu tiên, cài đặt thư viện bitsandbytes:
pip install -U bitsandbytes
Sau đó, nạp text encoder ở 8-bit:
from transformers import T5EncoderModel
from diffusers import PixArtSigmaPipeline
import torch
text_encoder = T5EncoderModel.from_pretrained(
"PixArt-alpha/PixArt-Sigma-XL-2-1024-MS",
subfolder="text_encoder",
load_in_8bit=True,
device_map="auto",
)
pipe = PixArtSigmaPipeline.from_pretrained(
"PixArt-alpha/PixArt-Sigma-XL-2-1024-MS",
text_encoder=text_encoder,
transformer=None,
device_map="balanced"
)Bây giờ, hãy sử dụng pipe để mã hóa một prompt:
with torch.no_grad():
prompt = "cute cat"
prompt_embeds, prompt_attention_mask, negative_embeds, negative_prompt_attention_mask = pipe.encode_prompt(prompt)Vì các vector nhúng văn bản đã được tính toán, hãy xóa text_encoder và pipe khỏi bộ nhớ và giải phóng một phần VRAM GPU:
import gc
def flush():
gc.collect()
torch.cuda.empty_cache()
del text_encoder
del pipe
flush()Sau đó, tính toán các latents với các embeddings của prompt làm đầu vào:
pipe = PixArtSigmaPipeline.from_pretrained(
"PixArt-alpha/PixArt-Sigma-XL-2-1024-MS",
text_encoder=None,
dtype=torch.float16,
).to("cuda") # or "mps", "xpu", "cpu"
latents = pipe(
negative_prompt=None,
prompt_embeds=prompt_embeds,
negative_prompt_embeds=negative_embeds,
prompt_attention_mask=prompt_attention_mask,
negative_prompt_attention_mask=negative_prompt_attention_mask,
num_images_per_prompt=1,
output_type="latent",
).images
del pipe.transformer
flush()Lưu ý rằng khi khởi tạo
pipe, bạn đang đặttext_encoderthànhNoneđể nó không được tải.
Sau khi các latents được tính toán, hãy truyền chúng cho VAE để giải mã thành một hình ảnh thực:
with torch.no_grad():
image = pipe.vae.decode(latents / pipe.vae.config.scaling_factor, return_dict=False)[0]
image = pipe.image_processor.postprocess(image, output_type="pil")[0]
image.save("cat.png")Bằng cách xóa các thành phần bạn không sử dụng và giải phóng bộ nhớ VRAM của GPU, bạn nên có thể chạy PixArtSigmaPipeline với dưới 8GB VRAM GPU.

Nếu bạn muốn có báo cáo về mức sử dụng bộ nhớ, hãy chạy script này.
Việc tính toán text embeddings ở 8-bit có thể ảnh hưởng đến chất lượng của hình ảnh được tạo ra do mất mát thông tin trong không gian biểu diễn gây ra bởi độ chính xác giảm. Khuyến nghị so sánh kết quả đầu ra khi có và không có 8-bit.
Trong khi nạp text_encoder, bạn đã đặt load_in_8bit thành True. Bạn cũng có thể chỉ định load_in_4bit để giảm yêu cầu bộ nhớ xuống còn dưới 7GB.
PixArtSigmaPipeline
lớp diffusers.PixArtSigmaPipeline
< source >( tokenizer: T5Tokenizertext_encoder: T5EncoderModelvae: AutoencoderKLtransformer: PixArtTransformer2DModelscheduler: KarrasDiffusionSchedulers )
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 (
T5EncoderModel) — Bộ mã hóa văn bản đóng băng. PixArt-Alpha sử dụng T5, cụ thể là biến thể t5-v1_1-xxl. - tokenizer (
T5Tokenizer) — Tokenizer của lớp T5Tokenizer. - transformer (PixArtTransformer2DModel) —
Một
PixArtTransformer2DModelcó điều kiện văn bản để khử nhiễu các latents ảnh đã mã hóa. Ban đầu được công bố dưới dạngTransformer2DModeltrong config, nhưng sự không khớp này có thể bỏ qua. - scheduler (SchedulerMixin) —
Một scheduler được sử dụng kết hợp với
transformerđể khử nhiễu các latents của ảnh đã mã hóa.
Pipeline để tạo ảnh từ văn bản sử dụng PixArt-Sigma.
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.)
__call__
< source >( prompt: str | list[str] = Nonenegative_prompt: str = ''num_inference_steps: int = 20timesteps: list = Nonesigmas: list = Noneguidance_scale: float = 4.5num_images_per_prompt: int | None = 1height: int | None = Nonewidth: int | None = Noneeta: float = 0.0generator: typing.Union[torch.Generator, list[torch.Generator], NoneType] = Nonelatents: typing.Optional[torch.Tensor] = Noneprompt_embeds: typing.Optional[torch.Tensor] = Noneprompt_attention_mask: typing.Optional[torch.Tensor] = Nonenegative_prompt_embeds: typing.Optional[torch.Tensor] = Nonenegative_prompt_attention_mask: typing.Optional[torch.Tensor] = Noneoutput_type: str | None = 'pil'return_dict: bool = Truecallback: typing.Optional[typing.Callable[[int, int, torch.Tensor], NoneType]] = Nonecallback_steps: int = 1clean_caption: bool = Trueuse_resolution_binning: bool = Truemax_sequence_length: int = 300**kwargs ) → ImagePipelineOutput or tuple
Tham số
- prompt (
strhoặclist[str], tùy chọn) — Prompt hoặc các prompt để định hướng việc tạo ảnh. Nếu không được định nghĩa, bạn phải truyềnprompt_embedsthay thế. - negative_prompt (
strhoặclist[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ềnnegative_prompt_embedsthay thế. Bỏ qua khi không sử dụng guidance (tức là bị bỏ qua nếuguidance_scalenhỏ hơn1). - num_inference_steps (
int, tùy chọn, mặc định là 100) — Số bước khử nhiễu. Số bước khử nhiễu nhiều hơn thường dẫn đến hình ảnh có chất lượng cao hơn với chi phí là suy luận chậm hơn. - timesteps (
list[int], tùy chọn) — Các bước thời gian tùy chỉnh để sử dụng cho quá trình khử nhiễu với các trình lập lịch hỗ trợ đối sốtimestepstrong phương thứcset_timestepscủa chúng. Nếu không được định nghĩa, hành vi mặc định khinum_inference_stepsđược truyền vào sẽ được sử dụng. Phải được sắp xếp theo thứ tự giảm dần. - sigmas (
list[float], tùy chọn) — Các sigma tùy chỉnh để sử dụng cho quá trình khử nhiễu với các trình lập lịch hỗ trợ đối sốsigmastrong phương thứcset_timestepscủa chúng. Nếu không được định nghĩa, hành vi mặc định khinum_inference_stepsđược truyền sẽ được sử dụng. - guidance_scale (
float, tùy chọn, mặc định là 4.5) — Thang độ dẫn hướng như được định nghĩa trong Classifier-Free Diffusion Guidance.guidance_scaleđược định nghĩa làwcủa phương trình 2. trong Imagen Paper. Thang độ dẫn hướng được kích hoạt bằng cách đặtguidance_scale > 1. Thang độ dẫn hướng cao hơn khuyến khích tạo ra các hình ảnh gắn kết chặt chẽ vớipromptvăn bản, thường phải đánh đổi bằng chất lượng hình ảnh thấp hơn. - num_images_per_prompt (
int, tùy chọn, mặc định là 1) — Số lượng hình ảnh cần tạo cho mỗi prompt. - height (
int, tùy chọn, mặc định là self.unet.config.sample_size) — Chiều cao của hình ảnh được tạo ra, tính bằng pixel. - width (
int, tùy chọn, mặc định là self.unet.config.sample_size) — Chiều rộng của hình ảnh được tạo ra, tính bằng pixel. - eta (
float, tùy chọn, mặc định là 0.0) — Tương ứng với tham số eta (η) trong bài báo DDIM: https://huggingface.co/papers/2010.02502. Chỉ áp dụng cho schedulers.DDIMScheduler, sẽ bị bỏ qua với các scheduler khác. - generator (
torch.Generatorhoặclist[torch.Generator], tuỳ chọn) — Một hoặc một danh sách torch generator để đảm bảo quá trình sinh là tất định. - latents (
torch.Tensor, tùy chọn) — Các latents nhiễu đã được tạo trước, lấy mẫu từ phân phối Gaussian, dùng làm đầu vào cho việc tạo ảnh. Có thể dùng để tinh chỉnh cùng một quá trình tạo với các prompt khác nhau. Nếu không được cung cấp, một tensor latents sẽ được tạo bằng cách lấy mẫu sử dụnggeneratorngẫu nhiên được cung cấp. - prompt_embeds (
torch.Tensor, 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àoprompt. - prompt_attention_mask (
torch.Tensor, tùy chọn) — Mặt nạ chú ý (attention mask) được tạo sẵn cho các vector nhúng văn bản. - negative_prompt_embeds (
torch.Tensor, tùy chọn) — Các embedding văn bản âm đã được tạo trước. Đối với PixArt-Sigma, prompt âm này nên là "". Nếu không được cung cấp, negative_prompt_embeds sẽ được tạo từ đối số đầu vàonegative_prompt. - negative_prompt_attention_mask (
torch.Tensor, tùy chọn) — Mặt nạ chú ý (attention mask) được tạo sẵn cho các vector nhúng văn bản âm (negative text embeddings). - output_type (
str, tùy chọn, mặc định là"pil") — Định dạng đầu ra của hình ảnh được tạo. Chọn giữa PIL:PIL.Image.Imagehoặcnp.array. - return_dict (
bool, tùy chọn, mặc định làTrue) — Có nên trả về một~pipelines.stable_diffusion.IFPipelineOutputthay vì một tuple thông thường hay không. - callback (
Callable, tùy chọn) — Một hàm sẽ được gọi mỗicallback_stepsbước trong quá trình suy luận. Hàm này sẽ được gọi với các đối số sau:callback(step: int, timestep: int, latents: torch.Tensor). - callback_steps (
int, tùy chọn, mặc định là 1) — Tần suất gọi hàmcallback. Nếu không được chỉ định, callback sẽ được gọi ở mỗi bước. - clean_caption (
bool, tùy chọn, mặc định làTrue) — Có nên làm sạch caption trước khi tạo embeddings hay không. Yêu cầubeautifulsoup4vàftfyphải được cài đặt. Nếu các phụ thuộc này không được cài đặt, embeddings sẽ được tạo từ prompt thô. - use_resolution_binning (
boolmặc định làTrue) — Nếu được đặt thànhTrue, chiều cao và chiều rộng yêu cầu sẽ được ánh xạ trước tiên đến các độ phân giải gần nhất bằng cách sử dụngASPECT_RATIO_1024_BIN. Sau khi các latents được tạo ra được giải mã thành hình ảnh, chúng sẽ được thay đổi kích thước trở lại độ phân giải yêu cầu. Hữu ích cho việc tạo ra các hình ảnh không vuông. - max_sequence_length (
int, mặc định là 300) — Độ dài tối đa của chuỗi để sử dụng vớiprompt.
Trả về
ImagePipelineOutput hoặc tuple
Nếu return_dict là True, ImagePipelineOutput sẽ được trả về, ngược lại một tuple sẽ được trả về trong đó phần tử đầu tiên là một danh sách chứa các hình ảnh đã được tạo
Hàm được gọi khi gọi pipeline cho việc sinh.
Ví dụ:
>>> import torch
>>> from diffusers import PixArtSigmaPipeline
>>> # You can replace the checkpoint id with "PixArt-alpha/PixArt-Sigma-XL-2-512-MS" too.
>>> pipe = PixArtSigmaPipeline.from_pretrained(
... "PixArt-alpha/PixArt-Sigma-XL-2-1024-MS", torch_dtype=torch.float16
... )
>>> # Enable memory optimizations.
>>> # pipe.enable_model_cpu_offload()
>>> prompt = "A small cactus with a happy face in the Sahara desert."
>>> image = pipe(prompt).images[0]encode_prompt
< source >( prompt: str | list[str]do_classifier_free_guidance: bool = Truenegative_prompt: str = ''num_images_per_prompt: int = 1device: typing.Optional[torch.device] = Noneprompt_embeds: typing.Optional[torch.Tensor] = Nonenegative_prompt_embeds: typing.Optional[torch.Tensor] = Noneprompt_attention_mask: typing.Optional[torch.Tensor] = Nonenegative_prompt_attention_mask: typing.Optional[torch.Tensor] = Noneclean_caption: bool = Falsemax_sequence_length: int = 300**kwargs )
Tham số
- prompt (
strhoặclist[str], tùy chọn) — prompt cần được mã hóa - negative_prompt (
strhoặclist[str], tùy chọn) — Prompt không dùng để định hướng việc tạo ảnh. Nếu không được định nghĩa, cần truyềnnegative_prompt_embedsthay thế. Bỏ qua khi không sử dụng guidance (tức là bị bỏ qua nếuguidance_scalenhỏ hơn1). Đối với PixArt-Alpha, giá trị này nên là "". - do_classifier_free_guidance (
bool, tùy chọn, mặc định làTrue) — có sử dụng classifier free guidance hay không - num_images_per_prompt (
int, tùy chọn, mặc định là 1) — số lượng hình ảnh cần được tạo cho mỗi prompt - device — (
torch.device, tùy chọn): thiết bị torch để đặt các embedding kết quả lên - prompt_embeds (
torch.Tensor, 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àoprompt. - negative_prompt_embeds (
torch.Tensor, tùy chọn) — Các embedding văn bản âm đã được tạo trước. Đối với PixArt-Alpha, đây nên là các embedding của chuỗi "". - clean_caption (
bool, mặc định làFalse) — NếuTrue, hàm sẽ tiền xử lý và làm sạch chú thích được cung cấp trước khi mã hóa. - max_sequence_length (
int, mặc định là 300) — Độ dài tối đa của chuỗi được sử dụng cho prompt.
Mã hóa prompt thành các trạng thái ẩn của text encoder.