Diffusers documentation

Kantize modelleri derleme ve aktarma

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

Kantize modelleri derleme ve aktarma

Model optimizasyonu genellikle çalıştırma hızı ile Bellek kullanımı arasında ödünleşimler gerektirir. Örneğin, önbelleğe alma çalıştırma hızını artırabilir ancak ara dikkat katmanlarının çıktılarını depolaması gerektiğinden bellek tüketimini de artırır. Daha dengeli bir optimizasyon stratejisi, modelin kuantizlenmesi, torch.compile ve çeşitli aktarma yöntemleri ile birleştirilir.

Derleme ve bu derlemelerin burada nasıl uygulanabileceğini öğrenmek için torch.compile kılavuzunu inceleyin. Örneğin, bölgesel derleme, hızlanmalardan vazgeçmeden derleme süresini önemli ölçüde azaltabilir.

Görsel üretiminde, kuantizasyonun ve model offloading'in birleştirilmesi genellikle kalite, hız ve bellek arasında en iyi dengeyi sağlar. Grup offloading, hesaplama çekirdeği daha hızlı bittiyse veri aktarımının tamamen örtüşmesi genellikle mümkün olmadığından görsel üretimde o kadar etkili değildir. Bu durum, CPU ile GPU arasında bazı iletişim maliyetlerine yol açar.

Video üretimi için, video modelleri daha çok hesaplama sınırlı olduğundan, kuantizasyonun ve group-offloading'in birleştirilmesi genellikle daha iyi sonuç verir.

Aşağıdaki tablo, Flux için optimizasyon stratejisi kombinasyonlarını ve bunların gecikme ile bellek kullanımı üzerindeki etkilerini karşılaştırmaktadır.

kombinasyongecikme (s)bellek-kullanımı (GB)
quantization32.60214.9453
quantization, torch.compile25.84714.9448
quantization, torch.compile, model CPU offloading32.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.

Bu kılavuz, bitsandbytes ile bir kuantize modelin nasıl derleneceğini ve offload edileceğini gösterecektir. PyTorch nightly ve bitsandbytes'in en son sürümünü kullandığınızdan emin olun.

Bu örnekte bitsandbytes kullanıyoruz, ancak TorchAO gibi diğer kuantizasyon altyapıları da bu özellikleri destekler.

pip install -U bitsandbytes

Quantization ve torch.compile

Bir modelin bellek gereksinimini azaltmak için kantizasyonunu yapıp çıkarımı hızlandırmak için derlemesini yaparak başlayın.

bitsandbytes modellerini derlerken dinamik çıktıları işlemek için Dynamo yapılandırmasını capture_dynamic_output_shape_ops = True olarak ayarlayın.

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]

Kantizasyon, torch.compile ve offloading

Kantizasyon ve torch.compile'in yanı sıra, bellek kullanımını daha da azaltmanız gerekiyorsa offloading'i deneyin. Offloading, hesaplama gereksinimlerine göre çeşitli katmanları veya model bileşenlerini CPU'dan GPU'ya taşır.

Offloading sırasında aşırı yeniden derlemeyi önlemek için Dynamo cache_size_limit değerini yapılandırın ve bitsandbytes modellerini derlerken dinamik çıktıları işlemek için capture_dynamic_output_shape_ops = True ayarlayın.

model CPU'ya aktarımı
grup boşaltma

Model CPU offloading, transformer modeli gibi bireysel bir pipeline bileşenini, hesaplama için gerektiğinde GPU'ya taşır. Aksi takdirde, bileşen CPU'ya aktarılır.

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