# Metal

Metal kuantizasyonu, Apple Silicon (MPS) cihazlarında Hugging Face Hub üzerinde barındırılan Metal çekirdeklerini ([kernels-community/mlx-quantization-metal-kernels](https://huggingface.co/kernels-community/mlx-quantization-metal-kernels)) kullanarak afin kuantizasyon gerçekleştirir. Bu çekirdekler [MLX](https://github.com/ml-explore/mlx) çerçevesinden kaynaklanır ve [`kernels`](https://github.com/huggingface/kernels) kütüphanesi aracılığıyla derlenir.

Ağırlıklar, grup başına ölçek ve sapma değerleriyle birlikte `uint32` tensörlerine paketlenir ve ileri geçiş, birleştirilmiş dequantization + matmul Metal çekirdeğini (`affine_qmm_t`) kullanır. Bu, CPU'ya gidip gelme olmadan çıkarımı tamamen GPU üzerinde çalıştırırken bellek kullanımını düşük tutar.

Desteklenen bit genişlikleri **2, 4 ve 8**'dir. Grup boyutu yapılandırılabilir (varsayılan 64).

## Gereksinimler

- MPS desteğine sahip Apple Silicon Mac (M1 / M2 / M3 / M4)
- `kernels` paketi:

```bash
pip install kernels
```

Metal çekirdekleri, ilk kullanımda Hub'dan otomatik olarak indirilir — manuel derleme gerekmez.

## Uygulama sırasında kuantizasyon

Herhangi bir modeli yükleyin ve [MetalConfig](/docs/transformers/main/tr/main_classes/quantization#transformers.MetalConfig) geçirerek yükleme sırasında onu kuantize edin. Uygun tüm `nn.Linear` katmanları, kuantize edilmiş versiyonlarıyla değiştirilir.

```python
from transformers import AutoModelForCausalLM, AutoTokenizer, MetalConfig

quantization_config = MetalConfig(bits=4, group_size=64)
model = AutoModelForCausalLM.from_pretrained(
    "meta-llama/Llama-3.2-1B",
    device_map="mps",
    quantization_config=quantization_config,
)

tokenizer = AutoTokenizer.from_pretrained("meta-llama/Llama-3.2-1B")
inputs = tokenizer("Apple Silicon is", return_tensors="pt").to("mps")
output = model.generate(**inputs, max_new_tokens=50)
print(tokenizer.decode(output[0], skip_special_tokens=True))
```

## Önceden niceliklendirilmiş bir model yükleyin

Eğer bir checkpoint zaten quantize edilmiş ağırlıklar içeriyorsa (`weight` paketlenmiş uint32 olarak, `scales`, `qbiases`), bunlar doğrudan yüklenir — yeniden quantize etmeye gerek yoktur.

```python
from transformers import AutoModelForCausalLM, MetalConfig

model = AutoModelForCausalLM.from_pretrained(
    "your-org/model-metal-4bit",
    device_map="mps",
)
```

## Dequantize

MPS bulunmayan makinelerde, önceden kuantize edilmiş bir checkpoint, modelin CPU veya CUDA üzerinde kullanılabilir kalması için otomatik olarak float'a dekuantize edilir. Bu davranışı açıkça da zorlayabilirsiniz:

```python
from transformers import AutoModelForCausalLM, MetalConfig

config = MetalConfig(dequantize=True)
model = AutoModelForCausalLM.from_pretrained(
    "your-org/model-metal-4bit",
    quantization_config=config,
    device_map="cpu",
)
```

## Katmanları hariç tut

Belirli katmanlar (ör. `lm_head`), `modules_to_not_convert` aracılığıyla kuantizasyondan hariç tutulabilir:

```python
config = MetalConfig(bits=4, group_size=64, modules_to_not_convert=["lm_head"])
```

## Yapılandırma seçenekleri

| Parametre | Varsayılan | Açıklama |
|---|---|---|
| `bits` | `4` | Ağırlık kuantizasyonu için bit genişliği (2, 4 veya 8) |
| `group_size` | `64` | Kantizasyon grubu başına öğe sayısı |
| `modules_to_not_convert` | `None` | Tam hassasiyette tutulacak modül adlarının listesi |
| `dequantize` | `False` | Float'a zorla dekuantizasyon (MPS olmayan cihazlar için) |

