Transformers documentation
Modellerin yüklenmesi
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() metodu gereklidir.
Hugging Face Hub'da saklanan bir modelin ağırlıklarını ve yapılandırmasını indirmek ve yüklemek için from_pretrained() çağrın.
from_pretrained() yöntemi, mevcut olduklarında safetensors dosya biçiminde saklanan ağırlıkları yükler. Geleneksel olarak PyTorch model ağırlıkları, güvensiz olduğu bilinen pickle aracıyla seri hale getirilir. Safetensor dosyaları daha güvenlidir ve daha hızlı yüklenir.
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 onu oluşturur. Bu noktada, anlamlı sonuçlar üretmek için eğitilmesi gereken rastgele ağırlıklara sahip bir modele sahip olursunuz.
Mimari, modelin iskeletini; kontrol noktası (checkpoint) ise belirli bir mimari için modelin ağırlıklarını ifade eder. Örneğin, BERT bir mimariyken google-bert/bert-base-uncased bir kontrol noktasıdır. Model terimi, mimari ve kontrol noktası ile eş anlamlı olarak kullanılır.
Yüklenebilecek iki genel model türü vardır:
- AutoModel veya LlamaModel gibi, gizli durumları (hidden states) çıktı olarak veren sade bir model.
- Belirli görevleri gerçekleştirmek için AutoModelForCausalLM veya 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() fonksiyonunu çağırarak yapılır.
İki model sınıfı vardır: AutoModel sınıfı ve modele özgü bir sınıf.
AutoModel 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.
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.
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 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.
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:
- rastgele ağırlıklara sahip bir model oluşturma
- önceden eğitilmiş ağırlıkları yükleme
- 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, parçalı denetim noktaları, Accelerate'in Big Model Inference ö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(), 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() içinde max_shard_size kullanın.
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 kılavuzuna başvurun.
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.
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.
index["metadata"]
{'total_size': 28966928384}weight_map, her parametreyi ilgili shard dosyasına eşler.
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ı
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(), Accelerate'in Big Model Inference özelliğiyle güçlendirildi.
Big Model Inference, PyTorch meta cihazında bir model iskeleti oluşturur. Meta cihazı gerçek veri saklamaz, yalnızca üst veriyi (metadata) 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.
Cihaz yerleşimi hakkında daha fazla bilgi için Cihaz haritası tasarımı 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) taşını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 değerini "auto" olarak ayarlayın.
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. Modelin tüm parametrelerini bir cihaza eşlemesi gerekir, ancak bir katmanın tamamı aynı cihazda bulunuyorsa, alt modüllerin 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.
device_map = {"model.layers.1": 0, "model.layers.14": 1, "model.layers.31": "cpu", "lm_head": "disk"}
model.hf_device_mapDisk'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, diske taşınan ağırlıkları bu dizinde saklar.
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 kısımları diske gönderir. Aşağıdaki örnekte GPU 10GB, CPU ise 30GB ile sınırlandırılır; bu nedenle kalan ağırlıklar offload_folder içinde tutulur.
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.
model = AutoModelForCausalLM.from_pretrained(
"google/gemma-7b",
device_map="auto",
max_memory={},
offload_folder="./offload",
)Disk offloading, bellek ile hız arasında bir ödünleşimdir. Her ileri geçişte ağırlıkları diskten okumak, CPU veya GPU belleğinden okumaya kıyasla daha yavaştır. Tam disk offloading için
accelerate>1.14.0gereklidir.
Model veri türü
dtype argümanı, model ağırlıklarının oluşturulmasında kullanılan PyTorch dtype değerini 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 yoksa, Transformers checkpoint'teki ilk kayan noktalı ağırlığın dtype değerini kullanır.
Belirli bir dtype geçirerek varsayılanı geçersiz kılın.
import torch
from transformers import AutoModelForCausalLM
# specific dtype
model = AutoModelForCausalLM.from_pretrained("google/gemma-3-1b-it", dtype=torch.float16)AutoConfig, sıfırdan örneklenen modeller için dtype parametresini de kabul eder.
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() ile yüklenir. Fark, modelleme kodunun Transformers'tan gelmeyişidir.
Özel bir model yüklerken ekstra önlem alın. Hub her depo için zararlı yazılım taraması 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() içinde trust_remote_code=True değerini ayarlayın.
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şinden kopyalanabilir.
commit_hash = "ed94a7c6247d8aedce4647f00f20de6875b5b292"
model = AutoModelForImageClassification.from_pretrained(
"sgugger/custom-resnet50d", trust_remote_code=True, revision=commit_hash
)Daha fazla bilgi için Özel modeller kılavuzuna başvurun.
Update on GitHub