Diffusers documentation
Bộ tăng độ phân giải tiềm ẩn
Bộ tăng độ phân giải tiềm ẩn
Mô hình latent upscaler của Stable Diffusion được tạo ra bởi Katherine Crowson hợp tác với Stability AI. Nó được sử dụng để tăng độ phân giải của ảnh đầu ra lên gấp 2 (xem notebook demo này để xem minh họa về cài đặt gốc).
Hãy chắc chắn xem qua phần Mẹo của Stable Diffusion để tìm hiểu cách khám phá sự đánh đổi giữa tốc độ và chất lượng của scheduler, cũng như cách tái sử dụng các thành phần pipeline một cách hiệu quả!
Nếu bạn quan tâm đến việc sử dụng một trong các checkpoint chính thức cho một tác vụ, hãy khám phá các tổ chức CompVis và Stability AI trên Hub!
StableDiffusionLatentUpscalePipeline
lớp diffusers.StableDiffusionLatentUpscalePipeline
< source >( vae: AutoencoderKLtext_encoder: CLIPTextModeltokenizer: CLIPTokenizerunet: UNet2DConditionModelscheduler: EulerDiscreteScheduler )
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 (CLIPTextModel) — Bộ mã hóa văn bản đóng băng (clip-vit-large-patch14).
- tokenizer (CLIPTokenizer) —
Một
CLIPTokenizerđể tách token cho văn bản. - unet (UNet2DConditionModel) —
Một
UNet2DConditionModelđể khử nhiễu các latents ảnh đã mã hóa. - scheduler (SchedulerMixin) —
Một EulerDiscreteScheduler được sử dụng kết hợp với
unetđể khử nhiễu các latents của ảnh đã mã hóa.
Pipeline để tăng độ phân giải của ảnh đầu ra từ Stable Diffusion lên gấp 2 lần.
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 được triển khai cho tất cả các pipeline (tải xuống, 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:
- from_single_file() để tải các tệp
.ckpt
__call__
< source >( prompt: str | list[str] = Noneimage: typing.Union[PIL.Image.Image, numpy.ndarray, torch.Tensor, list[PIL.Image.Image], list[numpy.ndarray], list[torch.Tensor]] = Nonenum_inference_steps: int = 75guidance_scale: float = 9.0negative_prompt: str | list[str] | None = Nonegenerator: typing.Union[torch.Generator, list[torch.Generator], NoneType] = Nonelatents: typing.Optional[torch.Tensor] = Noneprompt_embeds: typing.Optional[torch.Tensor] = Nonenegative_prompt_embeds: typing.Optional[torch.Tensor] = Nonepooled_prompt_embeds: typing.Optional[torch.Tensor] = Nonenegative_pooled_prompt_embeds: 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 = 1 ) → StableDiffusionPipelineOutput or tuple
Tham số
- prompt (
strhoặclist[str]) — Prompt hoặc các prompt để hướng dẫn việc tăng độ phân giải ảnh. - image (
torch.Tensor,PIL.Image.Image,np.ndarray,list[torch.Tensor],list[PIL.Image.Image]hoặclist[np.ndarray]) —Imagehoặc tensor đại diện cho một lô ảnh cần được tăng độ phân giải. Nếu là tensor, nó có thể là đầu ra latent từ một mô hình Stable Diffusion hoặc một image tensor trong khoảng[-1, 1]. Nó được coi làlatentnếuimage.shape[1]là4; nếu không, nó được coi là một biểu diễn ảnh và được mã hóa bằng bộ mã hóavaecủa pipeline này. - 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. - guidance_scale (
float, tùy chọn, mặc định là 7.5) — Giá trị guidance scale cao hơn khuyến khích mô hình tạo ra các hình ảnh gắn kết chặt chẽ vớipromptvăn bản, với cái giá là chất lượng hình ảnh thấp hơn. Guidance scale được kích hoạt khiguidance_scale > 1. - negative_prompt (
strhoặclist[str], tùy chọn) — Prompt hoặc các prompt để hướng dẫn những gì không nên bao gồm trong quá trình tạo ảnh. Nếu không được định nghĩa, bạn cần truyềnnegative_prompt_embedsthay thế. Bỏ qua khi không sử dụng guidance (guidance_scale < 1). - generator (
torch.Generatorhoặclist[torch.Generator], tùy chọn) — Mộttorch.Generatorđể làm cho quá trình sinh ra kết quả xác đị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 (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. Có thể được sử dụng để dễ dàng điều chỉnh các đầu vào văn bản (trọng số prompt). Nếu không được cung cấp,negative_prompt_embedssẽ được tạo từ đối số đầu vàonegative_prompt. - pooled_prompt_embeds (
torch.Tensor, tùy chọn) — Các embedding văn bản đã được gộp sẵn. Có thể dùng để dễ dàng điều chỉnh đầu vào văn bản (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.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 (trọng số prompt). Nếu không được cung cấp, cácnegative_prompt_embedspooled sẽ được tạo từ đối số đầu vàonegative_prompt. - 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 ra. Chọn giữaPIL.Imagehoặcnp.array. - return_dict (
bool, tùy chọn, mặc định làTrue) — Có nên trả về một StableDiffusionPipelineOutput thay vì một tuple thông thường hay không. - callback (
Callable, tùy chọn) — Một hàm được gọi mỗicallback_stepsbước trong quá trình suy luận. Hàm này đượ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.
Trả về
StableDiffusionPipelineOutput hoặc tuple
Nếu return_dict là True, StableDiffusionPipelineOutput sẽ được trả về,
ngoài ra 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 gọi call của pipeline để tạo nội dung.
Ví dụ:
>>> from diffusers import StableDiffusionLatentUpscalePipeline, StableDiffusionPipeline
>>> import torch
>>> pipeline = StableDiffusionPipeline.from_pretrained(
... "CompVis/stable-diffusion-v1-4", torch_dtype=torch.float16
... )
>>> pipeline.to("cuda")
>>> model_id = "stabilityai/sd-x2-latent-upscaler"
>>> upscaler = StableDiffusionLatentUpscalePipeline.from_pretrained(model_id, torch_dtype=torch.float16)
>>> upscaler.to("cuda")
>>> prompt = "a photo of an astronaut high resolution, unreal engine, ultra realistic"
>>> generator = torch.manual_seed(33)
>>> low_res_latents = pipeline(prompt, generator=generator, output_type="latent").images
>>> with torch.no_grad():
... image = pipeline.decode_latents(low_res_latents)
>>> image = pipeline.numpy_to_pil(image)[0]
>>> image.save("../images/a1.png")
>>> upscaled_image = upscaler(
... prompt=prompt,
... image=low_res_latents,
... num_inference_steps=20,
... guidance_scale=0,
... generator=generator,
... ).images[0]
>>> upscaled_image.save("../images/a2.png")enable_sequential_cpu_offload
< source >( gpu_id: int | None = Nonedevice: typing.Union[torch.device, str] = None )
Tham số
- gpu_id (
int, tùy chọn) — ID của bộ tăng tốc sẽ được sử dụng trong suy luận. Nếu không được chỉ định, giá trị mặc định sẽ là 0. - device (
torch.Devicehoặcstr, tuỳ chọn, mặc định là None) — Loại thiết bị PyTorch của bộ tăng tốc sẽ được sử dụng trong suy luận. Nếu không được chỉ định, hệ thống sẽ tự động phát hiện và sử dụng bộ tăng tốc khả dụng.
Tải xuống tất cả các mô hình xuống CPU bằng 🤗 Accelerate, giảm đáng kể lượng bộ nhớ sử dụng. Khi được gọi, các state dict của tất cả các thành phần torch.nn.Module (trừ những thành phần nằm trong self._exclude_from_cpu_offload) sẽ được lưu xuống CPU, sau đó được chuyển sang torch.device('meta') và chỉ được tải lên accelerator khi phương thức forward của submodule cụ thể đó được gọi. Việc offload diễn ra theo từng submodule. Tiết kiệm bộ nhớ cao hơn so với enable_model_cpu_offload, nhưng hiệu suất thấp hơn.
enable_attention_slicing
< source >( slice_size: str | int = 'auto' )
Tham số
- slice_size (
strhoặcint, tùy chọn, mặc định là"auto") — Khi là"auto", đầu vào cho các attention heads sẽ được chia đôi, do đó attention sẽ được tính trong hai bước. Nếu là"max", lượng bộ nhớ được tiết kiệm tối đa bằng cách chỉ chạy một slice tại một thời điểm. Nếu cung cấp một số, số lượng slice sẽ bằngattention_head_dim // slice_size. Trong trường hợp này,attention_head_dimphải là bội số củaslice_size.
Bật tính toán chú ý dạng lát cắt. Khi tùy chọn này được bật, module chú ý sẽ chia tensor đầu vào thành các lát cắt để tính toán chú ý qua nhiều bước. Với nhiều hơn một đầu chú ý, phép tính được thực hiện tuần tự trên từng đầu. Điều này hữu ích để tiết kiệm một phần bộ nhớ, đổi lại là sự giảm tốc độ nhỏ.
> ⚠️ Không bật attention slicing nếu bạn đã đang sử dụng
scaled_dot_product_attention(SDPA) từ PyTorch > 2.0 hoặc xFormers. Các phép tính attention này đã rất hiệu quả về bộ nhớ nên bạn sẽ không cần bật > chức năng này. Nếu bật attention slicing cùng với SDPA hoặc xFormers, nó có thể gây ra sự giảm tốc độ nghiêm trọng!
Ví dụ:
>>> import torch
>>> from diffusers import StableDiffusionPipeline
>>> pipe = StableDiffusionPipeline.from_pretrained(
... "stable-diffusion-v1-5/stable-diffusion-v1-5",
... dtype=torch.float16,
... use_safetensors=True,
... )
>>> prompt = "a photo of an astronaut riding a horse on mars"
>>> pipe.enable_attention_slicing()
>>> image = pipe(prompt).images[0]Tắt tính toán chú ý dạng lát cắt. Nếu enable_attention_slicing đã được gọi trước đó, chú ý sẽ được tính toán trong một bước duy nhất.
enable_xformers_memory_efficient_attention
< source >( attention_op: typing.Optional[typing.Callable] = None )
Tham số
- attention_op (
Callable, tùy chọn) — Ghi đè toán tử mặc địnhNoneđể sử dụng làm đối sốopcho hàmmemory_efficient_attention()của xFormers.
Bật chú ý tiết kiệm bộ nhớ từ xFormers. Khi tùy chọn này được bật, bạn nên quan sát thấy mức sử dụng bộ nhớ GPU thấp hơn và có thể tăng tốc trong quá trình suy luận. Việc tăng tốc trong quá trình huấn luyện không được đảm bảo.
> ⚠️ Khi cả memory efficient attention và sliced attention đều được bật, memory efficient attention sẽ có > ưu tiên.
Ví dụ:
>>> import torch
>>> from diffusers import DiffusionPipeline
>>> from xformers.ops import MemoryEfficientAttentionFlashAttentionOp
>>> pipe = DiffusionPipeline.from_pretrained("stabilityai/stable-diffusion-2-1", dtype=torch.float16)
>>> pipe = pipe.to("cuda")
>>> pipe.enable_xformers_memory_efficient_attention(attention_op=MemoryEfficientAttentionFlashAttentionOp)
>>> # Workaround for not accepting attention shape using VAE for Flash Attention
>>> pipe.vae.enable_xformers_memory_efficient_attention(attention_op=None)Tắt chú ý tiết kiệm bộ nhớ từ xFormers.
encode_prompt
< source >( promptdevicedo_classifier_free_guidancenegative_prompt = Noneprompt_embeds: typing.Optional[torch.Tensor] = Nonenegative_prompt_embeds: typing.Optional[torch.Tensor] = Nonepooled_prompt_embeds: typing.Optional[torch.Tensor] = Nonenegative_pooled_prompt_embeds: typing.Optional[torch.Tensor] = None )
Tham số
- prompt (
strhoặclist(int)) — prompt cần được mã hóa - device — (
torch.device): thiết bị torch - do_classifier_free_guidance (
bool) — có sử dụng classifier free guidance hay không - negative_prompt (
strhoặclist[str]) — Prompt hoặc các prompt không dùng để định hướng việc tạo ảnh. Bỏ qua khi không sử dụng guidance (tức là bị bỏ qua nếuguidance_scalenhỏ hơn1). - 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.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àoprompt. - 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àonegative_prompt.
Mã hóa prompt thành các trạng thái ẩn của text encoder.
StableDiffusionPipelineOutput
lớp diffusers.pipelines.stable_diffusion.StableDiffusionPipelineOutput
< source >( images: list[PIL.Image.Image] | numpy.ndarraynsfw_content_detected: list[bool] | None )
Tham số
- images (
list[PIL.Image.Image]hoặcnp.ndarray) — danh sách các hình ảnh PIL đã khử nhiễu có độ dàibatch_sizehoặc mảng NumPy có hình dạng(batch_size, height, width, num_channels). - nsfw_content_detected (
list[bool]) — danh sách cho biết hình ảnh tương ứng có chứa nội dung “không an toàn” (nsfw) hay không, hoặcNonenếu không thể thực hiện kiểm tra an toàn.
Lớp đầu ra cho các pipeline Stable Diffusion.