Diffusers documentation

Bắt đầu

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v0.42.1).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

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_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 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.

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 để 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. 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_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, 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.

BackendGhi chú
bitsandbytesConfig đượ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.
torchaoTương tự như trên.
GGUFSử dụng from_single_file với các lớp Model; không hỗ trợ tải ở cấp pipeline.
BFLTả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.
AutoRoundChỉ hỗ trợ tải; hãy lượng tử hóa trước bằng CLI AutoRound hoặc API Python.
Nunchaku LiteConfig được lưu trong config.json; yêu cầu gói kernels. Chỉ hỗ trợ tải.
ModelOptChỉ hỗ trợ nạp các mô hình đã lượng tử hóa trước.
SDNQHỗ 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.

Update on GitHub