Diffusers documentation
Stable Diffusion 3
Stable Diffusion 3
Stable Diffusion 3 (SD3) được đề xuất trong Scaling Rectified Flow Transformers for High-Resolution Image Synthesis bởi Patrick Esser, Sumith Kulal, Andreas Blattmann, Rahim Entezari, Jonas Muller, Harry Saini, Yam Levi, Dominik Lorenz, Axel Sauer, Frederic Boesel, Dustin Podell, Tim Dockhorn, Zion English, Kyle Lacey, Alex Goodwin, Yannik Marek và Robin Rombach.
Tóm tắt từ bài báo là:
Các mô hình khuếch tán tạo dữ liệu từ nhiễu bằng cách đảo ngược các đường dẫn tiến của dữ liệu hướng về phía nhiễu và đã nổi lên như một kỹ thuật mô hình hóa sinh mạnh mẽ cho dữ liệu cảm nhận có chiều cao như hình ảnh và video. Rectified flow là một công thức hóa mô hình sinh gần đây kết nối dữ liệu và nhiễu bằng một đường thẳng. Mặc dù có các thuộc tính lý thuyết tốt hơn và sự đơn giản về mặt khái niệm, nó vẫn chưa được thiết lập một cách quyết định như một thực hành chuẩn. Trong công việc này, chúng tôi cải thiện các kỹ thuật lấy mẫu nhiễu hiện có để huấn luyện các mô hình rectified flow bằng cách thiên lệch chúng về các thang đo liên quan đến cảm nhận. Thông qua một nghiên cứu quy mô lớn, chúng tôi chứng minh hiệu suất vượt trội của cách tiếp cận này so với các công thức hóa khuếch tán đã được thiết lập cho tổng hợp văn-bản-thành-hình ảnh độ phân giải cao. Ngoài ra, chúng tôi trình bày một kiến trúc dựa trên transformer mới cho việc tạo hình ảnh từ văn bản, sử dụng các trọng số riêng biệt cho hai phương thức và cho phép luồng thông tin hai chiều giữa các token hình ảnh và văn bản, cải thiện khả năng hiểu văn bản, typography và điểm đánh giá sở thích của con người. Chúng tôi chứng minh rằng kiến trúc này tuân theo các xu hướng mở rộng có thể dự đoán được và tương quan giữa tổn thất xác thực thấp hơn với tổng hợp văn-bản-thành-hình ảnh được cải thiện, được đo bằng các chỉ số khác nhau và đánh giá của con người.
Ví dụ sử dụng
Vì mô hình được kiểm soát truy cập, trước khi sử dụng với diffusers, bạn cần truy cập trang Hugging Face của Stable Diffusion 3 Medium, điền biểu mẫu và chấp nhận điều kiện truy cập. Sau khi được cấp quyền, bạn cần đăng nhập để hệ thống xác nhận bạn đã chấp nhận điều kiện truy cập.
Sử dụng lệnh bên dưới để đăng nhập:
hf auth login
Pipeline SD3 sử dụng ba text encoder để tạo ảnh. Việc offload model là cần thiết để pipeline này có thể chạy trên phần cứng phổ thông. Vui lòng sử dụng kiểu dữ liệu
torch.float16để tiết kiệm thêm bộ nhớ.
import torch
from diffusers import StableDiffusion3Pipeline
pipe = StableDiffusion3Pipeline.from_pretrained("stabilityai/stable-diffusion-3-medium-diffusers", dtype=torch.float16)
pipe.to("cuda") # or "mps", "xpu", "cpu"
image = pipe(
prompt="a photo of a cat holding a sign that says hello world",
negative_prompt="",
num_inference_steps=28,
height=1024,
width=1024,
guidance_scale=7.0,
).images[0]
image.save("sd3_hello_world.png")Lưu ý: Stable Diffusion 3.5 cũng có thể được chạy bằng pipeline SD3, và tất cả các tối ưu hóa và kỹ thuật được đề cập đều áp dụng cho nó. Tổng cộng có ba mô hình chính thức trong họ SD3:
stabilityai/stable-diffusion-3-medium-diffusersstabilityai/stable-diffusion-3.5-largestabilityai/stable-diffusion-3.5-large-turbo
Tạo hình ảnh bằng IP-Adapters
IP-Adapter cho phép bạn đưa vào SD3 các hình ảnh làm prompt, bên cạnh prompt văn bản. Điều này đặc biệt hữu ích khi mô tả các khái niệm phức tạp khó diễn đạt chỉ bằng văn bản và bạn có các hình ảnh tham khảo. Để tải và sử dụng IP-Adapter, bạn cần:
image_encoder: Mô hình thị giác được huấn luyện trước, dùng để trích xuất đặc trưng hình ảnh, thường là bộ mã hóa hình ảnh CLIP.feature_extractor: Bộ xử lý ảnh chuẩn bị ảnh đầu vào choimage_encoderđã chọn.ip_adapter_id: Checkpoint chứa các tham số của các lớp image cross attention và image projection.
IP-Adapters được huấn luyện cho một kiến trúc mô hình cụ thể, do đó chúng cũng hoạt động với các biến thể đã tinh chỉnh của mô hình cơ sở. Bạn có thể sử dụng hàm ~SD3IPAdapterMixin.set_ip_adapter_scale để điều chỉnh mức độ mà đầu ra bám sát theo prompt hình ảnh. Giá trị càng cao, mô hình càng tuân thủ chặt chẽ prompt hình ảnh. Giá trị mặc định là 0.5 thường là sự cân bằng tốt, đảm bảo mô hình xem xét cả prompt văn bản và prompt hình ảnh một cách bình đẳng.
import torch
from PIL import Image
from diffusers import StableDiffusion3Pipeline
from transformers import SiglipVisionModel, SiglipImageProcessor
image_encoder_id = "google/siglip-so400m-patch14-384"
ip_adapter_id = "InstantX/SD3.5-Large-IP-Adapter"
feature_extractor = SiglipImageProcessor.from_pretrained(
image_encoder_id,
dtype=torch.float16
)
image_encoder = SiglipVisionModel.from_pretrained(
image_encoder_id,
dtype=torch.float16
).to( "cuda") # or "mps", "xpu", "cpu"
pipe = StableDiffusion3Pipeline.from_pretrained(
"stabilityai/stable-diffusion-3.5-large",
dtype=torch.float16,
feature_extractor=feature_extractor,
image_encoder=image_encoder,
).to("cuda")
pipe.load_ip_adapter(ip_adapter_id)
pipe.set_ip_adapter_scale(0.6)
ref_img = Image.open("image.jpg").convert('RGB')
image = pipe(
width=1024,
height=1024,
prompt="a cat",
negative_prompt="lowres, low quality, worst quality",
num_inference_steps=24,
guidance_scale=5.0,
ip_adapter_image=ref_img
).images[0]
image.save("result.jpg")
Xem IP-Adapter để tìm hiểu thêm về cách IP-Adapter hoạt động.
Tối ưu hóa bộ nhớ cho SD3
SD3 sử dụng ba text encoder, trong đó có mô hình T5-XXL rất lớn. Điều này khiến việc chạy mô hình trên các GPU có VRAM dưới 24GB trở nên khó khăn, ngay cả khi sử dụng độ chính xác fp16. Phần tiếp theo nêu bật một số tối ưu hóa bộ nhớ trong Diffusers giúp việc chạy SD3 trên phần cứng có tài nguyên thấp trở nên dễ dàng hơn.
Chạy suy luận với việc chuyển mô hình
Tối ưu hóa bộ nhớ cơ bản nhất có sẵn trong Diffusers cho phép bạn chuyển các thành phần của mô hình sang CPU trong quá trình suy luận để tiết kiệm bộ nhớ, với sự gia tăng nhẹ về độ trễ suy luận. Việc offload mô hình chỉ sẽ di chuyển một thành phần của mô hình lên GPU khi cần thực thi, trong khi giữ các thành phần còn lại trên CPU.
import torch
from diffusers import StableDiffusion3Pipeline
pipe = StableDiffusion3Pipeline.from_pretrained("stabilityai/stable-diffusion-3-medium-diffusers", dtype=torch.float16)
pipe.enable_model_cpu_offload()
image = pipe(
prompt="a photo of a cat holding a sign that says hello world",
negative_prompt="",
num_inference_steps=28,
height=1024,
width=1024,
guidance_scale=7.0,
).images[0]
image.save("sd3_hello_world.png")Bỏ Text Encoder T5 trong quá trình suy luận
Việc loại bỏ trình mã hóa văn bản T5-XXL 4,7B tham số, vốn tiêu tốn nhiều bộ nhớ, trong quá trình suy luận có thể giảm đáng kể yêu cầu bộ nhớ cho SD3 với mức suy giảm hiệu suất rất nhỏ.
import torch
from diffusers import StableDiffusion3Pipeline
pipe = StableDiffusion3Pipeline.from_pretrained(
"stabilityai/stable-diffusion-3-medium-diffusers",
text_encoder_3=None,
tokenizer_3=None,
dtype=torch.float16
)
pipe.to("cuda") # or "mps", "xpu", "cpu"
image = pipe(
prompt="a photo of a cat holding a sign that says hello world",
negative_prompt="",
num_inference_steps=28,
height=1024,
width=1024,
guidance_scale=7.0,
).images[0]
image.save("sd3_hello_world-no-T5.png")Sử dụng phiên bản lượng tử hóa của bộ mã hóa văn bản T5
Chúng ta có thể tận dụng thư viện bitsandbytes để tải và lượng tử hóa text encoder T5-XXL xuống độ chính xác 8-bit. Điều này cho phép bạn tiếp tục sử dụng cả ba text encoder mà chỉ ảnh hưởng nhẹ đến hiệu năng.
Trước tiên, hãy cài đặt thư viện bitsandbytes.
pip install bitsandbytes
Sau đó, tải mô hình T5-XXL bằng cách sử dụng BitsAndBytesConfig.
import torch
from diffusers import StableDiffusion3Pipeline
from transformers import T5EncoderModel, BitsAndBytesConfig
quantization_config = BitsAndBytesConfig(load_in_8bit=True)
model_id = "stabilityai/stable-diffusion-3-medium-diffusers"
text_encoder = T5EncoderModel.from_pretrained(
model_id,
subfolder="text_encoder_3",
quantization_config=quantization_config,
)
pipe = StableDiffusion3Pipeline.from_pretrained(
model_id,
text_encoder_3=text_encoder,
device_map="balanced",
dtype=torch.float16
)
image = pipe(
prompt="a photo of a cat holding a sign that says hello world",
negative_prompt="",
num_inference_steps=28,
height=1024,
width=1024,
guidance_scale=7.0,
).images[0]
image.save("sd3_hello_world-8bit-T5.png")Bạn có thể tìm thấy script end-to-end tại đây.
Tối ưu hóa hiệu năng cho SD3
Sử dụng Torch Compile để tăng tốc suy luận
Việc sử dụng các thành phần đã biên dịch trong pipeline SD3 có thể tăng tốc suy luận lên đến 4 lần. Đoạn mã sau minh họa cách biên dịch các thành phần Transformer và VAE của pipeline SD3.
import torch
from diffusers import StableDiffusion3Pipeline
torch.set_float32_matmul_precision("high")
torch._inductor.config.conv_1x1_as_mm = True
torch._inductor.config.coordinate_descent_tuning = True
torch._inductor.config.epilogue_fusion = False
torch._inductor.config.coordinate_descent_check_all_directions = True
pipe = StableDiffusion3Pipeline.from_pretrained(
"stabilityai/stable-diffusion-3-medium-diffusers",
dtype=torch.float16
).to("cuda") # or "mps", "xpu", "cpu"
pipe.set_progress_bar_config(disable=True)
pipe.transformer.to(memory_format=torch.channels_last)
pipe.vae.to(memory_format=torch.channels_last)
pipe.transformer = torch.compile(pipe.transformer, mode="max-autotune", fullgraph=True)
pipe.vae.decode = torch.compile(pipe.vae.decode, mode="max-autotune", fullgraph=True)
# Warm Up
prompt = "a photo of a cat holding a sign that says hello world"
for _ in range(3):
_ = pipe(prompt=prompt, generator=torch.manual_seed(1))
# Run Inference
image = pipe(prompt=prompt, generator=torch.manual_seed(1)).images[0]
image.save("sd3_hello_world.png")Xem toàn bộ script tại đây.
Lượng tử hóa
Quantization giúp giảm yêu cầu về bộ nhớ của các mô hình rất lớn bằng cách lưu trữ trọng số mô hình trong kiểu dữ liệu có độ chính xác thấp hơn. Tuy nhiên, lượng tử hóa có thể ảnh hưởng khác nhau đến chất lượng video tùy thuộc vào mô hình video.
Tham khảo phần tổng quan Lượng tử hóa để tìm hiểu thêm về các backend lượng tử hóa được hỗ trợ và cách chọn một backend lượng tử hóa phù hợp với trường hợp sử dụng của bạn. Ví dụ bên dưới minh họa cách tải một StableDiffusion3Pipeline đã được lượng tử hóa để suy luận bằng bitsandbytes.
import torch
from diffusers import BitsAndBytesConfig as DiffusersBitsAndBytesConfig, SD3Transformer2DModel, StableDiffusion3Pipeline
from transformers import BitsAndBytesConfig as BitsAndBytesConfig, T5EncoderModel
quant_config = BitsAndBytesConfig(load_in_8bit=True)
text_encoder_8bit = T5EncoderModel.from_pretrained(
"stabilityai/stable-diffusion-3.5-large",
subfolder="text_encoder_3",
quantization_config=quant_config,
dtype=torch.float16,
)
quant_config = DiffusersBitsAndBytesConfig(load_in_8bit=True)
transformer_8bit = SD3Transformer2DModel.from_pretrained(
"stabilityai/stable-diffusion-3.5-large",
subfolder="transformer",
quantization_config=quant_config,
dtype=torch.float16,
)
pipeline = StableDiffusion3Pipeline.from_pretrained(
"stabilityai/stable-diffusion-3.5-large",
text_encoder=text_encoder_8bit,
transformer=transformer_8bit,
dtype=torch.float16,
device_map="balanced",
)
prompt = "a tiny astronaut hatching from an egg on the moon"
image = pipeline(prompt, num_inference_steps=28, guidance_scale=7.0).images[0]
image.save("sd3.png")Sử dụng Prompt dài với T5 Text Encoder
Mặc định, prompt của T5 Text Encoder sử dụng độ dài chuỗi tối đa là 256. Giá trị này có thể được điều chỉnh bằng cách đặt max_sequence_length để chấp nhận ít hoặc nhiều token hơn. Lưu ý rằng các chuỗi dài hơn đòi hỏi thêm tài nguyên và dẫn đến thời gian tạo ra dài hơn, chẳng hạn như trong quá trình suy luận theo lô (batch inference).
prompt = "A whimsical and creative image depicting a hybrid creature that is a mix of a waffle and a hippopotamus, basking in a river of melted butter amidst a breakfast-themed landscape. It features the distinctive, bulky body shape of a hippo. However, instead of the usual grey skin, the creature’s body resembles a golden-brown, crispy waffle fresh off the griddle. The skin is textured with the familiar grid pattern of a waffle, each square filled with a glistening sheen of syrup. The environment combines the natural habitat of a hippo with elements of a breakfast table setting, a river of warm, melted butter, with oversized utensils or plates peeking out from the lush, pancake-like foliage in the background, a towering pepper mill standing in for a tree. As the sun rises in this fantastical world, it casts a warm, buttery glow over the scene. The creature, content in its butter river, lets out a yawn. Nearby, a flock of birds take flight"
image = pipe(
prompt=prompt,
negative_prompt="",
num_inference_steps=28,
guidance_scale=4.5,
max_sequence_length=512,
).images[0]Gửi một prompt khác đến T5 Text Encoder
Bạn có thể gửi một prompt khác đến các CLIP Text Encoders và T5 Text Encoder để ngăn prompt bị cắt ngắn bởi các CLIP Text Encoders và cải thiện quá trình tạo.
Prompt với các CLIP Text Encoders vẫn bị cắt ngắn ở giới hạn 77 token.
prompt = "A whimsical and creative image depicting a hybrid creature that is a mix of a waffle and a hippopotamus, basking in a river of melted butter amidst a breakfast-themed landscape. A river of warm, melted butter, pancake-like foliage in the background, a towering pepper mill standing in for a tree."
prompt_3 = "A whimsical and creative image depicting a hybrid creature that is a mix of a waffle and a hippopotamus, basking in a river of melted butter amidst a breakfast-themed landscape. It features the distinctive, bulky body shape of a hippo. However, instead of the usual grey skin, the creature’s body resembles a golden-brown, crispy waffle fresh off the griddle. The skin is textured with the familiar grid pattern of a waffle, each square filled with a glistening sheen of syrup. The environment combines the natural habitat of a hippo with elements of a breakfast table setting, a river of warm, melted butter, with oversized utensils or plates peeking out from the lush, pancake-like foliage in the background, a towering pepper mill standing in for a tree. As the sun rises in this fantastical world, it casts a warm, buttery glow over the scene. The creature, content in its butter river, lets out a yawn. Nearby, a flock of birds take flight"
image = pipe(
prompt=prompt,
prompt_3=prompt_3,
negative_prompt="",
num_inference_steps=28,
guidance_scale=4.5,
max_sequence_length=512,
).images[0]Tiny AutoEncoder cho Stable Diffusion 3
Tiny AutoEncoder for Stable Diffusion (TAESD3) là phiên bản distilled nhỏ gọn của VAE trong Stable Diffusion 3 do Ollin Boer Bohan phát triển, có khả năng giải mã latents của StableDiffusion3Pipeline gần như tức thì.
Để sử dụng với Stable Diffusion 3:
import torch
from diffusers import StableDiffusion3Pipeline, AutoencoderTiny
pipe = StableDiffusion3Pipeline.from_pretrained(
"stabilityai/stable-diffusion-3-medium-diffusers", dtype=torch.float16
)
pipe.vae = AutoencoderTiny.from_pretrained("madebyollin/taesd3", dtype=torch.float16)
pipe = pipe.to("cuda") # or "mps", "xpu", "cpu"
prompt = "slice of delicious New York-style berry cheesecake"
image = pipe(prompt, num_inference_steps=25).images[0]
image.save("cheesecake.png")Tải các checkpoint gốc thông qua from_single_file
Các lớp SD3Transformer2DModel và StableDiffusion3Pipeline hỗ trợ nạp các checkpoint gốc thông qua phương thức from_single_file. Phương thức này cho phép bạn nạp các tệp checkpoint gốc đã được sử dụng để huấn luyện các mô hình.
Tải các checkpoint gốc cho SD3Transformer2DModel
from diffusers import SD3Transformer2DModel
model = SD3Transformer2DModel.from_single_file("https://huggingface.co/stabilityai/stable-diffusion-3-medium/blob/main/sd3_medium.safetensors")Tải checkpoint đơn cho StableDiffusion3Pipeline
Tải checkpoint tệp đơn mà không có T5
import torch
from diffusers import StableDiffusion3Pipeline
pipe = StableDiffusion3Pipeline.from_single_file(
"https://huggingface.co/stabilityai/stable-diffusion-3-medium/blob/main/sd3_medium_incl_clips.safetensors",
dtype=torch.float16,
text_encoder_3=None
)
pipe.enable_model_cpu_offload()
image = pipe("a picture of a cat holding a sign that says hello world").images[0]
image.save('sd3-single-file.png')Tải checkpoint tệp đơn với T5
Ví dụ sau tải một checkpoint được lưu trữ ở định dạng số dấu phẩy động 8-bit, yêu cầu PyTorch 2.3 trở lên.
import torch
from diffusers import StableDiffusion3Pipeline
pipe = StableDiffusion3Pipeline.from_single_file(
"https://huggingface.co/stabilityai/stable-diffusion-3-medium/blob/main/sd3_medium_incl_clips_t5xxlfp8.safetensors",
dtype=torch.float16,
)
pipe.enable_model_cpu_offload()
image = pipe("a picture of a cat holding a sign that says hello world").images[0]
image.save('sd3-single-file-t5-fp8.png')Tải checkpoint tệp đơn cho Mô hình Transformer của Stable Diffusion 3.5
import torch
from diffusers import SD3Transformer2DModel, StableDiffusion3Pipeline
transformer = SD3Transformer2DModel.from_single_file(
"https://huggingface.co/stabilityai/stable-diffusion-3.5-large-turbo/blob/main/sd3.5_large.safetensors",
dtype=torch.bfloat16,
)
pipe = StableDiffusion3Pipeline.from_pretrained(
"stabilityai/stable-diffusion-3.5-large",
transformer=transformer,
dtype=torch.bfloat16,
)
pipe.enable_model_cpu_offload()
image = pipe("a cat holding a sign that says hello world").images[0]
image.save("sd35.png")StableDiffusion3Pipeline
lớp diffusers.StableDiffusion3Pipeline
< source >( transformer: SD3Transformer2DModelscheduler: FlowMatchEulerDiscreteSchedulervae: AutoencoderKLtext_encoder: CLIPTextModelWithProjectiontokenizer: CLIPTokenizertext_encoder_2: CLIPTextModelWithProjectiontokenizer_2: CLIPTokenizertext_encoder_3: T5EncoderModeltokenizer_3: T5Tokenizerimage_encoder: SiglipVisionModel = Nonefeature_extractor: SiglipImageProcessorPil = None )
Tham số
- transformer (SD3Transformer2DModel) — Kiến trúc Conditional Transformer (MMDiT) để khử nhiễu các latents ảnh đã mã hóa.
- scheduler (FlowMatchEulerDiscreteScheduler) —
Một scheduler được sử dụng kết hợp với
transformerđể khử nhiễu các latents ảnh đã được mã hóa. - 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 (
CLIPTextModelWithProjection) — CLIP, cụ thể là biến thể clip-vit-large-patch14, với một lớp chiếu bổ sung được khởi tạo bằng một ma trận chéo có kích thước làhidden_size. - text_encoder_2 (
CLIPTextModelWithProjection) — CLIP, cụ thể là biến thể laion/CLIP-ViT-bigG-14-laion2B-39B-b160k. - text_encoder_3 (
T5EncoderModel) — Bộ mã hóa văn bản đóng băng. Stable Diffusion 3 sử dụng T5, cụ thể là biến thể t5-v1_1-xxl. - tokenizer (
CLIPTokenizer) — Tokenizer của lớp CLIPTokenizer. - tokenizer_2 (
CLIPTokenizer) — Tokenizer thứ hai thuộc lớp CLIPTokenizer. - tokenizer_3 (
T5TokenizerFast) — Tokenizer của lớp T5Tokenizer. - image_encoder (
SiglipVisionModel, tùy chọn) — Mô hình thị giác được huấn luyện trước cho IP Adapter. - feature_extractor (
SiglipImageProcessor, tùy chọn) — Bộ xử lý ảnh cho IP Adapter.
__call__
< source >( prompt: str | list[str] = Noneprompt_2: str | list[str] | None = Noneprompt_3: str | list[str] | None = Noneheight: int | None = Nonewidth: int | None = Nonenum_inference_steps: int = 28sigmas: list[float] | None = Noneguidance_scale: float = 7.0negative_prompt: str | list[str] | None = Nonenegative_prompt_2: str | list[str] | None = Nonenegative_prompt_3: str | list[str] | None = Nonenum_images_per_prompt: int | None = 1generator: typing.Union[torch.Generator, list[torch.Generator], NoneType] = Nonelatents: typing.Optional[torch.FloatTensor] = Noneprompt_embeds: typing.Optional[torch.FloatTensor] = Nonenegative_prompt_embeds: typing.Optional[torch.FloatTensor] = Nonepooled_prompt_embeds: typing.Optional[torch.FloatTensor] = Nonenegative_pooled_prompt_embeds: typing.Optional[torch.FloatTensor] = Noneip_adapter_image: typing.Union[PIL.Image.Image, numpy.ndarray, torch.Tensor, list[PIL.Image.Image], list[numpy.ndarray], list[torch.Tensor], NoneType] = Noneip_adapter_image_embeds: typing.Optional[torch.Tensor] = Noneoutput_type: str | None = 'pil'return_dict: bool = Truejoint_attention_kwargs: dict[str, typing.Any] | None = Noneclip_skip: int | None = Nonecallback_on_step_end: typing.Optional[typing.Callable[[int, int], NoneType]] = Nonecallback_on_step_end_tensor_inputs: list = ['latents']max_sequence_length: int = 256skip_guidance_layers: list = Noneskip_layer_guidance_scale: float = 2.8skip_layer_guidance_stop: float = 0.2skip_layer_guidance_start: float = 0.01mu: float | None = None ) → ~pipelines.stable_diffusion_3.StableDiffusion3PipelineOutput 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ế. - prompt_2 (
strhoặclist[str], tùy chọn) — Prompt hoặc các prompt sẽ được gửi đếntokenizer_2vàtext_encoder_2. Nếu không được định nghĩa,promptsẽ được sử dụng thay thế - prompt_3 (
strhoặclist[str], tùy chọn) — Prompt hoặc các prompt sẽ được gửi đếntokenizer_3vàtext_encoder_3. Nếu không được định nghĩa,promptsẽ được sử dụng thay thế - height (
int, tùy chọn, mặc định là self.unet.config.sample_size * self.vae_scale_factor) — Chiều cao của hình ảnh được tạo ra, tính bằng pixel. Giá trị mặc định là 1024 để đạt kết quả tốt nhất. - width (
int, tùy chọn, mặc định là self.unet.config.sample_size * self.vae_scale_factor) — Chiều rộng của hình ảnh được tạo ra, tính bằng pixel. Giá trị mặc định là 1024 để đạt kết quả tốt nhất. - num_inference_steps (
int, tùy chọn, mặc định là 50) — 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. - 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à 7.0) — 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. - 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). - negative_prompt_2 (
strhoặclist[str], tùy chọn) — Prompt hoặc các prompt không dùng để định hướng tạo ảnh, sẽ được gửi đếntokenizer_2vàtext_encoder_2. Nếu không được định nghĩa,negative_promptsẽ được sử dụng thay thế - negative_prompt_3 (
strhoặclist[str], tùy chọn) — Prompt hoặc các prompt không dùng để định hướng tạo ảnh, sẽ được gửi đếntokenizer_3vàtext_encoder_3. Nếu không được định nghĩa,negative_promptsẽ được sử dụng thay thế - 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. - 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.FloatTensor, 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.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àoprompt. - 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àonegative_prompt. - pooled_prompt_embeds (
torch.FloatTensor, 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àoprompt. - negative_pooled_prompt_embeds (
torch.FloatTensor, 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àonegative_prompt. - ip_adapter_image (
PipelineImageInput, tùy chọn) — Đầu vào hình ảnh tùy chọn để làm việc với IP Adapters. - ip_adapter_image_embeds (
torch.Tensor, tùy chọn) — Các embedding hình ảnh được tạo trước cho IP-Adapter. Phải là một tensor có hình dạng(batch_size, num_images, emb_dim). Nó phải chứa embedding hình ảnh âm nếudo_classifier_free_guidanceđược đặt thànhTrue. Nếu không được cung cấp, các embedding sẽ được tính toán từ đối số đầu vàoip_adapter_image. - 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_3.StableDiffusion3PipelineOutputthay vì một tuple thông thường hay không. - joint_attention_kwargs (
dict, tùy chọn) — Một từ điển kwargs, nếu được chỉ định, sẽ được truyền đếnAttentionProcessornhư đã định nghĩa dướiself.processortrong diffusers.models.attention_processor. - clip_skip (
int, tùy chọn) — Số lượng lớp được bỏ qua từ CLIP khi tính toán các embedding của prompt. Giá trị 1 có nghĩa là đầu ra của lớp trước lớp cuối sẽ được sử dụng để tính toán các embedding của prompt. - callback_on_step_end (
Callable, tùy chọn) — Một hàm được gọi vào cuối mỗi bước khử nhiễu trong quá trình suy luận. Hàm này được gọi với các đối số sau:callback_on_step_end(self: DiffusionPipeline, step: int, timestep: int, callback_kwargs: Dict).callback_kwargssẽ bao gồm danh sách tất cả các tensor như được chỉ định bởicallback_on_step_end_tensor_inputs. - callback_on_step_end_tensor_inputs (
list, optional) — Danh sách các tensor đầu vào cho hàmcallback_on_step_end. Các tensor được chỉ định trong danh sách sẽ được truyền dưới dạng tham sốcallback_kwargs. Bạn chỉ có thể bao gồm các biến được liệt kê trong thuộc tính._callback_tensor_inputscủa lớp pipeline của bạn. - max_sequence_length (
int, mặc định là 256) — Độ dài tối đa của chuỗi để sử dụng vớiprompt. - skip_guidance_layers (
list[int], tùy chọn) — Một danh sách các số nguyên chỉ định các lớp cần bỏ qua trong quá trình guidance. Nếu không được cung cấp, tất cả các lớp sẽ được sử dụng cho guidance. Nếu được cung cấp, guidance chỉ được áp dụng cho các lớp được chỉ định trong danh sách. Giá trị được khuyến nghị bởi StabiltyAI cho Stable Diffusion 3.5 Medium là [7, 8, 9]. - skip_layer_guidance_scale (
int, tùy chọn) — Thang độ của sự dẫn hướng cho các lớp được chỉ định trongskip_guidance_layers. Sự dẫn hướng sẽ được áp dụng cho các lớp được chỉ định trongskip_guidance_layersvới thang độ làskip_layer_guidance_scale. Sự dẫn hướng sẽ được áp dụng cho các lớp còn lại với thang độ là1. - skip_layer_guidance_stop (
int, tùy chọn) — Bước mà tại đó sự dẫn hướng cho các lớp được chỉ định trongskip_guidance_layerssẽ dừng lại. Sự dẫn hướng sẽ được áp dụng cho các lớp được chỉ định trongskip_guidance_layerscho đến phần tỷ lệ được chỉ định trongskip_layer_guidance_stop. Giá trị được khuyến nghị bởi StabiltyAI cho Stable Diffusion 3.5 Medium là 0.2. - skip_layer_guidance_start (
int, tuỳ chọn) — Bước mà sự dẫn dắt cho các lớp được chỉ định trongskip_guidance_layerssẽ bắt đầu. Sự dẫn dắt sẽ được áp dụng cho các lớp được chỉ định trongskip_guidance_layerstừ tỷ lệ được chỉ định trongskip_layer_guidance_start. Giá trị được khuyến nghị bởi StabiltyAI cho Stable Diffusion 3.5 Medium là 0.01. - mu (
float, tùy chọn) — giá trịmuđược sử dụng chodynamic_shifting.
Trả về
~pipelines.stable_diffusion_3.StableDiffusion3PipelineOutput hoặc tuple
~pipelines.stable_diffusion_3.StableDiffusion3PipelineOutput nếu return_dict là True, ngược lại là một tuple. Khi trả về tuple, phần tử đầu tiên là một danh sách chứa các hình ảnh đã tạo.
Hàm được gọi khi gọi pipeline cho việc sinh.
Ví dụ:
>>> import torch
>>> from diffusers import StableDiffusion3Pipeline
>>> pipe = StableDiffusion3Pipeline.from_pretrained(
... "stabilityai/stable-diffusion-3-medium-diffusers", torch_dtype=torch.float16
... )
>>> pipe.to("cuda")
>>> prompt = "A cat holding a sign that says hello world"
>>> image = pipe(prompt).images[0]
>>> image.save("sd3.png")encode_image
< source >( image: typing.Union[PIL.Image.Image, numpy.ndarray, torch.Tensor, list[PIL.Image.Image], list[numpy.ndarray], list[torch.Tensor]]device: device ) → torch.Tensor
Mã hóa hình ảnh đã cho thành biểu diễn đặc trưng bằng cách sử dụng bộ mã hóa hình ảnh được huấn luyện trước.
encode_prompt
< source >( prompt: str | list[str]prompt_2: str | list[str]prompt_3: str | list[str]device: typing.Optional[torch.device] = Nonenum_images_per_prompt: int = 1do_classifier_free_guidance: bool = Truenegative_prompt: str | list[str] | None = Nonenegative_prompt_2: str | list[str] | None = Nonenegative_prompt_3: str | list[str] | None = Noneprompt_embeds: typing.Optional[torch.FloatTensor] = Nonenegative_prompt_embeds: typing.Optional[torch.FloatTensor] = Nonepooled_prompt_embeds: typing.Optional[torch.FloatTensor] = Nonenegative_pooled_prompt_embeds: typing.Optional[torch.FloatTensor] = Noneclip_skip: int | None = Nonemax_sequence_length: int = 256lora_scale: float | None = None )
Tham số
- prompt (
strhoặclist[str], tùy chọn) — prompt cần được mã hóa - prompt_2 (
strhoặclist[str], tùy chọn) — Prompt hoặc các prompt sẽ được gửi đếntokenizer_2vàtext_encoder_2. Nếu không được định nghĩa,promptsẽ được sử dụng cho tất cả các text-encoder - prompt_3 (
strhoặclist[str], tùy chọn) — Prompt hoặc các prompt sẽ được gửi đếntokenizer_3vàtext_encoder_3. Nếu không được định nghĩa,promptsẽ được sử dụng trong tất cả các text-encoder - 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 (
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). - negative_prompt_2 (
strhoặclist[str], tùy chọn) — Prompt hoặc các prompt không dùng để định hướng tạo ảnh, sẽ được gửi đếntokenizer_2vàtext_encoder_2. Nếu không được định nghĩa,negative_promptsẽ được sử dụng cho tất cả các text-encoder. - negative_prompt_3 (
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, sẽ được gửi đếntokenizer_3vàtext_encoder_3. Nếu không được định nghĩa,negative_promptsẽ được sử dụng cho tất cả các text-encoder. - 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àoprompt. - 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àonegative_prompt. - pooled_prompt_embeds (
torch.FloatTensor, 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àoprompt. - negative_pooled_prompt_embeds (
torch.FloatTensor, 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àonegative_prompt. - clip_skip (
int, tùy chọn) — Số lượng lớp được bỏ qua từ CLIP khi tính toán các embedding của prompt. Giá trị 1 có nghĩa là đầu ra của lớp trước lớp cuối sẽ được sử dụng để tính toán các embedding của prompt. - lora_scale (
float, tùy chọn) — Hệ số lora sẽ được áp dụng cho tất cả các lớp LoRA của text encoder nếu các lớp LoRA được nạp.
prepare_ip_adapter_image_embeds
< source >( ip_adapter_image: typing.Union[PIL.Image.Image, numpy.ndarray, torch.Tensor, list[PIL.Image.Image], list[numpy.ndarray], list[torch.Tensor], NoneType] = Noneip_adapter_image_embeds: typing.Optional[torch.Tensor] = Nonedevice: typing.Optional[torch.device] = Nonenum_images_per_prompt: int = 1do_classifier_free_guidance: bool = True )
Tham số
- ip_adapter_image (
PipelineImageInput, tùy chọn) — Hình ảnh đầu vào để trích xuất đặc trưng cho IP-Adapter. - ip_adapter_image_embeds (
torch.Tensor, tùy chọn) — Các embedding hình ảnh đã được tính trước. - device — (
torch.device, tùy chọn): Thiết bị Torch. - num_images_per_prompt (
int, mặc định là 1) — Số lượng hình ảnh cần được tạo cho mỗi prompt. - do_classifier_free_guidance (
bool, mặc định là True) — Có sử dụng classifier free guidance hay không.
Chuẩn bị các vector nhúng hình ảnh để sử dụng trong IP-Adapter.
Phải truyền ip_adapter_image hoặc ip_adapter_image_embeds.