Buckets:

mishig's picture
|
download
raw
11.6 kB

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 chắn 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.

Xet Storage Details

Size:
11.6 kB
·
Xet hash:
1b48bcb424c9d864d5e39896dbf6b184b7617f3f9de03e4af675e6a0facffaa3

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.