Buckets:

mishig's picture
|
download
raw
11 kB

Başlangıç

Kantizasyon, orijinal verinin hassasiyetini korumaya çalışırken veriyi daha az bit ile temsil etmeye odaklanır. Bu genellikle, aynı bilgiyi daha az bit ile temsil etmek için bir veri türünü dönüştürmek anlamına gelir. Örneğin, model ağırlıklarınız 32 bit kayan nokta olarak saklanıyor ve 16 bit kayan nokta olarak kantize ediliyorsa, bu model boyutunu yarıya indirir; bu da depolamayı kolaylaştırır ve bellek kullanımını azaltır. Daha düşük hassasiyet, daha az bit ile hesaplamaların yapılması daha az zaman aldığı için çıkarımı da hızlandırabilir.

Diffusers, Flux gibi büyük difüzyon modellerinin daha erişilebilir hale getirilmesi için birden fazla kuantizasyon arka ucunu destekler. Bu kılavuz, bir pipeline'ın önceden eğitilmiş veya kuantize edilmemiş bir checkpoint'ten başlatılırken PipelineQuantizationConfig sınıfını kullanarak nasıl kuantize edileceğini gösterir.

Hattın seviyesinde kuantizasyon

Kantizasyon yapılandırmasına ne kadar özelleştirme uygulamak istediğinize bağlı olarak PipelineQuantizationConfig'i kullanmanın iki yolu vardır.

  • temel kullanım senaryoları için quant_backend, quant_kwargs ve components_to_quantize argümanlarını tanımlayın
  • daha ince ayarlı kuantizasyon kontrolü için, bireysel model bileşenleri için kuantizasyon yapılandırmasını sağlayan bir quant_mapping tanımlayın

Temel kuantizasyon

Aşağıdaki parametrelerle PipelineQuantizationConfig sınıfını başlatın.

  • quant_backend, kullanılacak kuantizasyon arka ucunu belirtir. Şu anda desteklenen arka uçlar şunlardır: bitsandbytes_4bit, bitsandbytes_8bit, gguf, quanto ve torchao.
  • quant_kwargs, kullanılacak kuantizasyon argümanlarını belirtir.

Bu quant_kwargs argümanları her backend için farklıdır. Her backend için argümanları görüntülemek için Quantization API belgelerine başvurun.

  • components_to_quantize, pipeline'in hangi bileşenlerinin (bileşenlerin) kuantize edileceğini belirtir. Genellikle, transformer gibi en yoğun hesaplama gerektiren bileşenleri kuantize etmeniz gerekir. FluxPipeline gibi birden fazla metin kodlayıcı içeren bir pipeline varsa, kuantize edilecek diğer bir bileşen olarak metin kodlayıcıyı da değerlendirmeniz gerekir. Aşağıdaki örnek, FluxPipeline içindeki T5 metin kodlayıcıyı kuantize ederken CLIP modelini olduğu gibi bırakır.

    components_to_quantize, birden fazla model için bir liste veya tek bir model için bir dize kabul eder.

Aşağıdaki örnek, BitsAndBytesConfig içinden load_in_4bit, bnb_4bit_quant_type ve bnb_4bit_compute_dtype argümanlarıyla bitsandbytes arka ucunu yükler.

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"],
)

Hattı (pipeline) nicelleştirmek (quantize) için pipeline_quant_config değerini from_pretrained() fonksiyonuna iletin.

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]

Gelişmiş kuantizasyon

quant_mapping argümanı, bir iş akışındaki her bir bileşenin nasıl nicelendirileceğine dair daha fazla seçenek sunar; örneğin farklı nicelendirme altyapılarını birleştirmek gibi.

PipelineQuantizationConfig nesnesini başlatın ve ona bir quant_mapping iletin. quant_mapping, pipeline'daki transformer ve metin kodlayıcı gibi her bir bileşen için kuantizasyon seçeneklerini belirtmenizi sağlar.

Aşağıdaki örnek, transformer ve metin kodlayıcı için iki kuantizasyon arka ucunu, QuantoConfig ve transformers.BitsAndBytesConfig'i kullanır.

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

Transformers içinde ayrı bir bitsandbytes arka ucu bulunur. Transformers'tan gelen bileşenler için transformers.BitsAndBytesConfig içe aktarıp kullanmanız gerekir. Örneğin, FluxPipeline içindeki text_encoder_2, Transformers'tan bir T5EncoderModel olduğu için diffusers.BitsAndBytesConfig yerine transformers.BitsAndBytesConfig kullanmanız gerekir.

Bu ayrı importları yönetmek istemiyorsanız veya her pipeline bileşeninin nereden geldiğinden emin değilseniz, yukarıdaki temel kuantizasyon yöntemini kullanın.

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

Hattı (pipeline) nicelleştirmek (quantize) için pipeline_quant_config değerini from_pretrained() fonksiyonuna iletin.

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]

Önceden kuantize edilmiş kontrol noktalarını yükleme

Bazı kuantizasyon arka uçları, Hub'a zaten kuantize edilmiş olarak yüklenmiş kontrol noktalarını (checkpoint) yüklemeyi destekler. Bu durumda, kuantizasyon yapılandırması modelin config.json dosyasında saklanır ve otomatik olarak okunur — bir PipelineQuantizationConfig oluşturmanıza veya quantization_config argümanını iletmenize gerek yoktur.

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"

Aşağıdaki arka uçlar, önceden kantlanmış kontrol noktalarını kutudan çıktığı gibi yüklemeyi destekler.

Arka uç Notlar
bitsandbytes Config, config.json dosyasında saklanır; ek argüman gerekmez. Hem anlık olarak nicelleştirmeyi hem de önceden nicelleştirilmiş checkpoint'leri yüklemeyi destekler.
torchao Yukarıdakiyle aynı.
GGUF Model sınıflarıyla from_single_file kullanır; pipeline düzeyinde yükleme desteklenmez.
BFL Black Forest Labs fp8r ve nvfp4 tek dosyalık checkpoint'leri from_single_file ile yükler; pipeline düzeyinde yükleme desteklenmez.
AutoRound Yalnızca yükleme desteklenir; önce AutoRound CLI veya Python API ile kuantizasyon yapın.
Nunchaku Lite Config, config.json dosyasında saklanır; kernels paketi gerektirir. Yalnızca yükleme desteklenir.
ModelOpt Yalnızca önceden kuantize edilmiş modellerin yüklenmesi desteklenir.
SDNQ Hem anlık kuantizasyonu hem de önceden kuantize edilmiş modellerin yüklenmesini destekler; sdnq paketini gerektirir.

Kaynaklar

Quantization hakkında daha fazla bilgi edinmek için aşağıdaki kaynaklara göz atın.

Xet Storage Details

Size:
11 kB
·
Xet hash:
818c044e7c802bf51615c51ef2ca01a39ee45094504ac22359ef0d04472f2481

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