# Stable Cascade

Mô hình này được xây dựng dựa trên kiến trúc [Würstchen](https://openreview.net/forum?id=gU58d5QeGv) và điểm khác biệt chính so với các mô hình khác như Stable Diffusion là nó hoạt động trong không gian ẩn (latent space) nhỏ hơn nhiều. Tại sao điều này lại quan trọng? Không gian ẩn càng nhỏ, quá trình suy luận (inference) càng **nhanh** và chi phí huấn luyện càng **thấp**. Không gian ẩn nhỏ đến mức nào? Stable Diffusion sử dụng hệ số nén là 8, khiến một hình ảnh 1024x1024 được mã hóa thành 128x128. Stable Cascade đạt được hệ số nén là 42, nghĩa là có thể mã hóa một hình ảnh 1024x1024 thành 24x24, trong khi vẫn duy trì khả năng tái tạo sắc nét. Mô hình điều kiện văn bản sau đó được huấn luyện trong không gian ẩn nén cao này. Các phiên bản trước của kiến trúc này đã đạt được mức giảm chi phí 16 lần so với Stable Diffusion 1.5.

Do đó, loại mô hình này rất phù hợp cho các trường hợp sử dụng mà hiệu quả là yếu tố quan trọng. Hơn nữa, tất cả các phần mở rộng đã biết như finetuning, LoRA, ControlNet, IP-Adapter, LCM v.v. đều có thể được thực hiện với phương pháp này.

Mã nguồn gốc có thể được tìm thấy tại [Stability-AI/StableCascade](https://github.com/Stability-AI/StableCascade).

## Tổng quan về Mô hình
Stable Cascade bao gồm ba mô hình: Stage A, Stage B và Stage C, đại diện cho một chuỗi liên tiếp để tạo hình ảnh, do đó có tên là "Stable Cascade".

Stage A & B được sử dụng để nén hình ảnh, tương tự như vai trò của VAE trong Stable Diffusion. Tuy nhiên, với cấu hình này, mức độ nén hình ảnh cao hơn nhiều có thể đạt được. Trong khi các mô hình Stable Diffusion sử dụng hệ số nén không gian là 8, mã hóa một hình ảnh có độ phân giải 1024 x 1024 thành 128 x 128, Stable Cascade đạt được hệ số nén là 42. Điều này mã hóa một hình ảnh 1024 x 1024 thành 24 x 24, trong khi vẫn có thể giải mã hình ảnh một cách chính xác. Điều này mang lại lợi ích lớn là chi phí huấn luyện và suy luận thấp hơn. Hơn nữa, Stage C chịu trách nhiệm tạo ra các latents nhỏ 24 x 24 dựa trên một prompt văn bản.

Mô hình Stage C hoạt động trên các latents nhỏ 24 x 24 và khử nhiễu các latents dựa trên các prompt văn bản. Mô hình này cũng là thành phần lớn nhất trong pipeline Cascade và được thiết kế để sử dụng cùng với `StableCascadePriorPipeline`

Các mô hình Stage B và Stage A được sử dụng cùng với `StableCascadeDecoderPipeline` và chịu trách nhiệm tạo ra hình ảnh cuối cùng dựa trên các latents nhỏ 24 x 24.

> [!WARNING]
> Có một số hạn chế về các kiểu dữ liệu có thể được sử dụng với các mô hình Stable Cascade. Các checkpoint chính thức của `StableCascadePriorPipeline` không hỗ trợ kiểu dữ liệu `torch.float16`. Vui lòng sử dụng `torch.bfloat16` thay thế.
>
> Để sử dụng kiểu dữ liệu `torch.bfloat16` với `StableCascadeDecoderPipeline`, bạn cần cài đặt PyTorch 2.2.0 hoặc cao hơn. Điều này cũng có nghĩa là việc sử dụng `StableCascadeCombinedPipeline` với `torch.bfloat16` yêu cầu PyTorch 2.2.0 hoặc cao hơn, vì nó gọi `StableCascadeDecoderPipeline` bên trong.
>
> Nếu không thể cài đặt PyTorch 2.2.0 hoặc cao hơn trong môi trường của bạn, `StableCascadeDecoderPipeline` có thể được sử dụng độc lập với kiểu dữ liệu `torch.float16`. Bạn có thể tải xuống trọng số phiên bản độ chính xác đầy đủ hoặc `bf16` cho pipeline và chuyển đổi trọng số sang `torch.float16`.

## Ví dụ sử dụng

```python
import torch
from diffusers import StableCascadeDecoderPipeline, StableCascadePriorPipeline

prompt = "an image of a shiba inu, donning a spacesuit and helmet"
negative_prompt = ""

prior = StableCascadePriorPipeline.from_pretrained("stabilityai/stable-cascade-prior", variant="bf16", dtype=torch.bfloat16)
decoder = StableCascadeDecoderPipeline.from_pretrained("stabilityai/stable-cascade", variant="bf16", dtype=torch.float16)

prior.enable_model_cpu_offload()
prior_output = prior(
    prompt=prompt,
    height=1024,
    width=1024,
    negative_prompt=negative_prompt,
    guidance_scale=4.0,
    num_images_per_prompt=1,
    num_inference_steps=20
)

decoder.enable_model_cpu_offload()
decoder_output = decoder(
    image_embeddings=prior_output.image_embeddings.to(torch.float16),
    prompt=prompt,
    negative_prompt=negative_prompt,
    guidance_scale=0.0,
    output_type="pil",
    num_inference_steps=10
).images[0]
decoder_output.save("cascade.png")
```

## Sử dụng các phiên bản Lite của mô hình Stage B và Stage C

```python
import torch
from diffusers import (
    StableCascadeDecoderPipeline,
    StableCascadePriorPipeline,
    StableCascadeUNet,
)

prompt = "an image of a shiba inu, donning a spacesuit and helmet"
negative_prompt = ""

prior_unet = StableCascadeUNet.from_pretrained("stabilityai/stable-cascade-prior", subfolder="prior_lite")
decoder_unet = StableCascadeUNet.from_pretrained("stabilityai/stable-cascade", subfolder="decoder_lite")

prior = StableCascadePriorPipeline.from_pretrained("stabilityai/stable-cascade-prior", prior=prior_unet)
decoder = StableCascadeDecoderPipeline.from_pretrained("stabilityai/stable-cascade", decoder=decoder_unet)

prior.enable_model_cpu_offload()
prior_output = prior(
    prompt=prompt,
    height=1024,
    width=1024,
    negative_prompt=negative_prompt,
    guidance_scale=4.0,
    num_images_per_prompt=1,
    num_inference_steps=20
)

decoder.enable_model_cpu_offload()
decoder_output = decoder(
    image_embeddings=prior_output.image_embeddings,
    prompt=prompt,
    negative_prompt=negative_prompt,
    guidance_scale=0.0,
    output_type="pil",
    num_inference_steps=10
).images[0]
decoder_output.save("cascade.png")
```

## Tải checkpoint gốc bằng `from_single_file`

Việc nạp checkpoint ở định dạng gốc được hỗ trợ thông qua phương thức `from_single_file` trong StableCascadeUNet.

```python
import torch
from diffusers import (
    StableCascadeDecoderPipeline,
    StableCascadePriorPipeline,
    StableCascadeUNet,
)

prompt = "an image of a shiba inu, donning a spacesuit and helmet"
negative_prompt = ""

prior_unet = StableCascadeUNet.from_single_file(
    "https://huggingface.co/stabilityai/stable-cascade/resolve/main/stage_c_bf16.safetensors",
    dtype=torch.bfloat16
)
decoder_unet = StableCascadeUNet.from_single_file(
    "https://huggingface.co/stabilityai/stable-cascade/blob/main/stage_b_bf16.safetensors",
    dtype=torch.bfloat16
)

prior = StableCascadePriorPipeline.from_pretrained("stabilityai/stable-cascade-prior", prior=prior_unet, dtype=torch.bfloat16)
decoder = StableCascadeDecoderPipeline.from_pretrained("stabilityai/stable-cascade", decoder=decoder_unet, dtype=torch.bfloat16)

prior.enable_model_cpu_offload()
prior_output = prior(
    prompt=prompt,
    height=1024,
    width=1024,
    negative_prompt=negative_prompt,
    guidance_scale=4.0,
    num_images_per_prompt=1,
    num_inference_steps=20
)

decoder.enable_model_cpu_offload()
decoder_output = decoder(
    image_embeddings=prior_output.image_embeddings,
    prompt=prompt,
    negative_prompt=negative_prompt,
    guidance_scale=0.0,
    output_type="pil",
    num_inference_steps=10
).images[0]
decoder_output.save("cascade-single-file.png")
```

## Cách sử dụng

### Sử dụng trực tiếp

Mô hình hiện được thiết kế cho mục đích nghiên cứu. Các lĩnh vực và tác vụ nghiên cứu có thể bao gồm

- Nghiên cứu về các mô hình sinh.
- Triển khai an toàn các mô hình có khả năng tạo ra nội dung gây hại.
- Khảo sát và hiểu rõ các hạn chế và thiên kiến của các mô hình sinh.
- Tạo tác phẩm nghệ thuật và sử dụng trong thiết kế cũng như các quy trình nghệ thuật khác.
- Ứng dụng trong các công cụ giáo dục hoặc sáng tạo.

Các trường hợp bị loại trừ được mô tả bên dưới.

### Sử dụng ngoài phạm vi

Mô hình không được huấn luyện để tạo ra các nội dung mang tính sự thật hoặc phản ánh chính xác về con người hay sự kiện, do đó việc sử dụng mô hình để tạo ra các nội dung như vậy nằm ngoài phạm vi khả năng của mô hình này. Mô hình không được sử dụng theo bất kỳ cách nào vi phạm [Chính sách Sử dụng Được Chấp nhận](https://stability.ai/use-policy) của Stability AI.

## Hạn chế và Thiên kiến

### Hạn chế
- Khuôn mặt và con người nói chung có thể không được tạo ra một cách chính xác.
- Phần tự mã hóa của mô hình là có tổn hao.

## StableCascadeCombinedPipeline[[diffusers.StableCascadeCombinedPipeline]]

#### diffusers.StableCascadeCombinedPipeline[[diffusers.StableCascadeCombinedPipeline]]

```python
diffusers.StableCascadeCombinedPipeline(tokenizer: CLIPTokenizer, text_encoder: CLIPTextModelWithProjection, decoder: StableCascadeUNet, scheduler: DDPMWuerstchenScheduler, vqgan: PaellaVQModel, prior_prior: StableCascadeUNet, prior_text_encoder: CLIPTextModelWithProjection, prior_tokenizer: CLIPTokenizer, prior_scheduler: DDPMWuerstchenScheduler, prior_feature_extractor: transformers.models.clip.image_processing_pil_clip.CLIPImageProcessorPil | None = None, prior_image_encoder: transformers.models.clip.modeling_clip.CLIPVisionModelWithProjection | None = None)
```

[Nguồn](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/stable_cascade/pipeline_stable_cascade_combined.py#L46)

**Tham số:**

tokenizer (`CLIPTokenizer`) : Tokenizer giải mã được sử dụng cho các đầu vào văn bản.

text_encoder (`CLIPTextModelWithProjection`) : Bộ mã hóa văn bản giải mã được sử dụng cho các đầu vào văn bản.

decoder (`StableCascadeUNet`) : Mô hình decoder được sử dụng cho pipeline tạo ảnh decoder.

scheduler (`DDPMWuerstchenScheduler`) : Trình lập lịch được sử dụng cho pipeline tạo ảnh giải mã.

vqgan (`PaellaVQModel`) : Mô hình VQGAN được sử dụng cho pipeline tạo ảnh bằng decoder.

prior_prior (`StableCascadeUNet`) : Mô hình prior được sử dụng cho prior pipeline.

prior_text_encoder (`CLIPTextModelWithProjection`) : Bộ mã hóa văn bản trước được sử dụng cho các đầu vào văn bản.

prior_tokenizer (`CLIPTokenizer`) : Tokenizer trước đó được sử dụng cho các đầu vào văn bản.

prior_scheduler (`DDPMWuerstchenScheduler`) : Trình lập lịch được sử dụng cho pipeline trước.

prior_feature_extractor ([CLIPImageProcessor](https://huggingface.co/docs/transformers/main/en/model_doc/clip#transformers.CLIPImageProcessor)) : Mô hình trích xuất đặc trưng từ các hình ảnh được tạo ra để sử dụng làm đầu vào cho `image_encoder`.

prior_image_encoder (`CLIPVisionModelWithProjection`) : Bộ mã hóa ảnh CLIP đóng băng ([clip-vit-large-patch14](https://huggingface.co/openai/clip-vit-large-patch14)).

Pipeline kết hợp cho việc tạo ảnh từ văn bản sử dụng Stable Cascade.

Mô hình này kế thừa từ [DiffusionPipeline](/docs/diffusers/main/vi/api/pipelines/overview#diffusers.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__[[diffusers.StableCascadeCombinedPipeline.__call__]]

```python
__call__(prompt: str | list[str] | None = None, images: typing.Union[torch.Tensor, list[torch.Tensor], PIL.Image.Image, list[PIL.Image.Image]] = None, height: int = 512, width: int = 512, prior_num_inference_steps: int = 60, prior_guidance_scale: float = 4.0, num_inference_steps: int = 12, decoder_guidance_scale: float = 0.0, negative_prompt: str | list[str] | None = None, prompt_embeds: typing.Optional[torch.Tensor] = None, prompt_embeds_pooled: typing.Optional[torch.Tensor] = None, negative_prompt_embeds: typing.Optional[torch.Tensor] = None, negative_prompt_embeds_pooled: typing.Optional[torch.Tensor] = None, num_images_per_prompt: int = 1, generator: typing.Union[torch.Generator, list[torch.Generator], NoneType] = None, latents: typing.Optional[torch.Tensor] = None, output_type: str | None = 'pil', return_dict: bool = True, prior_callback_on_step_end: typing.Optional[typing.Callable[[int, int], NoneType]] = None, prior_callback_on_step_end_tensor_inputs: list = ['latents'], callback_on_step_end: typing.Optional[typing.Callable[[int, int], NoneType]] = None, callback_on_step_end_tensor_inputs: list = ['latents'])
```

[Nguồn](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/stable_cascade/pipeline_stable_cascade_combined.py#L159)

**Tham số:**

prompt (`str` hoặc `list[str]`) : Prompt hoặc các prompt để hướng dẫn tạo ảnh cho prior và decoder.

images (`torch.Tensor`, `PIL.Image.Image`, `list[torch.Tensor]`, `list[PIL.Image.Image]`, *tùy chọn*) : Các hình ảnh để hướng dẫn việc tạo hình ảnh cho prior.

negative_prompt (`str` hoặc `list[str]`, *tùy chọn*) : Prompt hoặc các prompt không được dùng để hướng dẫn việc tạo ảnh. 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.Tensor`, *tùy chọn*) : Các vector nhúng văn bản đã được tạo sẵn cho prior. Có thể được sử dụng để dễ dàng điều chỉnh các đầu vào văn bản, *vd.* trọng số prompt. Nếu không được cung cấp, các vector nhúng văn bản sẽ được tạo từ đối số đầu vào `prompt`.

prompt_embeds_pooled (`torch.Tensor`, *tùy chọn*) : Các vector nhúng văn bản đã được tạo sẵn cho prior. Có thể được sử dụng để dễ dàng điều chỉnh các đầu vào văn bản, *vd.* trọng số prompt. Nếu không được cung cấp, các vector nhúng văn bản sẽ được tạo từ đối số đầu vào `prompt`.

negative_prompt_embeds (`torch.Tensor`, *tùy chọn*) : Các vector nhúng văn bản âm đã được tạo trước cho prior. Có thể được sử dụng để dễ dàng điều chỉnh các đầu vào văn bản, *ví dụ* như 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_prompt_embeds_pooled (`torch.Tensor`, *tùy chọn*) : Các vector nhúng văn bản âm đã được tạo trước cho prior. Có thể được sử dụng để dễ dàng điều chỉnh các đầu vào văn bản, *ví dụ* như 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`.

num_images_per_prompt (`int`, *tuỳ chọn*, mặc định là 1) : Số lượng hình ảnh cần tạo cho mỗi prompt.

height (`int`, *tuỳ chọn*, mặc định là 512) : Chiều cao của hình ảnh được tạo ra, tính bằng pixel.

width (`int`, *tuỳ chọn*, mặc định là 512) : Độ rộng của hình ảnh được tạo ra, tính bằng pixel.

prior_guidance_scale (`float`, *optional*, mặc định là 4.0) : Thang độ dẫn hướng như được định nghĩa trong [Classifier-Free Diffusion Guidance](https://huggingface.co/papers/2207.12598). `prior_guidance_scale` được định nghĩa là `w` của phương trình 2. trong [Imagen Paper](https://huggingface.co/papers/2205.11487). Thang độ dẫn hướng được kích hoạt bằng cách đặt `prior_guidance_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ới `prompt` văn bản, thường phải đánh đổi bằng chất lượng hình ảnh thấp hơn.

prior_num_inference_steps (`int | dict[float, int]`, *tùy chọn*, mặc định là 60) : Số bước khử nhiễu trước đó. Nhiều bước khử nhiễu hơn thường dẫn đến hình ảnh có chất lượng cao hơn, đổi lại là suy luận chậm hơn. Để có khoảng cách bước thời gian cụ thể hơn, bạn có thể truyền `prior_timesteps` tùy chỉnh

num_inference_steps (`int`, *optional*, mặc định là 12) : Số bước khử nhiễu của bộ giải mã. Nhiều bước khử nhiễu hơn thường dẫn đến hình ảnh có chất lượng cao hơn, đổi lại là suy luận chậm hơn. Để có khoảng cách bước thời gian cụ thể hơn, bạn có thể truyền `timesteps` tùy chỉnh

decoder_guidance_scale (`float`, *optional*, mặc định là 0.0) : Thang độ dẫn hướng như được định nghĩa trong [Classifier-Free Diffusion Guidance](https://huggingface.co/papers/2207.12598). `guidance_scale` được định nghĩa là `w` của phương trình 2. trong [Imagen Paper](https://huggingface.co/papers/2205.11487). Thang độ dẫn hướng được kích hoạt bằng cách đặt `guidance_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ới `prompt` văn bản, thường phải đánh đổi bằng chất lượng hình ảnh thấp hơn.

generator (`torch.Generator` hoặc `list[torch.Generator]`, *tùy chọn*) : Một hoặc một danh sách [torch generator](https://pytorch.org/docs/stable/generated/torch.Generator.html) để đả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, đượ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ể được sử 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 ra bằng cách lấy mẫu sử dụng `generator` ngẫu nhiên được cung cấp.

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 một trong các tùy chọn: `"pil"` (`PIL.Image.Image`), `"np"` (`np.array`) hoặc `"pt"` (`torch.Tensor`).

return_dict (`bool`, *tùy chọn*, mặc định là `True`) : Có nên trả về một [ImagePipelineOutput](/docs/diffusers/main/vi/api/pipelines/consistency_models#diffusers.ImagePipelineOutput) thay vì một tuple thông thường hay không.

prior_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: `prior_callback_on_step_end(self: DiffusionPipeline, step: int, timestep: int, callback_kwargs: Dict)`.

prior_callback_on_step_end_tensor_inputs (`list`, *optional*) : Danh sách các đầu vào tensor cho hàm `prior_callback_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_inputs` của lớp pipeline của bạn.

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_kwargs` sẽ bao gồm một danh sách tất cả các tensor như được chỉ định bởi `callback_on_step_end_tensor_inputs`.

callback_on_step_end_tensor_inputs (`list`, *optional*) : Danh sách các đầu vào tensor cho hàm `callback_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_inputs` của lớp pipeline của bạn.

**Trả về:**

[ImagePipelineOutput](/docs/diffusers/main/vi/api/pipelines/consistency_models#diffusers.ImagePipelineOutput) hoặc `tuple` [ImagePipelineOutput](/docs/diffusers/main/vi/api/pipelines/consistency_models#diffusers.ImagePipelineOutput) nếu `return_dict` là True, ngược lại là một `tuple`. Khi trả về một 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ụ:
```py
>>> import torch
>>> from diffusers import StableCascadeCombinedPipeline

>>> pipe = StableCascadeCombinedPipeline.from_pretrained(
...     "stabilityai/stable-cascade", variant="bf16", torch_dtype=torch.bfloat16
... )
>>> pipe.enable_model_cpu_offload()
>>> prompt = "an image of a shiba inu, donning a spacesuit and helmet"
>>> images = pipe(prompt=prompt)
```

#### enable_model_cpu_offload[[diffusers.StableCascadeCombinedPipeline.enable_model_cpu_offload]]

```python
enable_model_cpu_offload(gpu_id: int | None = None, device: typing.Union[torch.device, str] = None)
```

[Nguồn](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/stable_cascade/pipeline_stable_cascade_combined.py#L131)

Tải tất cả các mô hình xuống CPU bằng accelerate, giảm mức sử dụng bộ nhớ với tác động thấp đến hiệu suất. So với `enable_sequential_cpu_offload`, phương pháp này di chuyển toàn bộ một mô hình lên GPU mỗi khi phương thức `forward` của nó được gọi, và mô hình sẽ ở lại trên GPU cho đến khi mô hình tiếp theo chạy. Mức tiết kiệm bộ nhớ thấp hơn so với `enable_sequential_cpu_offload`, nhưng hiệu suất tốt hơn nhiều nhờ việc thực hiện lặp lại của `unet`.

#### enable_sequential_cpu_offload[[diffusers.StableCascadeCombinedPipeline.enable_sequential_cpu_offload]]

```python
enable_sequential_cpu_offload(gpu_id: int | None = None, device: typing.Union[torch.device, str] = None)
```

[Nguồn](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/stable_cascade/pipeline_stable_cascade_combined.py#L141)

Tải xuống tất cả các mô hình (state dicts của `unet`, `text_encoder`, `vae` và `safety checker`) xuống CPU bằng 🤗 Accelerate, giảm đáng kể lượng bộ nhớ sử dụng. Các mô hình được chuyển đến `torch.device('meta')` và chỉ được nạp lên GPU khi phương thức `forward` của submodule cụ thể của chúng đượ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 việc sử dụng `enable_model_cpu_offload`, nhưng hiệu suất thấp hơn.

## StableCascadePriorPipeline[[diffusers.StableCascadePriorPipeline]]

#### diffusers.StableCascadePriorPipeline[[diffusers.StableCascadePriorPipeline]]

```python
diffusers.StableCascadePriorPipeline(tokenizer: CLIPTokenizer, text_encoder: CLIPTextModelWithProjection, prior: StableCascadeUNet, scheduler: DDPMWuerstchenScheduler, resolution_multiple: float = 42.67, feature_extractor: transformers.models.clip.image_processing_pil_clip.CLIPImageProcessorPil | None = None, image_encoder: transformers.models.clip.modeling_clip.CLIPVisionModelWithProjection | None = None)
```

[Nguồn](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/stable_cascade/pipeline_stable_cascade_prior.py#L80)

**Tham số:**

prior (`StableCascadeUNet`) : Stable Cascade prior để xấp xỉ embedding ảnh từ embedding văn bản và/hoặc embedding ảnh.

text_encoder (`CLIPTextModelWithProjection`) : Bộ mã hóa văn bản đóng băng ([laion/CLIP-ViT-bigG-14-laion2B-39B-b160k](https://huggingface.co/laion/CLIP-ViT-bigG-14-laion2B-39B-b160k)).

feature_extractor ([CLIPImageProcessor](https://huggingface.co/docs/transformers/main/en/model_doc/clip#transformers.CLIPImageProcessor)) : Mô hình trích xuất đặc trưng từ các hình ảnh được tạo ra để sử dụng làm đầu vào cho `image_encoder`.

image_encoder (`CLIPVisionModelWithProjection`) : Bộ mã hóa ảnh CLIP đóng băng ([clip-vit-large-patch14](https://huggingface.co/openai/clip-vit-large-patch14)).

tokenizer (`CLIPTokenizer`) : Tokenizer của lớp [CLIPTokenizer](https://huggingface.co/docs/transformers/v4.21.0/en/model_doc/clip#transformers.CLIPTokenizer).

scheduler (`DDPMWuerstchenScheduler`) : Một trình lập lịch được sử dụng kết hợp với `prior` để tạo nhúng hình ảnh.

resolution_multiple ('float', *tùy chọn*, mặc định là 42.67) : Độ phân giải mặc định cho nhiều hình ảnh được tạo ra.

Pipeline để tạo prior cho ảnh trong Stable Cascade.

Mô hình này kế thừa từ [DiffusionPipeline](/docs/diffusers/main/vi/api/pipelines/overview#diffusers.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__[[diffusers.StableCascadePriorPipeline.__call__]]

```python
__call__(prompt: str | list[str] | None = None, images: typing.Union[torch.Tensor, list[torch.Tensor], PIL.Image.Image, list[PIL.Image.Image]] = None, height: int = 1024, width: int = 1024, num_inference_steps: int = 20, timesteps: list = None, guidance_scale: float = 4.0, negative_prompt: str | list[str] | None = None, prompt_embeds: typing.Optional[torch.Tensor] = None, prompt_embeds_pooled: typing.Optional[torch.Tensor] = None, negative_prompt_embeds: typing.Optional[torch.Tensor] = None, negative_prompt_embeds_pooled: typing.Optional[torch.Tensor] = None, image_embeds: typing.Optional[torch.Tensor] = None, num_images_per_prompt: int | None = 1, generator: typing.Union[torch.Generator, list[torch.Generator], NoneType] = None, latents: typing.Optional[torch.Tensor] = None, output_type: str | None = 'pt', return_dict: bool = True, callback_on_step_end: typing.Optional[typing.Callable[[int, int], NoneType]] = None, callback_on_step_end_tensor_inputs: list = ['latents'])
```

[Nguồn](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/stable_cascade/pipeline_stable_cascade_prior.py#L375)

**Tham số:**

prompt (`str` hoặc `list[str]`) : Prompt hoặc các prompt để hướng dẫn việc tạo ảnh.

images (`torch.Tensor`, `PIL.Image.Image`, `list[torch.Tensor]` hoặc `list[PIL.Image.Image]`, *tuỳ chọn*) : Hình ảnh tham chiếu được sử dụng để điều kiện cho quá trình sinh trước. Khi được cung cấp, các embedding hình ảnh sẽ được suy ra từ hình ảnh và kết hợp với prompt văn bản.

height (`int`, *tuỳ chọn*, mặc định là 1024) : Chiều cao của hình ảnh được tạo ra, tính bằng pixel.

width (`int`, *tuỳ chọn*, mặc định là 1024) : Độ rộng của hình ảnh được tạo ra, tính bằng pixel.

num_inference_steps (`int`, *tuỳ chọn*, mặc định là 60) : 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, đổi lại là suy luận chậm hơn.

timesteps (`list[float]`, *optional*) : Các bước thời gian (timesteps) tùy chỉnh để sử dụng cho quá trình khử nhiễu với các trình lập lịch (scheduler) hỗ trợ tham số `timesteps` trong phương thức `set_timesteps` của chúng. Nếu không được định nghĩa, hành vi mặc định khi `num_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.

guidance_scale (`float`, *optional*, mặc định là 8.0) : Thang độ dẫn hướng như được định nghĩa trong [Classifier-Free Diffusion Guidance](https://huggingface.co/papers/2207.12598). `decoder_guidance_scale` được định nghĩa là `w` của phương trình 2. trong [Imagen Paper](https://huggingface.co/papers/2205.11487). Thang độ dẫn hướng được kích hoạt bằng cách đặt `decoder_guidance_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ới `prompt` văn bản, thường phải đánh đổi bằng chất lượng hình ảnh thấp hơn.

negative_prompt (`str` hoặc `list[str]`, *tùy chọn*) : Prompt hoặc các prompt không được dùng để hướng dẫn việc tạo ảnh. Bỏ qua khi không sử dụng guidance (tức là bị bỏ qua nếu `decoder_guidance_scale` nhỏ hơn `1`).

prompt_embeds (`torch.Tensor`, *tùy chọn*) : Các vector nhúng văn bản đã đượ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, *vd.* trọng số prompt. Nếu không được cung cấp, các vector nhúng văn bản sẽ được tạo từ đối số đầu vào `prompt`.

prompt_embeds_pooled (`torch.Tensor`, *tùy chọn*) : Các embedding văn bản đã được pool 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 đã pool sẽ được tạo từ đối số đầu vào `prompt`.

negative_prompt_embeds (`torch.Tensor`, *tùy chọn*) : Các vector nhúng 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, *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_prompt_embeds_pooled (`torch.Tensor`, *tùy chọn*) : Các embedding văn bản pooled â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, *vd.* trọng số prompt. Nếu không được cung cấp, negative_prompt_embeds_pooled sẽ được tạo từ đối số đầu vào `negative_prompt`.

image_embeds (`torch.Tensor`, *tùy chọn*) : Các embedding hình ảnh đã được tạo trước. Có thể được sử dụng để dễ dàng điều chỉnh các đầu vào hình ảnh, *vd.* trọng số prompt. Nếu không được cung cấp, các embedding hình ảnh sẽ được tạo từ đối số đầu vào `image` nếu có.

num_images_per_prompt (`int`, *tuỳ chọn*, mặc định là 1) : Số lượng hình ảnh cần tạo cho mỗi prompt.

generator (`torch.Generator` hoặc `list[torch.Generator]`, *tùy chọn*) : Một hoặc một danh sách [torch generator](https://pytorch.org/docs/stable/generated/torch.Generator.html) để đả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, đượ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ể được sử 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 ra bằng cách lấy mẫu sử dụng `generator` ngẫu nhiên được cung cấp.

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 một trong các tùy chọn: `"pil"` (`PIL.Image.Image`), `"np"` (`np.array`) hoặc `"pt"` (`torch.Tensor`).

return_dict (`bool`, *tùy chọn*, mặc định là `True`) : Có nên trả về một [ImagePipelineOutput](/docs/diffusers/main/vi/api/pipelines/consistency_models#diffusers.ImagePipelineOutput) thay vì một tuple thông thường hay không.

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_kwargs` sẽ bao gồm một danh sách tất cả các tensor như được chỉ định bởi `callback_on_step_end_tensor_inputs`.

callback_on_step_end_tensor_inputs (`list`, *optional*) : Danh sách các đầu vào tensor cho hàm `callback_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_inputs` của lớp pipeline của bạn.

**Trả về:**

`StableCascadePriorPipelineOutput` hoặc `tuple` `StableCascadePriorPipelineOutput` nếu `return_dict` là True, ngược lại là một `tuple`. Khi trả về một tuple, phần tử đầu tiên là một danh sách chứa các embedding của hình ảnh đã tạo.

Hàm được gọi khi gọi pipeline cho việc sinh.

Ví dụ:
```py
>>> import torch
>>> from diffusers import StableCascadePriorPipeline

>>> prior_pipe = StableCascadePriorPipeline.from_pretrained(
...     "stabilityai/stable-cascade-prior", torch_dtype=torch.bfloat16
... ).to("cuda")

>>> prompt = "an image of a shiba inu, donning a spacesuit and helmet"
>>> prior_output = pipe(prompt)
```

## StableCascadePriorPipelineOutput[[diffusers.pipelines.stable_cascade.pipeline_stable_cascade_prior.StableCascadePriorPipelineOutput]]

#### diffusers.pipelines.stable_cascade.pipeline_stable_cascade_prior.StableCascadePriorPipelineOutput[[diffusers.pipelines.stable_cascade.pipeline_stable_cascade_prior.StableCascadePriorPipelineOutput]]

```python
diffusers.pipelines.stable_cascade.pipeline_stable_cascade_prior.StableCascadePriorPipelineOutput(image_embeddings: typing.Union[torch.Tensor, numpy.ndarray], prompt_embeds: typing.Union[torch.Tensor, numpy.ndarray], prompt_embeds_pooled: typing.Union[torch.Tensor, numpy.ndarray], negative_prompt_embeds: typing.Union[torch.Tensor, numpy.ndarray], negative_prompt_embeds_pooled: typing.Union[torch.Tensor, numpy.ndarray])
```

[Nguồn](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/stable_cascade/pipeline_stable_cascade_prior.py#L60)

**Tham số:**

image_embeddings (`torch.Tensor` hoặc `np.ndarray`) : Nhúng hình ảnh trước cho prompt văn bản

prompt_embeds (`torch.Tensor`) : Nhúng văn bản cho prompt.

negative_prompt_embeds (`torch.Tensor`) : Nhúng văn bản cho prompt tiêu cực.

Lớp đầu ra cho WuerstchenPriorPipeline.

## StableCascadeDecoderPipeline[[diffusers.StableCascadeDecoderPipeline]]

#### diffusers.StableCascadeDecoderPipeline[[diffusers.StableCascadeDecoderPipeline]]

```python
diffusers.StableCascadeDecoderPipeline(decoder: StableCascadeUNet, tokenizer: CLIPTokenizer, text_encoder: CLIPTextModelWithProjection, scheduler: DDPMWuerstchenScheduler, vqgan: PaellaVQModel, latent_dim_scale: float = 10.67)
```

[Nguồn](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/stable_cascade/pipeline_stable_cascade.py#L60)

**Tham số:**

tokenizer (`CLIPTokenizer`) : Bộ phân từ CLIP.

text_encoder (`CLIPTextModelWithProjection`) : Bộ mã hóa văn bản của CLIP.

decoder (`StableCascadeUNet`) : unet của bộ giải mã Stable Cascade.

vqgan (`PaellaVQModel`) : Mô hình VQGAN.

scheduler (`DDPMWuerstchenScheduler`) : Một trình lập lịch được sử dụng kết hợp với `prior` để tạo nhúng hình ảnh.

latent_dim_scale (float, `optional`, mặc định là 10.67) : Hệ số nhân để xác định kích thước không gian tiềm ẩn VQ từ các nhúng ảnh. Nếu các nhúng ảnh có height=24 và width=24, hình dạng tiềm ẩn VQ cần có height=int(24*10.67)=256 và width=int(24*10.67)=256 để khớp với các điều kiện huấn luyện.

Pipeline để tạo hình ảnh từ mô hình Stable Cascade.

Mô hình này kế thừa từ [DiffusionPipeline](/docs/diffusers/main/vi/api/pipelines/overview#diffusers.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__[[diffusers.StableCascadeDecoderPipeline.__call__]]

```python
__call__(image_embeddings: typing.Union[torch.Tensor, list[torch.Tensor]], prompt: str | list[str] = None, num_inference_steps: int = 10, guidance_scale: float = 0.0, negative_prompt: str | list[str] | None = None, prompt_embeds: typing.Optional[torch.Tensor] = None, prompt_embeds_pooled: typing.Optional[torch.Tensor] = None, negative_prompt_embeds: typing.Optional[torch.Tensor] = None, negative_prompt_embeds_pooled: typing.Optional[torch.Tensor] = None, num_images_per_prompt: int = 1, generator: typing.Union[torch.Generator, list[torch.Generator], NoneType] = None, latents: typing.Optional[torch.Tensor] = None, output_type: str | None = 'pil', return_dict: bool = True, callback_on_step_end: typing.Optional[typing.Callable[[int, int], NoneType]] = None, callback_on_step_end_tensor_inputs: list = ['latents'])
```

[Nguồn](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/stable_cascade/pipeline_stable_cascade.py#L306)

**Tham số:**

image_embeddings (`torch.Tensor` hoặc `list[torch.Tensor]`) : Image Embeddings được trích xuất từ một hình ảnh hoặc được tạo ra bởi một Prior Model.

prompt (`str` hoặc `list[str]`) : Prompt hoặc các prompt để hướng dẫn việc tạo ảnh.

num_inference_steps (`int`, *optional*, mặc định là 12) : 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 cái giá là suy luận chậm hơn.

guidance_scale (`float`, *optional*, mặc định là 0.0) : Thang độ dẫn hướng như được định nghĩa trong [Classifier-Free Diffusion Guidance](https://huggingface.co/papers/2207.12598). `decoder_guidance_scale` được định nghĩa là `w` của phương trình 2. trong [Imagen Paper](https://huggingface.co/papers/2205.11487). Thang độ dẫn hướng được kích hoạt bằng cách đặt `decoder_guidance_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ới `prompt` văn bản, thường phải đánh đổi bằng chất lượng hình ảnh thấp hơn.

negative_prompt (`str` hoặc `list[str]`, *tùy chọn*) : Prompt hoặc các prompt không được dùng để hướng dẫn việc tạo ảnh. Bỏ qua khi không sử dụng guidance (tức là bị bỏ qua nếu `decoder_guidance_scale` nhỏ hơn `1`).

prompt_embeds (`torch.Tensor`, *tùy chọn*) : Các vector nhúng văn bản đã đượ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, *vd.* trọng số prompt. Nếu không được cung cấp, các vector nhúng văn bản sẽ được tạo từ đối số đầu vào `prompt`.

prompt_embeds_pooled (`torch.Tensor`, *tùy chọn*) : Các embedding văn bản đã được pool 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 đã pool sẽ được tạo từ đối số đầu vào `prompt`.

negative_prompt_embeds (`torch.Tensor`, *tùy chọn*) : Các vector nhúng 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, *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_prompt_embeds_pooled (`torch.Tensor`, *tùy chọn*) : Các embedding văn bản pooled â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, *vd.* trọng số prompt. Nếu không được cung cấp, negative_prompt_embeds_pooled sẽ được tạo từ đối số đầu vào `negative_prompt`.

num_images_per_prompt (`int`, *tuỳ chọn*, mặc định là 1) : Số lượng hình ảnh cần tạo cho mỗi prompt.

generator (`torch.Generator` hoặc `list[torch.Generator]`, *tùy chọn*) : Một hoặc một danh sách [torch generator](https://pytorch.org/docs/stable/generated/torch.Generator.html) để đả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, đượ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ể được sử 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 ra bằng cách lấy mẫu sử dụng `generator` ngẫu nhiên được cung cấp.

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 một trong các tùy chọn: `"pil"` (`PIL.Image.Image`), `"np"` (`np.array`) hoặc `"pt"` (`torch.Tensor`).

return_dict (`bool`, *tùy chọn*, mặc định là `True`) : Có nên trả về một [ImagePipelineOutput](/docs/diffusers/main/vi/api/pipelines/consistency_models#diffusers.ImagePipelineOutput) thay vì một tuple thông thường hay không.

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_kwargs` sẽ bao gồm một danh sách tất cả các tensor như được chỉ định bởi `callback_on_step_end_tensor_inputs`.

callback_on_step_end_tensor_inputs (`list`, *optional*) : Danh sách các đầu vào tensor cho hàm `callback_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_inputs` của lớp pipeline của bạn.

**Trả về:**

[ImagePipelineOutput](/docs/diffusers/main/vi/api/pipelines/consistency_models#diffusers.ImagePipelineOutput) hoặc `tuple` [ImagePipelineOutput](/docs/diffusers/main/vi/api/pipelines/consistency_models#diffusers.ImagePipelineOutput) nếu `return_dict` là True, ngược lại là một `tuple`. Khi trả về một tuple, phần tử đầu tiên là một danh sách chứa các embedding của hình ảnh đã tạo.

Hàm được gọi khi gọi pipeline cho việc sinh.

Ví dụ:
```py
>>> import torch
>>> from diffusers import StableCascadePriorPipeline, StableCascadeDecoderPipeline

>>> prior_pipe = StableCascadePriorPipeline.from_pretrained(
...     "stabilityai/stable-cascade-prior", torch_dtype=torch.bfloat16
... ).to("cuda")
>>> gen_pipe = StableCascadeDecoderPipeline.from_pretrain(
...     "stabilityai/stable-cascade", torch_dtype=torch.float16
... ).to("cuda")

>>> prompt = "an image of a shiba inu, donning a spacesuit and helmet"
>>> prior_output = pipe(prompt)
>>> images = gen_pipe(prior_output.image_embeddings, prompt=prompt)
```

