# HQQ

[Half-Quadratic Quantization (HQQ)](https://github.com/mobiusml/hqq/), 8, 4, 3, 2 ve hatta 1-bit için hızlı, anlık (on-the-fly) kuantizasyonu destekler. Kalibrasyon verisi gerektirmez ve herhangi bir model modalitesiyle (LLM'ler, görü vb.) uyumludur.

HQQ, [PEFT](https://huggingface.co/docs/peft) ile ince ayarı daha fazla destekler ve daha hızlı çıkarım ve eğitim için [torch.compile](https://pytorch.org/tutorials/intermediate/torch_compile_tutorial.html) ile tam uyumludur.

En güncel sürümü almak ve bir cuda cihazı kullanıyorsanız ilgili CUDA çekirdeklerini derlemek için HQQ'yi aşağıdaki komutla yükleyin. Ayrıca saf pytorch uygulamasıyla Intel XPU'yu da destekler.

```bash
pip install hqq
```

Modeldeki tüm doğrusal katmanları aynı kuantizasyon yapılandırmasıyla değiştirmeyi veya belirli doğrusal katmanlar için belirli bir kuantizasyon yapılandırması atamayı seçebilirsiniz.

Bir [HqqConfig](/docs/transformers/main/tr/main_classes/quantization#transformers.HqqConfig) oluşturarak ve modelin tüm doğrusal katmanları ([torch.nn.Linear](https://pytorch.org/docs/stable/generated/torch.nn.Linear.html)) için `nbits` ile `group_size` değerlerini belirleyerek modeli kuantize edin.

``` py
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer, HqqConfig

quant_config = HqqConfig(nbits=8, group_size=64)
model = AutoModelForCausalLM.from_pretrained(
    "meta-llama/Llama-3.1-8B", 
    dtype=torch.float16, 
    device_map="auto", 
    quantization_config=quant_config
)
```

Doğrusal katmanları kuantize etmek için `nbits` ve `group_size` değerlerini belirten bir sözlük oluşturarak modeli kuantize edin. Bu değerleri [HqqConfig](/docs/transformers/main/tr/main_classes/quantization#transformers.HqqConfig) nesnesine iletin ve hangi katmanların kuantize edileceğini yapılandırmada belirtin. Bu yaklaşım, karışık uzman (MoE) modellerini kuantize etmek için özellikle faydalıdır; çünkü bu modeller, daha düşük kuantizasyon ayarlarından daha az etkilenir.

``` py
q4_config = {'nbits':4, 'group_size':64}
q3_config = {'nbits':3, 'group_size':32}
quant_config  = HqqConfig(dynamic_config={
  'self_attn.q_proj':q4_config,
  'self_attn.k_proj':q4_config,
  'self_attn.v_proj':q4_config,
  'self_attn.o_proj':q4_config,

  'mlp.gate_proj':q3_config,
  'mlp.up_proj'  :q3_config,
  'mlp.down_proj':q3_config,
})

model = transformers.AutoModelForCausalLM.from_pretrained(
    "meta-llama/Llama-3.1-8B", 
    dtype=torch.float16, 
    device_map="auto", 
    quantization_config=quant_config
)
```

## Arka Uçlar

HQQ, saf PyTorch ve özel dequantization CUDA çekirdekleri dahil olmak üzere çeşitli backend'leri destekler. Bu backend'ler, eski GPU'lar ve PEFT/QLoRA eğitimi için uygundur.

```py
from hqq.core.quantize import *

HQQLinear.set_backend(HQQBackend.PYTORCH)
```

Daha hızlı çıkarım için HQQ, bir modelin kuantize edilmesinin ardından 4-bit füzyonlu çekirdekleri (torchao ve Marlin) destekler. Bunlar, tek bir 4090 üzerinde saniyede 200 token'a kadar hızlara ulaşabilir. Aşağıdaki örnek, torchao_int4 arka ucunun etkinleştirilmesini göstermektedir.

```py
from hqq.utils.patching import prepare_for_inference

prepare_for_inference("model", backend="torchao_int4")
```

Daha fazla ayrıntı için [Backend](https://github.com/mobiusml/hqq/#backend) kılavuzuna başvurun.

## Kaynaklar

HQQ hakkında daha fazla ayrıntı için [Half-Quadratic Quantization of Large Machine Learning Models](https://mobiusml.github.io/hqq_blog/) blog yazısını okuyun.

