# Bắt đầu

Quantization tập trung vào việc biểu diễn dữ liệu bằng ít bit hơn trong khi vẫn cố gắng giữ nguyên độ chính xác của dữ liệu gốc. Điều này thường có nghĩa là chuyển đổi kiểu dữ liệu để biểu diễn cùng một thông tin bằng ít bit hơn. Ví dụ, nếu trọng số mô hình của bạn được lưu dưới dạng số thực 32-bit và chúng được lượng tử hóa xuống số thực 16-bit, kích thước mô hình sẽ giảm một nửa, giúp việc lưu trữ dễ dàng hơn và giảm mức sử dụng bộ nhớ. Độ chính xác thấp hơn cũng có thể tăng tốc suy luận vì việc thực hiện các phép tính với ít bit hơn mất ít thời gian hơn.

Diffusers hỗ trợ nhiều backend lượng tử hóa để các mô hình khuếch tán lớn như [Flux](../api/pipelines/flux) trở nên dễ tiếp cận hơn. Hướng dẫn này cho thấy cách sử dụng lớp [PipelineQuantizationConfig](/docs/diffusers/v0.43.0/vi/api/quantization#diffusers.PipelineQuantizationConfig) để lượng tử hóa một pipeline trong quá trình khởi tạo từ checkpoint được huấn luyện trước hoặc chưa được lượng tử hóa.

## Lượng tử hóa ở cấp độ Pipeline

Có hai cách để sử dụng [PipelineQuantizationConfig](/docs/diffusers/v0.43.0/vi/api/quantization#diffusers.PipelineQuantizationConfig) tùy thuộc vào mức độ tùy chỉnh bạn muốn áp dụng cho cấu hình lượng tử hóa.

- cho các trường hợp sử dụng cơ bản, hãy xác định các đối số `quant_backend`, `quant_kwargs` và `components_to_quantize`
- để kiểm soát lượng tử hóa chi tiết, hãy định nghĩa `quant_mapping` cung cấp cấu hình lượng tử hóa cho từng thành phần của mô hình

### Lượng tử hóa cơ bản

Khởi tạo [PipelineQuantizationConfig](/docs/diffusers/v0.43.0/vi/api/quantization#diffusers.PipelineQuantizationConfig) với các tham số sau.

- `quant_backend` chỉ định backend lượng tử hóa cần sử dụng. Các backend được hỗ trợ hiện tại bao gồm: `bitsandbytes_4bit`, `bitsandbytes_8bit`, `gguf`, `quanto` và `torchao`.
- `quant_kwargs` chỉ định các đối số lượng tử hóa cần sử dụng.

> [!TIP]
> Các đối số `quant_kwargs` này khác nhau tùy theo từng backend. Hãy tham khảo tài liệu [Quantization API](../api/quantization) để xem các đối số của từng backend.

- `components_to_quantize` chỉ định thành phần nào của pipeline cần được lượng tử hóa. Thông thường, bạn nên lượng tử hóa các thành phần tiêu tốn nhiều tài nguyên tính toán nhất, chẳng hạn như transformer. Text encoder là một thành phần khác cần cân nhắc lượng tử hóa nếu pipeline có nhiều hơn một, như trong [FluxPipeline](/docs/diffusers/v0.43.0/vi/api/pipelines/flux#diffusers.FluxPipeline). Ví dụ bên dưới lượng tử hóa T5 text encoder trong [FluxPipeline](/docs/diffusers/v0.43.0/vi/api/pipelines/flux#diffusers.FluxPipeline) trong khi giữ nguyên mô hình CLIP.

   `components_to_quantize` chấp nhận một danh sách cho nhiều mô hình hoặc một chuỗi cho một mô hình duy nhất.

Ví dụ dưới đây nạp backend bitsandbytes với các đối số sau từ [BitsAndBytesConfig](/docs/diffusers/v0.43.0/vi/api/quantization#diffusers.BitsAndBytesConfig), `load_in_4bit`, `bnb_4bit_quant_type` và `bnb_4bit_compute_dtype`.

```py
import torch
from diffusers import DiffusionPipeline
from diffusers.quantizers import PipelineQuantizationConfig

pipeline_quant_config = PipelineQuantizationConfig(
    quant_backend="bitsandbytes_4bit",
    quant_kwargs={"load_in_4bit": True, "bnb_4bit_quant_type": "nf4", "bnb_4bit_compute_dtype": torch.bfloat16},
    components_to_quantize=["transformer", "text_encoder_2"],
)
```

Truyền `pipeline_quant_config` vào [from_pretrained()](/docs/diffusers/v0.43.0/vi/api/pipelines/overview#diffusers.DiffusionPipeline.from_pretrained) để lượng tử hóa pipeline.

```py
pipe = DiffusionPipeline.from_pretrained(
    "black-forest-labs/FLUX.1-dev",
    quantization_config=pipeline_quant_config,
    dtype=torch.bfloat16,
).to("cuda")  # or "mps", "xpu", "cpu"

image = pipe("photo of a cute dog").images[0]
```

### Lượng tử hóa nâng cao

Tham số `quant_mapping` cung cấp nhiều tùy chọn hơn về cách lượng tử hóa từng thành phần riêng lẻ trong một pipeline, chẳng hạn như kết hợp các backend lượng tử hóa khác nhau.

Khởi tạo [PipelineQuantizationConfig](/docs/diffusers/v0.43.0/vi/api/quantization#diffusers.PipelineQuantizationConfig) và truyền một `quant_mapping` vào. `quant_mapping` cho phép bạn chỉ định các tùy chọn lượng tử hóa cho từng thành phần trong pipeline, chẳng hạn như transformer và text encoder.

Ví dụ bên dưới sử dụng hai backend lượng tử hóa, [QuantoConfig](/docs/diffusers/v0.43.0/vi/api/quantization#diffusers.QuantoConfig) và [transformers.BitsAndBytesConfig](https://huggingface.co/docs/transformers/v5.22.2/en/main_classes/quantization#transformers.BitsAndBytesConfig), cho transformer và text encoder.

```py
import torch
from diffusers import DiffusionPipeline
from diffusers import BitsAndBytesConfig as DiffusersBitsAndBytesConfig
from diffusers.quantizers.quantization_config import QuantoConfig
from diffusers.quantizers import PipelineQuantizationConfig
from transformers import BitsAndBytesConfig as TransformersBitsAndBytesConfig

pipeline_quant_config = PipelineQuantizationConfig(
    quant_mapping={
        "transformer": QuantoConfig(weights_dtype="int8"),
        "text_encoder_2": TransformersBitsAndBytesConfig(
            load_in_4bit=True, compute_dtype=torch.bfloat16
        ),
    }
)
```

Có một backend bitsandbytes riêng trong [Transformers](https://huggingface.co/docs/transformers/main_classes/quantization#transformers.BitsAndBytesConfig). Bạn cần import và sử dụng [transformers.BitsAndBytesConfig](https://huggingface.co/docs/transformers/v5.22.2/en/main_classes/quantization#transformers.BitsAndBytesConfig) cho các thành phần đến từ Transformers. Ví dụ, `text_encoder_2` trong [FluxPipeline](/docs/diffusers/v0.43.0/vi/api/pipelines/flux#diffusers.FluxPipeline) là một [T5EncoderModel](https://huggingface.co/docs/transformers/v5.22.2/en/model_doc/t5#transformers.T5EncoderModel) từ Transformers, vì vậy bạn cần sử dụng [transformers.BitsAndBytesConfig](https://huggingface.co/docs/transformers/v5.22.2/en/main_classes/quantization#transformers.BitsAndBytesConfig) thay vì [diffusers.BitsAndBytesConfig](/docs/diffusers/v0.43.0/vi/api/quantization#diffusers.BitsAndBytesConfig).

> [!TIP]
> Hãy sử dụng phương pháp [lượng tử hóa cơ bản](#basic-quantization) ở trên nếu bạn không muốn quản lý các import riêng biệt này hoặc không chắc chắn mỗi thành phần pipeline đến từ đâu.

```py
import torch
from diffusers import DiffusionPipeline
from diffusers import BitsAndBytesConfig as DiffusersBitsAndBytesConfig
from diffusers.quantizers import PipelineQuantizationConfig
from transformers import BitsAndBytesConfig as TransformersBitsAndBytesConfig

pipeline_quant_config = PipelineQuantizationConfig(
    quant_mapping={
        "transformer": DiffusersBitsAndBytesConfig(load_in_4bit=True, bnb_4bit_compute_dtype=torch.bfloat16),
        "text_encoder_2": TransformersBitsAndBytesConfig(
            load_in_4bit=True, compute_dtype=torch.bfloat16
        ),
    }
)
```

Truyền `pipeline_quant_config` vào [from_pretrained()](/docs/diffusers/v0.43.0/vi/api/pipelines/overview#diffusers.DiffusionPipeline.from_pretrained) để lượng tử hóa pipeline.

```py
pipe = DiffusionPipeline.from_pretrained(
    "black-forest-labs/FLUX.1-dev",
    quantization_config=pipeline_quant_config,
    dtype=torch.bfloat16,
).to("cuda")  # or "mps", "xpu", "cpu"

image = pipe("photo of a cute dog").images[0]
```

## Tải các checkpoint đã lượng tử hóa trước

Một số backend lượng tử hóa hỗ trợ nạp các checkpoint đã được lượng tử hóa và tải lên Hub. Trong trường hợp này, cấu hình lượng tử hóa được lưu trong `config.json` của model và được đọc tự động — bạn không cần tạo [PipelineQuantizationConfig](/docs/diffusers/v0.43.0/vi/api/quantization#diffusers.PipelineQuantizationConfig) hoặc truyền tham số `quantization_config`.

```py
import torch
from diffusers import DiffusionPipeline

pipe = DiffusionPipeline.from_pretrained(
    "rootonchair/ERNIE-Image-Turbo-nunchaku-lite-nvfp4",
    dtype=torch.bfloat16,
).to("cuda")  # or "mps", "xpu", "cpu"
```

Các backend sau hỗ trợ nạp các checkpoint đã lượng hóa sẵn ngay từ đầu.

| Backend | Ghi chú |
|---|---|
| [bitsandbytes](./bitsandbytes) | Config được lưu trong `config.json`; không cần thêm các đối số khác. Hỗ trợ lượng tử hóa trực tiếp cũng như nạp các checkpoint đã được lượng tử hóa trước. |
| [torchao](./torchao) | Tương tự như trên. |
| [GGUF](./gguf) | Sử dụng `from_single_file` với các lớp Model; không hỗ trợ tải ở cấp pipeline. |
| [BFL](./bfl) | Tải checkpoint đơn tệp `fp8r` và `nvfp4` của Black Forest Labs bằng `from_single_file`; không hỗ trợ tải ở cấp pipeline. |
| [AutoRound](./autoround) | Chỉ hỗ trợ tải; hãy lượng tử hóa trước bằng CLI AutoRound hoặc API Python. |
| [Nunchaku Lite](./nunchaku) | Config được lưu trong `config.json`; yêu cầu gói `kernels`. Chỉ hỗ trợ tải. |
| [ModelOpt](./modelopt) | Chỉ hỗ trợ nạp các mô hình đã lượng tử hóa trước. |
| [SDNQ](./sdnq) | Hỗ trợ cả lượng hóa trực tiếp và tải các mô hình đã lượng hóa trước; yêu cầu gói `sdnq`. |

## Tài nguyên

Xem các tài nguyên bên dưới để tìm hiểu thêm về lượng tử hóa.

- Nếu bạn mới bắt đầu với lượng tử hóa, chúng tôi khuyến khích bạn tham khảo các khóa học thân thiện với người mới bắt đầu sau đây, được hợp tác cùng DeepLearning.AI.

    - [Nền tảng lượng tử hóa với Hugging Face](https://www.deeplearning.ai/short-courses/quantization-fundamentals-with-hugging-face/)
    - [Đi sâu vào Lượng tử hóa](https://www.deeplearning.ai/short-courses/quantization-in-depth/)

- Tham khảo [Hướng dẫn đóng góp phương pháp lượng tử hóa mới](https://huggingface.co/docs/transformers/main/en/quantization/contribute) nếu bạn quan tâm đến việc thêm một phương pháp lượng tử hóa mới.

- Tổng quan về lượng tử hóa của Transformers [Tổng quan](https://huggingface.co/docs/transformers/quantization/overview#when-to-use-what) cung cấp cái nhìn tổng quan về ưu và nhược điểm của các backend lượng tử hóa khác nhau.

- Đọc bài đăng trên blog [Khám phá các backend lượng tử hóa trong Diffusers](https://huggingface.co/blog/diffusers-quantization) để có giới thiệu ngắn gọn về từng backend lượng tử hóa, cách chọn backend và kết hợp lượng tử hóa với các tối ưu hóa bộ nhớ khác.

