Diffusers documentation

Memulai

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

Memulai

Quantization berfokus pada representasi data dengan jumlah bit yang lebih sedikit sambil tetap berusaha mempertahankan presisi data asli. Hal ini sering berarti mengonversi tipe data untuk merepresentasikan informasi yang sama dengan bit yang lebih sedikit. Misalnya, jika bobot model Anda disimpan sebagai floating point 32-bit dan dikuantisasi menjadi floating point 16-bit, ukuran model akan berkurang setengahnya sehingga lebih mudah disimpan dan penggunaan memori berkurang. Presisi yang lebih rendah juga dapat mempercepat inferensi karena waktu yang dibutuhkan untuk melakukan perhitungan dengan bit yang lebih sedikit lebih singkat.

Diffusers mendukung beberapa backend kuantisasi untuk membuat model difusi besar seperti Flux lebih mudah diakses. Panduan ini menunjukkan cara menggunakan kelas PipelineQuantizationConfig untuk mengkuantisasi pipeline selama inisialisasinya dari checkpoint pretrained atau non-kuantisasi.

Kuantisasi tingkat pipeline

Ada dua cara untuk menggunakan PipelineQuantizationConfig tergantung pada seberapa banyak kustomisasi yang ingin Anda terapkan pada konfigurasi kuantisasi.

  • untuk kasus penggunaan dasar, definisikan argumen quant_backend, quant_kwargs, dan components_to_quantize
  • untuk kontrol kuantisasi yang lebih granular, definisikan quant_mapping yang menyediakan konfigurasi kuantisasi untuk komponen model individual

Kuantisasi dasar

Inisialisasi PipelineQuantizationConfig dengan parameter berikut.

  • quant_backend menentukan backend kuantisasi yang akan digunakan. Backend yang saat ini didukung meliputi: bitsandbytes_4bit, bitsandbytes_8bit, gguf, quanto, dan torchao.
  • quant_kwargs menentukan argumen kuantisasi yang akan digunakan.

Argumen quant_kwargs ini berbeda untuk setiap backend. Lihat dokumentasi Quantization API untuk melihat argumen untuk setiap backend.

  • components_to_quantize menentukan komponen mana dari pipeline yang akan dikuantisasi. Biasanya, Anda sebaiknya menguantisasi komponen yang paling intensif secara komputasi, seperti transformer. Text encoder adalah komponen lain yang perlu dipertimbangkan untuk dikuantisasi jika pipeline memiliki lebih dari satu, seperti pada FluxPipeline. Contoh di bawah ini menguantisasi T5 text encoder di FluxPipeline sambil mempertahankan model CLIP tetap utuh.

    components_to_quantize menerima daftar untuk beberapa model atau string untuk satu model.

Contoh di bawah ini memuat backend bitsandbytes dengan argumen berikut dari BitsAndBytesConfig, load_in_4bit, bnb_4bit_quant_type, dan 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"],
)

Lewatkan pipeline_quant_config ke from_pretrained() untuk mengkuantisasi 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]

Kuantisasi lanjutan

Argumen quant_mapping menyediakan lebih banyak opsi untuk cara mengkuantisasi setiap komponen individual dalam pipeline, seperti menggabungkan backend kuantisasi yang berbeda.

Inisialisasi PipelineQuantizationConfig dan berikan quant_mapping ke dalamnya. quant_mapping memungkinkan Anda untuk menentukan opsi kuantisasi untuk setiap komponen dalam pipeline, seperti transformer dan text encoder.

Contoh di bawah ini menggunakan dua backend kuantisasi, QuantoConfig dan transformers.BitsAndBytesConfig, untuk transformer dan 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
        ),
    }
)

Ada backend bitsandbytes terpisah di Transformers. Anda perlu mengimpor dan menggunakan transformers.BitsAndBytesConfig untuk komponen yang berasal dari Transformers. Misalnya, text_encoder_2 di FluxPipeline adalah T5EncoderModel dari Transformers, jadi Anda perlu menggunakan transformers.BitsAndBytesConfig alih-alih diffusers.BitsAndBytesConfig.

Gunakan metode basic quantization di atas jika Anda tidak ingin mengelola impor yang berbeda-beda ini atau tidak yakin dari mana masing-masing komponen pipeline berasal.

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
        ),
    }
)

Lewatkan pipeline_quant_config ke from_pretrained() untuk mengkuantisasi 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]

Memuat checkpoint prequantized

Beberapa backend kuantisasi mendukung pemuatan checkpoint yang sudah dikuantisasi dan diunggah ke Hub. Dalam kasus ini, konfigurasi kuantisasi disimpan di config.json model dan dibaca secara otomatis — Anda tidak perlu membuat PipelineQuantizationConfig atau meneruskan argumen 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"

Backend berikut mendukung pemuatan checkpoint prequantized secara bawaan.

BackendCatatan
bitsandbytesConfig disimpan di config.json; tidak perlu argumen tambahan. Mendukung kuantisasi secara langsung serta memuat checkpoint yang sudah dikuantisasi.
torchaoSama seperti di atas.
GGUFMenggunakan from_single_file dengan kelas Model; pemuatan pada tingkat pipeline tidak didukung.
BFLMemuat checkpoint single-file Black Forest Labs fp8r dan nvfp4 dengan from_single_file; pemuatan pada tingkat pipeline tidak didukung.
AutoRoundHanya pemuatan yang didukung; kuantisasi terlebih dahulu dengan CLI AutoRound atau API Python.
Nunchaku LiteConfig disimpan di config.json; memerlukan paket kernels. Hanya pemuatan yang didukung.
ModelOptHanya pemuatan model prequantized yang didukung.
SDNQMendukung kuantisasi secara langsung dan pemuatan model yang sudah dikuantisasi; memerlukan paket sdnq.

Sumber daya

Lihat sumber daya di bawah ini untuk mempelajari lebih lanjut tentang kuantisasi.

Update on GitHub