Buckets:
SDNQ
SDNQ (SD.Next Quantization), geniş bir ağırlık dtype aralığını (int8'den 2-bit'e kadar, FP8 ve diğer düşük bitlik float formatları) destekleyen, isteğe bağlı SVD düzeltmesi, Hadamard rotasyonu ve daha hızlı çıkarım için kuantize INT8/FP8 matmul içeren, eğitim gerektirmeyen bir kuantizasyon arka ucudur. CUDA, ROCm, XPU, MPS ve CPU üzerinde çalışır.
Bu arka ucu kullanmak için sdnq kütüphanesini yükleyin.
pip install sdnq
Önceden kuantize edilmiş bir kontrol noktası yükleyin
Önceden kantize edilmiş bir SDNQ kontrol noktasının kantizasyon yapılandırması, config.json dosyasında saklanır; bu nedenle herhangi bir model gibi yüklenir ve quantization_config argümanı gerekmez. Tek gereklilik, sdnq'nin kurulu olmasıdır.
import torch
from diffusers import DiffusionPipeline
pipe = DiffusionPipeline.from_pretrained(
"Disty0/Z-Image-Turbo-SDNQ-uint4-svd-r32",
dtype=torch.bfloat16,
).to("cuda") # or "mps", "xpu", "cpu"
image = pipe("a cat holding a sign that says hello").images[0]
image.save("output.png")
SDNQ-kuantize edilmiş bir Transformers modelini, örneğin kuantize edilmiş bir metin kodlayıcıyı veya modüler bir boru hattında bağımsız bir LLM bileşenini, tek başına yüklediğinizde
DIFFUSERS_SDNQ_TRANSFORMERS=1değerini (Diffusers içe aktarılmasından önce) ayarlayın. Bu,sdnq'nin Transformers ile kendini kaydetmesine ve kuantize edilmiş modelin doğru şekilde yüklenmesine olanak tanır. SDNQ-kuantize edilmiş bir diffusers transformer'ı bununla birlikte yüklendiğinde buna gerek yoktur, çünkü o transformer'ın yüklenmesi zatensdnq'yi içe aktarır ve kaydeder. Varsayılan olarak kapalıdır, böylece SDNQ kullanmayan boru hatları aslasdnq'yi içe aktarmaz.
Bir modeli anlık olarak kuantize edin
Bir modeli yükleme sırasında nicelleştirmek için from_pretrained fonksiyonuna SDNQConfig geçirin. Belirli pipeline bileşenlerini nicelleştirmek için PipelineQuantizationConfig kullanın.
import torch
from diffusers import DiffusionPipeline, PipelineQuantizationConfig, SDNQConfig
pipeline_quant_config = PipelineQuantizationConfig(
quant_mapping={"transformer": SDNQConfig(weights_dtype="uint4", use_svd=True)}
)
pipe = DiffusionPipeline.from_pretrained(
"Tongyi-MAI/Z-Image-Turbo",
quantization_config=pipeline_quant_config,
dtype=torch.bfloat16,
).to("cuda") # or "mps", "xpu", "cpu"
Veya tek bir model bileşenini doğrudan kuantize edin.
import torch
from diffusers import ZImageTransformer2DModel, SDNQConfig
transformer = ZImageTransformer2DModel.from_pretrained(
"Tongyi-MAI/Z-Image-Turbo",
subfolder="transformer",
quantization_config=SDNQConfig(weights_dtype="int8"),
dtype=torch.bfloat16,
)
Tüm argümanlar sdnq.SDNQConfig sınıfına iletilir. Desteklenen dtype ve seçeneklerin tam listesi için SDNQ dokümantasyonuna başvurun.
Hangi katmanların kuantize edileceğini seçme
Bazı katmanlar diğerlerine göre kuantizasyona daha hassastır ve hassas olanların atlanması, hafif bir bellek maliyeti karşılığında kaliteyi artırır. SDNQ bunu kutudan çıktığı gibi ele alır: otomatik olarak uygulanan yerleşik atlama listeleri (genel bir liste ve birçok mimari için model bazlı listeler) ile birlikte gelir, böylece standart hassas katmanlar herhangi bir yapılandırma gerektirmeden kuantize edilmeden kalır. Daha ince kontrol için, katman başına kuantizasyon hatasını ölçüp kayıp eşiğinin üzerindeki katmanları atlayarak katmanları dinamik olarak seçebilir. Ayrıntılar için SDNQ dinamik kuantizasyon kılavuzu'na başvurun.
Kantize matmul ile daha hızlı çıkarım
Varsayılan olarak SDNQ, her matmul işleminden önce ağırlıkları hesaplama veri türüne (compute dtype) geri dönüştürür. Bunun yerine quantized matmul etkinleştirildiğinde, matmul işlemi doğrudan düşük hassasiyetli bir veri türünde (INT8/FP8/FP16) çalıştırılır; bu da çalışan bir Triton kurulumuna sahip donanımlarda (CUDA, ROCm veya XPU) daha hızlıdır.
Yüklenmiş bir modelde apply_sdnq_options_to_model ile etkinleştirin; bu fonksiyon modelin mevcut kuantizasyon yapılandırmasını okur ve seçeneği yerinde yeniden uygular. Bu, SDNQConfig geçirilmeyen önceden kuantize edilmiş kontrol noktaları için de geçerlidir.
import torch
from diffusers import DiffusionPipeline
from sdnq.common import use_torch_compile as triton_is_available
from sdnq.loader import apply_sdnq_options_to_model
pipe = DiffusionPipeline.from_pretrained(
"Disty0/Z-Image-Turbo-SDNQ-uint4-svd-r32",
dtype=torch.bfloat16,
).to("cuda") # or "mps", "xpu", "cpu"
if triton_is_available and (torch.cuda.is_available() or torch.xpu.is_available()):
pipe.transformer = apply_sdnq_options_to_model(pipe.transformer, use_quantized_matmul=True)
pipe.text_encoder = apply_sdnq_options_to_model(pipe.text_encoder, use_quantized_matmul=True)
torch.compile
SDNQ quantize edilmiş modeller, group offloading ile birlikte dahil olmak üzere ek hızlandırmalar için torch.compile ile uyumludur.
transformer.compile(fullgraph=True)
Kantize edilmiş bir modeli kaydet
Kantize modeller save_pretrained ile serialize edilebilir ve quantization_config olmadan yeniden yüklenebilir.
transformer.save_pretrained("z-image-turbo-sdnq-int8")
Kaynaklar
Xet Storage Details
- Size:
- 6.09 kB
- Xet hash:
- 3ed56a564ee958d3bd843c1169b263f2a07e2ef94a3ba8c3f1c5d07d53eb2c05
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.