# İnce tanimli FP8

İnce tanimli FP8 kuantizasyonu, ağırlıkları ve aktivasyonları fp8'e kuantize eder.

- Ağırlıklar, her 2B blok için 8-bite indirgenir (`weight_block_size=(128, 128)`).
- Aktivasyonlar, her token için grup başına 8-bite kuantize edilir. Grup değeri, giriş kanalındaki ağırlıklarla eşleşir (varsayılan olarak 128).

FP8 kuantizasyonu, [DeepSeek-V3](https://hf.co/papers/2412.19437) ve DeepSeek-R1 için desteği mümkün kılar.

    

> [!TIP]
> Compute Capability>=9 (H100) olan bir GPU'ya ve GPU'nuzun CUDA sürümüyle uyumlu bir PyTorch sürümüne ihtiyacınız vardır.

Accelerate'ı yükleyin ve PyTorch'un en son sürümüne yükseltin.

```bash
pip install --upgrade accelerate torch
```

Bir [FineGrainedFP8Config](/docs/transformers/main/tr/main_classes/quantization#transformers.FineGrainedFP8Config) sınıfı oluşturun ve onu [from_pretrained()](/docs/transformers/main/tr/main_classes/model#transformers.PreTrainedModel.from_pretrained) fonksiyonuna geçirerek modelin kuantizasyonunu yapın. Ağırlıklar, saklandıkları gerçek veri türünden bağımsız olarak varsayılan olarak tam hassasiyette (`torch.float32`) yüklenir. En bellek-verimli veri türünü otomatik olarak yüklemek için, ağırlıkları modelin `config.json` dosyasında tanımlanan veri türünde yüklemek üzere `dtype="auto"` parametresini ayarlayın.

```py
from transformers import FineGrainedFP8Config, AutoModelForCausalLM, AutoTokenizer

model_name = "meta-llama/Meta-Llama-3-8B"
quantization_config = FineGrainedFP8Config()
quantized_model = AutoModelForCausalLM.from_pretrained(model_name, dtype="auto", device_map="auto", quantization_config=quantization_config)

tokenizer = AutoTokenizer.from_pretrained(model_name)
input_text = "What are we having for dinner?"
input_ids = tokenizer(input_text, return_tensors="pt").to(quantized_model.device.type)

output = quantized_model.generate(**input_ids, max_new_tokens=10)
print(tokenizer.decode(output[0], skip_special_tokens=True))
```

Kantize edilmiş modeli kaydetmek için [save_pretrained()](/docs/transformers/main/tr/main_classes/model#transformers.PreTrainedModel.save_pretrained) kullanın ve [from_pretrained()](/docs/transformers/main/tr/main_classes/model#transformers.PreTrainedModel.from_pretrained) ile yeniden yükleyin.

```py
quant_path = "/path/to/save/quantized/model"
quantized_model.save_pretrained(quant_path)
model = AutoModelForCausalLM.from_pretrained(quant_path, device_map="auto")
```

## DeepGEMM hızlı yolu

Hopper (SM90+) ve Blackwell (SM100+) GPU'larında, `weight_block_size=(128, 128)` ve `activation_scheme="dynamic"` ayarları yapıldığında her FP8 lineer katman otomatik olarak [kernels-community/deep-gemm](https://huggingface.co/kernels-community/deep-gemm) deposundaki [DeepGEMM](https://github.com/deepseek-ai/DeepGEMM) çekirdeklerine yönlendirilir. DeepGEMM, Triton yedek çözümünden 3-6 kat daha hızlıdır. Bunu etkinleştirmek için [kernels](https://github.com/huggingface/kernels) paketini yükleyin veya güncelleyin.

```bash
pip install -U kernels
```

DeepGEMM, çekirdeklerini sistemin `nvcc` ile JIT derler, bu nedenle tam bir CUDA aracıkiti (toolkit) kurulmuş olmalıdır. Yalnızca çalışma zamanı kurulumu (`nvcc` olmadan CUDA kütüphaneleri) çalışmaz. Minimum aracıkiti sürümü donanıma bağlıdır: Hopper (SM90) için 12.3 veya üzeri, Blackwell (SM100) için 12.9 veya üzeri.

Transformers, araç setini `CUDA_HOME`, ardından `CUDA_PATH`, ardından `PATH` üzerindeki `nvcc` ve en son `/usr/local/cuda` konumunu kontrol ederek bulur. `nvcc` bulunamıyorsa `CUDA_HOME` değerini araç setinin kök dizinine ayarlayın.

Çekirdek yüklenemezse (`kernels` eksik, GPU desteklenmiyor, CUDA araç seti yok veya `nvcc` gerekli sürümden eski), Transformers bir kez uyarı kaydeder ve Triton finegrained-fp8 çekirdeğine geri döner. Statik aktivasyon kuantizasyonu her zaman Triton yolunda kalır.

DeepGEMM kullanılabilir olsa bile Triton yedeğini zorlamak için `TRANSFORMERS_DISABLE_DEEPGEMM_LINEAR=1` değerini ayarlayın. Bu, yalnızca FP8 lineer dağıtımını etkiler ve `"deepgemm"` uzman arka ucuna dokunmaz; bu arka uç [set_experts_implementation()](/docs/transformers/main/tr/main_classes/model#transformers.PreTrainedModel.set_experts_implementation) ile değiştirilir.

MoE uzmanları için DeepGEMM yolu isteğe bağlıdır. Uzman matmullarını DeepGEMM üzerinden yönlendirmek için yükleme sırasında `experts_implementation="deepgemm"` (veya Blackwell'de `"deepgemm_megamoe"`) parametresini iletin. Tüm seçenekler için [Uzman arka uçları](../experts_interface) kılavuzuna bakın.

## UE8M0 ölçek biçimi

DeepSeek V4 tarzı checkpoint'ler, FP8 ağırlık ölçeklerini `float32` yerine paketlenmiş `float8_e8m0fnu` biçiminde saklar. Bu checkpoint'ler önceden kuantize edilmiştir ve kuantizasyon yapılandırmalarında `scale_fmt="ue8m0"` değerini ayarlar. Hem DeepGEMM hem de Triton çekirdekleri UE8M0 ölçeklerini okuduğu için bu checkpoint'ler her iki yolda da çalışır.

Blackwell (SM100+) üzerinde DeepGEMM uzman çekirdekleri yalnızca UE8M0 ölçeklerini destekler. Düz `float32` ölçeklere (`scale_fmt="float"`) sahip bir checkpoint `ValueError` hatası oluşturur. Bunun yerine `scale_fmt="ue8m0"` checkpoint'i kullanın veya uzmanları, `float32` ölçeklerini doğrudan destekleyen `grouped_mm` veya `batched_mm` ile çalıştırın. Hopper (SM90+), dönüşüm gerektirmeden DeepGEMM yolunda `float32` ölçeklerini destekler. Uzman backend seçenekleri için [Uzman backend'leri](../experts_interface) kılavuzuna bakın.

