# Modellerin yüklenmesi

Transformers, tek satır kodla kullanıma hazır birçok önceden eğitilmiş model sunar. Bunun için bir model sınıfı ve [from_pretrained()](/docs/transformers/main/tr/main_classes/model#transformers.PreTrainedModel.from_pretrained) metodu gereklidir.

Hugging Face [Hub](https://hf.co/models)'da saklanan bir modelin ağırlıklarını ve yapılandırmasını indirmek ve yüklemek için [from_pretrained()](/docs/transformers/main/tr/main_classes/model#transformers.PreTrainedModel.from_pretrained) çağrın.

> [!TIP]
> [from_pretrained()](/docs/transformers/main/tr/main_classes/model#transformers.PreTrainedModel.from_pretrained) yöntemi, mevcut olduklarında [safetensors](https://hf.co/docs/safetensors/index) dosya biçiminde saklanan ağırlıkları yükler. Geleneksel olarak PyTorch model ağırlıkları, güvensiz olduğu bilinen [pickle](https://docs.python.org/3/library/pickle.html) aracıyla seri hale getirilir. Safetensor dosyaları daha güvenlidir ve daha hızlı yüklenir.

```py
from transformers import AutoModelForCausalLM

model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-2-7b-hf", device_map="auto")
```

Bu kılavuz, modellerin nasıl yüklendiğini, bir modeli yüklemenin farklı yollarını, gerçekten büyük modellerde bellek sorunlarını nasıl aşacağınızı ve özel modellerin nasıl yükleneceğini açıklar.

## Modeller ve yapılandırmalar

Tüm modellerin, gizli katman sayısı, sözlük boyutu, aktivasyon fonksiyonu gibi belirli özniteliklere sahip bir `configuration.py` dosyası vardır. Ayrıca, her katmanın içinde gerçekleşen katmanları ve matematiksel işlemleri tanımlayan bir `modeling.py` dosyası da bulacaksınız. `modeling.py` dosyası, `configuration.py` içindeki model özniteliklerini alır ve modele göre inşa eder. Bu noktada, anlamlı sonuçlar üretmek için eğitilmesi gereken rastgele ağırlıklara sahip bir modele sahip olursunuz.

> [!TIP]
> *Mimari*, modelin iskeletini ifade ederken *kontrol noktası*, belirli bir mimari için modelin ağırlıklarını ifade eder. Örneğin, [BERT](./model_doc/bert) bir mimariyken [google-bert/bert-base-uncased](https://huggingface.co/google-bert/bert-base-uncased) bir kontrol noktasıdır. *Model* teriminin, mimari ve kontrol noktası ile eş anlamlı olarak kullanıldığını göreceksiniz.

Yüklenebilecek iki genel model türü vardır:

1. [AutoModel](/docs/transformers/main/tr/model_doc/auto#transformers.AutoModel) veya [LlamaModel](/docs/transformers/main/tr/model_doc/llama2#transformers.LlamaModel) gibi, gizli durumları (hidden states) çıktı olarak veren sade bir model.
2. Belirli görevleri gerçekleştirmek için [AutoModelForCausalLM](/docs/transformers/main/tr/model_doc/auto#transformers.AutoModelForCausalLM) veya [LlamaForCausalLM](/docs/transformers/main/tr/model_doc/llama2#transformers.LlamaForCausalLM) gibi belirli bir *head* eklenmiş bir model.

## Model sınıfları

Önceden eğitilmiş bir model almak için ağırlıkları modele yüklemeniz gerekir. Bu, Hugging Face Hub'dan veya yerel bir dizinden ağırlıkları kabul eden [from_pretrained()](/docs/transformers/main/tr/main_classes/model#transformers.PreTrainedModel.from_pretrained) fonksiyonunu çağırarak yapılır.

İki model sınıfı vardır: [AutoModel](./model_doc/auto) sınıfı ve modele özgü bir sınıf.

[AutoModel](./model_doc/auto) sınıfı, mevcut modellerin çok sayıda olması nedeniyle tam model sınıf adını bilmek zorunda kalmadan bir mimariyi yüklemenin pratik bir yoludur. Yapılandırma dosyasına dayanarak doğru model sınıfını otomatik olarak seçer. Sadece kullanmak istediğiniz görevi ve kontrol noktasını bilmeniz yeterlidir.

Mimari, ilgili görev için destekleniyorsa, modeller veya görevler arasında kolayca geçiş yapın.

Örneğin, aynı model ayrı görevler için kullanılabilir.

```py
from transformers import AutoModelForCausalLM, AutoModelForSequenceClassification, AutoModelForQuestionAnswering

# use the same API for 3 different tasks
model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-2-7b-hf")
model = AutoModelForSequenceClassification.from_pretrained("meta-llama/Llama-2-7b-hf")
model = AutoModelForQuestionAnswering.from_pretrained("meta-llama/Llama-2-7b-hf")
```

Diğer durumlarda, bir görev için birkaç farklı modeli hızlıca denemek isteyebilirsiniz.

```py
from transformers import AutoModelForCausalLM

# use the same API to load 3 different models
model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-2-7b-hf")
model = AutoModelForCausalLM.from_pretrained("mistralai/Mistral-7B-v0.1")
model = AutoModelForCausalLM.from_pretrained("google/gemma-7b")
```

[AutoModel](./model_doc/auto) sınıfı, modele özgü sınıfların üzerine inşa edilir. Belirli bir görevi destekleyen tüm model sınıfları, ilgili `AutoModelFor` görev sınıfına eşlenir.

Hangi model sınıfını kullanmak istediğinizi zaten biliyorsanız, doğrudan modele özgü sınıfını kullanabilirsiniz.

```py
from transformers import LlamaModel, LlamaForCausalLM

model = LlamaForCausalLM.from_pretrained("meta-llama/Llama-2-7b-hf")
```

## Büyük modeller

Büyük önceden eğitilmiş modelleri yüklemek için çok fazla bellek gerekir. Yükleme süreci şunları içerir:

1. rastgele ağırlıklara sahip bir model oluşturma
2. önceden eğitilmiş ağırlıkları yükleme
3. model üzerinde ön eğitilmiş ağırlıkları konumlandırma

Model ağırlıklarının (rastgele ve önceden eğitilmiş) iki kopyasını barındırmak için yeterli belleğe sahip olmanız gerekir; bu, donanımınıza bağlı olarak mümkün olmayabilir. Dağıtık eğitim ortamlarında bu durum daha da zordur, çünkü her süreç bir önceden eğitilmiş model yükler.

Transformers, hızlı başlatma, bölünmüş denetim noktaları, Accelerate'in [Big Model Inference](https://hf.co/docs/accelerate/usage_guides/big_modeling) özelliği ve daha düşük bit veri türlerini destekleme yoluyla bu bellekle ilgili zorlukların bir kısmını azaltır.

### Parçalı denetim noktaları

[save_pretrained()](/docs/transformers/main/tr/main_classes/model#transformers.PreTrainedModel.save_pretrained), 50 GB'den büyük checkpoint'leri otomatik olarak parçalara ayırır. Bu, büyük modellerde parça sayısını düşük tutar ve dosya yönetimini basitleştirir.

Parametreler paralel olarak yüklenir ve tepe bellek yalnızca model boyutuna bağlıdır. Parçalama öncesinde maksimum checkpoint boyutunu ayarlamak için [save_pretrained()](/docs/transformers/main/tr/main_classes/model#transformers.PreTrainedModel.save_pretrained) içinde `max_shard_size` kullanın.

> [!NOTE]
> Dinamik ağırlık dönüşümü gerektiren modellerin bellek kullanımı, model boyutuna ve tek bir dönüşümdeki en büyük parametrelerin boyutuna bağlıdır. Bu durum genellikle, bellek kullanımının model boyutu ile bir katmandaki uzman sayısının toplamına eşit olduğu mixture-of-experts (MoE) modelleri için geçerlidir. Modellerin nasıl yüklendiğini öğrenmek için [dynamic weight loader](./weightconverter#fast-and-efficient-model-loading) kılavuzuna başvurun.

[save_pretrained()](/docs/transformers/main/tr/main_classes/model#transformers.PreTrainedModel.save_pretrained) ayrıca parametre adlarını shard dosyalarına eşleyen bir indeks dosyası oluşturur. İndeks, `metadata` ve `weight_map` olmak üzere iki anahtar içerir.

```py
import json
import os
import tempfile

with tempfile.TemporaryDirectory() as tmp_dir:
    model.save_pretrained(tmp_dir, max_shard_size="50GB")
    with open(os.path.join(tmp_dir, "model.safetensors.index.json"), "r") as f:
        index = json.load(f)

print(index.keys())
```

`metadata`, toplam model boyutunu saklar.

```py
index["metadata"]
{'total_size': 28966928384}
```

`weight_map`, her parametreyi ilgili shard dosyasına eşler.

```py
index["weight_map"]
{'lm_head.weight': 'model-00006-of-00006.safetensors',
 'model.embed_tokens.weight': 'model-00001-of-00006.safetensors',
 'model.layers.0.input_layernorm.weight': 'model-00001-of-00006.safetensors',
 'model.layers.0.mlp.down_proj.weight': 'model-00001-of-00006.safetensors',
 ...
}
```

### Büyük Model Çıkarımı

> [!TIP]
> Bu özelliği kullanmak için Accelerate v0.9.0 ve PyTorch v1.9.0 veya daha yeni bir sürümün yüklü olduğundan emin olun!

[from_pretrained()](/docs/transformers/main/tr/main_classes/model#transformers.PreTrainedModel.from_pretrained), Accelerate'in [Big Model Inference](https://hf.co/docs/accelerate/usage_guides/big_modeling) özelliğiyle güçlendirildi.

Big Model Inference, PyTorch [meta](https://pytorch.org/docs/main/meta.html) cihazında bir *model iskeleti* oluşturur. Meta cihazı gerçek veri saklamaz, yalnızca meta verileri tutar.

Rastgele başlatılmış ağırlıklar, bellekte aynı anda modelin iki kopyasını tutmaktan kaçınmak için yalnızca önceden eğitilmiş ağırlıklar yüklendiğinde oluşturulur. Maksimum bellek kullanımı yalnızca modelin boyutudur.

> [!TIP]
> Cihaz yerleşimi hakkında daha fazla bilgi için [Cihaz haritası tasarımı](https://hf.co/docs/accelerate/v0.33.0/en/concept_guides/big_model_inference#designing-a-device-map) bölümüne göz atın.

Big Model Inference'in ikinci özelliği, model iskeletinde ağırlıkların nasıl yüklendiği ve dağıtıldığıyla ilgilidir. Model ağırlıkları, en hızlı cihazdan (genellikle GPU) başlayarak tüm kullanılabilir cihazlara dağıtılır ve kalan ağırlıklar daha yavaş cihazlara (CPU ve sabit disk) aktarılır.

Her iki özelliğin bir arada kullanılması, büyük önceden eğitilmiş modeller için bellek kullanımını ve yükleme sürelerini azaltır.

Büyük Model Çıkarımını etkinleştirmek için [device_map](https://github.com/huggingface/transformers/blob/026a173a64372e9602a16523b8fae9de4b0ff428/src/transformers/modeling_utils.py#L3061) değerini `"auto"` olarak ayarlayın.

```py
from transformers import AutoModelForCausalLM

model = AutoModelForCausalLM.from_pretrained("google/gemma-7b", device_map="auto")
```

Ayrıca, `device_map` içinde katmanları bir cihaza manuel olarak atayabilirsiniz. Tüm model parametrelerini bir cihaza eşlemelidir, ancak bir katmanın tamamı aynı cihazda bulunuyorsa, katmanın tüm alt modüllerinin nereye gideceğini ayrıntılı olarak belirtmenize gerek yoktur.

Modelin cihazlar arasında nasıl dağıtıldığını görmek için `hf_device_map` özniteliğine erişin.

```py
device_map = {"model.layers.1": 0, "model.layers.14": 1, "model.layers.31": "cpu", "lm_head": "disk"}
model.hf_device_map
```

### Disk'e aktarma

Bir model, GPU'larınız ve CPU RAM'inizin toplam kapasitesinden büyükse, Big Model Inference kalan ağırlıkları diske taşır. Herhangi bir ağırlık `"disk"` değerine eşleniyorsa, `offload_folder` parametresini bir dizine ayarlayın; çünkü Transformers, taşınan ağırlıkları bu dizinde saklar.

```py
from transformers import AutoModelForCausalLM

model = AutoModelForCausalLM.from_pretrained(
    "google/gemma-7b",
    device_map="auto",
    offload_folder="./offload",
)
```

`max_memory` parametresini, her bir cihazın tuttuğu miktarı sınırlamak için kullanın. Transformers, cihazları hız sırasına göre doldurur ve sığmayan her şeyi diske gönderir. Aşağıdaki örnek, GPU'yu 10GB, CPU'yu ise 30GB ile sınırlar; bu nedenle kalan ağırlıklar `offload_folder` içinde tutulur.

```py
model = AutoModelForCausalLM.from_pretrained(
    "google/gemma-7b",
    device_map="auto",
    max_memory={0: "10GB", "cpu": "30GB"},
    offload_folder="./offload",
)
```

GPU veya CPU belleğinin kullanılamadığını belirtmek ve tüm modelin diske taşınmasını zorlamak için `max_memory={}` değerini ayarlayın.

```py
model = AutoModelForCausalLM.from_pretrained(
    "google/gemma-7b",
    device_map="auto",
    max_memory={},
    offload_folder="./offload",
)
```

> [!NOTE]
> Disk offloading, belleği hızla takas eder. Her ileri geçişte ağırlıkları diskten okumak, CPU veya GPU belleğinden okumaktan daha yavaştır. Tam disk offloading için `accelerate>1.14.0` gereklidir.

### Model veri türü

`dtype` argümanı, model ağırlıklarının oluşturulmasında kullanılan PyTorch [dtype](https://pytorch.org/docs/stable/tensor_attributes.html#torch.dtype)'ini kontrol eder. Varsayılan olarak Transformers, ağırlıkları `config.json` dosyasındaki `dtype` veya eski `torch_dtype` değeriyle yükler. `config.json` dosyasında bu değerlerden hiçbiri yer almıyorsa, Transformers checkpoint'teki ilk kayan noktalı sayı ağırlığının dtype'ünü kullanır.

Belirli bir dtype geçirerek varsayılanı geçersiz kılın.

```py
import torch
from transformers import AutoModelForCausalLM

# specific dtype
model = AutoModelForCausalLM.from_pretrained("google/gemma-3-1b-it", dtype=torch.float16)
```

[AutoConfig](/docs/transformers/main/tr/model_doc/auto#transformers.AutoConfig), sıfırdan örneklenen modeller için `dtype` parametresini de kabul eder.

```py
import torch
from transformers import AutoConfig, AutoModel

my_config = AutoConfig.from_pretrained("google/gemma-2b", dtype=torch.float16)
model = AutoModel.from_config(my_config)
```

## Özel modeller

Özel modeller, Transformers'ın yapılandırma ve modelleme sınıflarının üzerine inşa edilir, `AutoClass` API'sini destekler ve [from_pretrained()](/docs/transformers/main/tr/main_classes/model#transformers.PreTrainedModel.from_pretrained) ile yüklenir. Fark, modelleme kodunun Transformers'tan *gelmemesidir*.

Özel bir model yüklerken ekstra önlem alın. Hub her depo için [zararlı yazılım taraması](https://hf.co/docs/hub/security-malware#malware-scanning) içerir, ancak yine de kötü amaçlı kodun istemeden çalıştırılmasını önlemek için dikkatli olmalısınız.

Özel bir model yüklemek için [from_pretrained()](/docs/transformers/main/tr/main_classes/model#transformers.PreTrainedModel.from_pretrained) içinde `trust_remote_code=True` değerini ayarlayın.

```py
from transformers import AutoModelForImageClassification

model = AutoModelForImageClassification.from_pretrained("sgugger/custom-resnet50d", trust_remote_code=True)
```

Ek bir güvenlik katmanı olarak, değişmiş olabilecek model kodunun yüklenmesini önlemek için özel bir modeli belirli bir revizyondan yükleyin. Commit hash'i, modellerin [commit geçmişi](https://hf.co/sgugger/custom-resnet50d/commits/main)nden kopyalanabilir.

```py
commit_hash = "ed94a7c6247d8aedce4647f00f20de6875b5b292"
model = AutoModelForImageClassification.from_pretrained(
    "sgugger/custom-resnet50d", trust_remote_code=True, revision=commit_hash
)
```

Daha fazla bilgi için [Özel modeller](./custom_models) kılavuzuna başvurun.

