Diffusers documentation

Mengompilasi dan meng-offload model terkuantisasi

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

Mengompilasi dan meng-offload model terkuantisasi

Optimasi model sering kali melibatkan pertukaran antara kecepatan inferensi dan penggunaan memori. Misalnya, meskipun penyimpanan sementara (caching) dapat meningkatkan kecepatan inferensi, hal ini juga meningkatkan konsumsi memori karena perlu menyimpan keluaran dari lapisan perhatian perantara. Strategi optimasi yang lebih seimbang menggabungkan kuantisasi model, torch.compile, dan berbagai metode offloading.

Periksa panduan torch.compile untuk mempelajari lebih lanjut tentang kompilasi dan bagaimana hal tersebut dapat diterapkan di sini. Sebagai contoh, kompilasi regional dapat secara signifikan mengurangi waktu kompilasi tanpa mengorbankan percepatan apa pun.

Untuk generasi gambar, menggabungkan kuantisasi dan model offloading sering kali memberikan trade-off terbaik antara kualitas, kecepatan, dan memori. Group offloading tidak seefektif itu untuk generasi gambar karena biasanya tidak mungkin untuk sepenuhnya menumpuk transfer data jika kernel komputasi selesai lebih cepat. Hal ini menyebabkan beberapa overhead komunikasi antara CPU dan GPU.

Untuk generasi video, menggabungkan kuantisasi dan group-offloading cenderung lebih baik karena model video lebih terikat pada komputasi.

Tabel di bawah ini menyajikan perbandingan kombinasi strategi optimasi serta dampaknya terhadap latensi dan penggunaan memori untuk Flux.

kombinasilatensi (s)penggunaan- memori (GB)
kuantisasi32.60214.9453
quantization, torch.compile25.84714.9448
kuantisasi, torch.compile, offloading model ke CPU32.31212.2369
These results are benchmarked on Flux with a RTX 4090. The transformer and text_encoder components are quantized. Refer to the benchmarking script if you're interested in evaluating your own model.

Panduan ini akan menunjukkan cara mengompilasi dan meng-offload model terkuantisasi dengan bitsandbytes. Pastikan Anda menggunakan PyTorch nightly dan versi terbaru dari bitsandbytes.

Meskipun kami menggunakan bitsandbytes dalam contoh ini, backend kuantisasi lain seperti TorchAO juga mendukung fitur-fitur ini.

pip install -U bitsandbytes

Kuantisasi dan torch.compile

Mulai dengan mengkuantisasi model untuk mengurangi memori yang dibutuhkan untuk penyimpanan dan mengompilasi model tersebut untuk mempercepat inferensi.

Konfigurasikan Dynamo dengan capture_dynamic_output_shape_ops = True untuk menangani output dinamis saat mengompilasi model bitsandbytes.

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

torch._dynamo.config.capture_dynamic_output_shape_ops = True

# quantize
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"],
)
pipeline = DiffusionPipeline.from_pretrained(
    "black-forest-labs/FLUX.1-dev",
    quantization_config=pipeline_quant_config,
    dtype=torch.bfloat16,
).to("cuda")  # or "mps", "xpu", "cpu"

# compile
pipeline.transformer.to(memory_format=torch.channels_last)
pipeline.transformer.compile(mode="max-autotune", fullgraph=True)
pipeline("""
    cinematic film still of a cat sipping a margarita in a pool in Palm Springs, California
    highly detailed, high budget hollywood movie, cinemascope, moody, epic, gorgeous, film grain
"""
).images[0]

Kuantisasi, torch.compile, dan offloading

Selain kuantisasi dan torch.compile, coba offloading jika Anda perlu mengurangi penggunaan memori lebih lanjut. Offloading memindahkan berbagai lapisan atau komponen model dari CPU ke GPU sesuai kebutuhan untuk komputasi.

Konfigurasikan Dynamo cache_size_limit saat offloading untuk menghindari kompilasi ulang yang berlebihan dan atur capture_dynamic_output_shape_ops = True untuk menangani output dinamis saat mengompilasi model bitsandbytes.

offloading model CPU
offloading grup

Model CPU offloading memindahkan komponen pipeline individual, seperti model transformer, ke GPU saat dibutuhkan untuk komputasi. Jika tidak, komponen tersebut di-offload ke CPU.

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

torch._dynamo.config.cache_size_limit = 1000
torch._dynamo.config.capture_dynamic_output_shape_ops = True

# quantize
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"],
)
pipeline = DiffusionPipeline.from_pretrained(
    "black-forest-labs/FLUX.1-dev",
    quantization_config=pipeline_quant_config,
    dtype=torch.bfloat16,
).to("cuda")  # or "mps", "xpu", "cpu"

# model CPU offloading
pipeline.enable_model_cpu_offload()

# compile
pipeline.transformer.compile()
pipeline(
    "cinematic film still of a cat sipping a margarita in a pool in Palm Springs, California, highly detailed, high budget hollywood movie, cinemascope, moody, epic, gorgeous, film grain"
).images[0]
Update on GitHub