Buckets:

mishig's picture
|
download
raw
6.09 kB
# SDNQ
[SDNQ](https://github.com/Disty0/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.
```bash
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.
```python
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")
```
> [!TIP]
> 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=1` değ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 zaten `sdnq`'yi içe aktarır ve kaydeder. Varsayılan olarak kapalıdır, böylece SDNQ kullanmayan boru hatları asla `sdnq`'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](/docs/diffusers/main/tr/api/quantization#diffusers.SDNQConfig) geçirin. Belirli pipeline bileşenlerini nicelleştirmek için [PipelineQuantizationConfig](/docs/diffusers/main/tr/api/quantization#diffusers.PipelineQuantizationConfig) kullanın.
```python
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.
```python
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`](https://github.com/Disty0/sdnq) 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](https://github.com/vladmandic/sdnext/wiki/SDNQ-Quantization#dynamic-loss-threshold)'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](https://github.com/triton-lang/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.
```python
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](../optimization/memory#group-offloading) ile birlikte dahil olmak üzere ek hızlandırmalar için [torch.compile](../optimization/fp16#torchcompile) ile uyumludur.
```python
transformer.compile(fullgraph=True)
```
## Kantize edilmiş bir modeli kaydet
Kantize modeller `save_pretrained` ile serialize edilebilir ve `quantization_config` olmadan yeniden yüklenebilir.
```python
transformer.save_pretrained("z-image-turbo-sdnq-int8")
```
## Kaynaklar
- [SDNQ deposu](https://github.com/Disty0/sdnq)
- [Hub'daki önceden kuantize edilmiş SDNQ modelleri](https://huggingface.co/models?search=sdnq)

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.