Diffusers documentation
Bắt đầu
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 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 để 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 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_kwargsvàcomponents_to_quantize - để kiểm soát lượng tử hóa chi tiết, hãy định nghĩa
quant_mappingcung 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 với các tham số sau.
quant_backendchỉ đị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,quantovàtorchao.quant_kwargschỉ định các đối số lượng tử hóa cần sử dụng.
Các đối số
quant_kwargsnày khác nhau tùy theo từng backend. Hãy tham khảo tài liệu Quantization API để xem các đối số của từng backend.
components_to_quantizechỉ đị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. Ví dụ bên dưới lượng tử hóa T5 text encoder trong FluxPipeline trong khi giữ nguyên mô hình CLIP.components_to_quantizechấ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, load_in_4bit, bnb_4bit_quant_type và bnb_4bit_compute_dtype.
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() để lượng tử hóa pipeline.
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 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 và transformers.BitsAndBytesConfig, cho transformer và text encoder.
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. Bạn cần import và sử dụng transformers.BitsAndBytesConfig cho các thành phần đến từ Transformers. Ví dụ, text_encoder_2 trong FluxPipeline là một T5EncoderModel từ Transformers, vì vậy bạn cần sử dụng transformers.BitsAndBytesConfig thay vì diffusers.BitsAndBytesConfig.
Hãy sử dụng phương pháp lượng tử hóa cơ bản ở 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 mỗi thành phần pipeline đến từ đâu.
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() để lượng tử hóa pipeline.
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 hoặc truyền tham số quantization_config.
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 | 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 | Tương tự như trên. |
| GGUF | Sử dụng from_single_file với các lớp Model; không hỗ trợ tải ở cấp pipeline. |
| 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 | Chỉ hỗ trợ tải; hãy lượng tử hóa trước bằng CLI AutoRound hoặc API Python. |
| Nunchaku Lite | Config được lưu trong config.json; yêu cầu gói kernels. Chỉ hỗ trợ tải. |
| ModelOpt | Chỉ hỗ trợ nạp các mô hình đã lượng tử hóa trước. |
| 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.
Tham khảo Hướng dẫn đóng góp phương pháp lượng tử hóa mới 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 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 để 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.