Accelerate documentation

Hızlı Tur

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v1.15.0).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Hızlı Tur

Eğitim ortamınıza (torchrun, DeepSpeed vb.) ve kullanılabilir donanıma bağlı olarak kodunuzu başlatıp çalıştırmanın birçok yolu vardır. Accelerate, farklı dağıtık kurulumlarda başlatma ve eğitim için birleşik bir arayüz sunarak, kodunuzu bu farklı kurulumlara uyarlamaya ilişkin inceliklerle uğraşmak yerine PyTorch eğitim kodunuza odaklanmanızı sağlar. Bu sayede, GPU ve TPU gibi donanımlarla dağıtık kurulumlarda eğitim ve çıkarım için PyTorch kodunuzu kolayca ölçeklendirebilirsiniz. Accelerate, genellikle belleğe sığmayan gerçekten büyük modelleri yükleyip çıkarım yapmayı daha erişilebilir kılan Big Model Inference özelliğini de sunar.

Bu hızlı tur, Accelerate'in üç ana özelliğini tanıtır:

  • dağıtık eğitim betikleri için birleşik bir komut satırı başlatma arayüzü
  • Farklı dağıtık kurulumlarda çalışacak şekilde PyTorch eğitim kodunu uyarlamak için bir eğitim kütüphanesi
  • Büyük Model Çıkarımı

Birleşik başlatma arayüzü

Accelerate, accelerate config komutundan üretilen birleşik bir yapılandırma dosyası aracılığıyla, herhangi bir dağıtık eğitim çerçevesi (DeepSpeed, FSDP vb.) için uygun yapılandırma değerlerini otomatik olarak seçer. SLURM kullanıyorsanız gibi belirli durumlarda faydalı olabileceğinden, yapılandırma değerlerini komut satırına açıkça iletebilirsiniz.

Ancak çoğu durumda, Accelerate'in eğitim kurulumunuz hakkında bilgi edinmesine yardımcı olmak için her zaman önce accelerate config komutunu çalıştırmalısınız.

accelerate config

accelerate config komutu, Accelerate önbellek klasöründe varsayılan bir default_config.yaml dosyası oluşturur ve kaydeder. Bu dosya, eğitim ortamınızın yapılandırmasını saklar ve Accelerate’in eğitim betiğinizi makinenize göre doğru şekilde başlatmasına yardımcı olur.

Ortamınızı yapılandırdıktan sonra, dağıtık ortamı test etmek için kısa bir betik başlatan accelerate test komutuyla kurulumunuzu test edebilirsiniz.

accelerate test

Yapılandırma dosyası, önbellek gibi varsayılan olmayan bir konumda kaydedildiyse, konumunu belirtmek için --config_file bayrağını accelerate test veya accelerate launch komutuna ekleyin.

Ortamınız hazır olduğunda, eğitim betiğinizi accelerate launch ile başlatın!

accelerate launch path_to_script.py --args_for_the_script

Daha fazla bilgi edinmek için, betiklerinizi başlatma hakkında daha fazla bilgi için Dağıtık kodu başlatma eğitimine göz atın.

Ayrıca, çalıştırabileceğiniz çeşitli kurulumlar için bir dizi hazır minimal örnek yapılandırma sunan bir yapılandırma zürafası da bulunmaktadır.

Eğitim kodunu uyarla

Accelerate'in bir sonraki ana özelliği, PyTorch kodunuzu farklı dağıtık kurulumlarda çalışacak şekilde uyarlayan Accelerator sınıfıdır.

Çoklu GPU veya TPU üzerinde çalışabilmesini sağlamak için eğitim scriptinize yalnızca birkaç satır kod eklemeniz yeterlidir.

+ from accelerate import Accelerator
+ accelerator = Accelerator()

+ device = accelerator.device
+ model, optimizer, training_dataloader, scheduler = accelerator.prepare(
+     model, optimizer, training_dataloader, scheduler
+ )

  for batch in training_dataloader:
      optimizer.zero_grad()
      inputs, targets = batch
-     inputs = inputs.to(device)
-     targets = targets.to(device)
      outputs = model(inputs)
      loss = loss_function(outputs, targets)
+     accelerator.backward(loss)
      optimizer.step()
      scheduler.step()
  1. Eğitim betiğinizin başında Accelerator sınıfını içe aktarın ve örnekleyin. Accelerator sınıfı, dağıtık eğitim için gerekli her şeyi başlatır ve kodun nasıl başlatıldığına dayanarak eğitim ortamınızı (GPU'lu tek bir makine, birden fazla GPU'lu bir makine, birden fazla GPU'lu birden fazla makine veya bir TPU vb.) otomatik olarak algılar.
from accelerate import Accelerator

accelerator = Accelerator()
  1. Model ve giriş verileriniz üzerindeki .cuda() gibi çağrıları kaldırın. Accelerator sınıfı bu nesneleri sizin için uygun cihaza otomatik olarak yerleştirir.

Bu adım isteğe bağlıdır ancak Accelerate'in cihaz yerleşimini yönetmesine izin vermek en iyi uygulama olarak kabul edilir. Accelerator'u başlatırken device_placement=False parametresini geçirerek otomatik cihaz yerleşimini devre dışı bırakabilirsiniz. Nesneleri .to(device) ile belirli bir cihaza yerleştirmek istiyorsanız, bunun yerine accelerator.device kullanmanızdan emin olun. Örneğin, bir modeli accelerator.device üzerine yerleştirmeden önce bir optimizör oluşturursanız, eğitim bir TPU üzerinde başarısız olur.

Accelerate, otomatik cihaz yerleşimi için varsayılan olarak engellenmeyen aktarımları kullanmaz; bu durum, istenmeyen CUDA senkronizasyonlarına yol açabilir. Accelerator'u başlatırken dataloader_config olarak non_blocking=True ayarlı bir DataLoaderConfiguration geçirerek engellenmeyen aktarımları etkinleştirebilirsiniz. Her zamanki gibi, engellenmeyen aktarımlar yalnızca dataloader'da da pin_memory=True ayarlıysa çalışır. GPU'dan CPU'ya engellenmeyen aktarımların kullanılmasının, CPU işlemlerinin hazır olmayan tensörler üzerinde yapılmasına neden olması durumunda hatalı sonuçlara yol açabileceğine dikkat edin.

device = accelerator.device
  1. Eğitim için tüm ilgili PyTorch nesnelerini (optimizer, model, dataloader(lar), learning rate scheduler) oluşturuldukları anda prepare() metoduna iletin. Bu yöntem, modeli dağıtık kurulumunuz için optimize edilmiş bir kapsayıcıya sarar, Accelerate'in optimizer ve scheduler sürümlerini kullanır ve dataloader'ınızın GPU'lar veya TPU'lar arasında dağıtılması için shard edilmiş bir sürümünü oluşturur.
model, optimizer, train_dataloader, lr_scheduler = accelerator.prepare(
    model, optimizer, train_dataloader, lr_scheduler
)
  1. Eğitim kurulumunuz için doğru backward() yöntemini kullanmak üzere loss.backward() ifadesini backward() ile değiştirin.
accelerator.backward(loss)

Accelerate'in kodunuzu nasıl uyarladığına dair daha fazla ayrıntı öğrenmek için Accelerate'in iç mekanizmaları rehberini okuyun.

Dağıtık değerlendirme

Dağıtık değerlendirme yapmak için doğrulama veri yükleyicinizi prepare() yöntemine iletin:

validation_dataloader = accelerator.prepare(validation_dataloader)

Dağıtık kurulumunuzdaki her cihaz yalnızca değerlendirme verisinin bir kısmını alır; bu nedenle tahminlerinizi gather_for_metrics() yöntemiyle bir arada gruplamalısınız. Bu yöntem, tüm tensörlerin her işlemde aynı boyutta olmasını gerektirir. Tensörleriniz her işlemde farklı boyutlarda ise (örneğin bir partide dinamik olarak maksimum uzunluğa dolgu yapıldığında), tensörünüzü pad_across_processes() yöntemiyle işlemler arası en büyük boyuta doldurmalısınız. Tensörlerin 1B olması gerektiğini ve tensörlerin birinci boyut boyunca birleştirildiğini unutmayın.

for inputs, targets in validation_dataloader:
    predictions = model(inputs)
    # Gather all predictions and targets
    all_predictions, all_targets = accelerator.gather_for_metrics((predictions, targets))
    # Example of use with a *Datasets.Metric*
    metric.add_batch(all_predictions, all_targets)

Daha karmaşık durumlar için (ör. 2D tensörler, tensörleri birleştirmek istememe, 3D tensörlerden oluşan sözlükler) gather_for_metrics içinde use_gather_object=True parametresini geçebilirsiniz. Bu, toplanan nesnelerin listesini döndürür. GPU tensörleriyle kullanımının iyi desteklenmediğini ve verimsiz olduğunu unutmayın.

Bir veri setinin sonundaki veriler, bir partinin tüm işçiler arasında eşit olarak bölünebilmesi için yinelenmiş olabilir. gather_for_metrics() yöntemi, daha doğru bir metrik hesaplamak için yinelenen verileri otomatik olarak kaldırır.

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

Accelerate’in Big Model Inference özelliği, genellikle belleğe sığmayan büyük modelleri çıkarım için yüklemek üzere iki ana işlev sunar: init_empty_weights() ve load_checkpoint_and_dispatch().

Big Model Inference'in kaputunun altında nasıl çalıştığını daha iyi anlamak için Büyük modeller için çıkarım işleme kılavuzuna göz atın.

Boş ağırlık başlatma

init_empty_weights() bağlam yöneticisi, bir model iskeleti oluşturarak ve parametreler oluşturuldukça PyTorch’un meta cihazına taşıyıp yerleştirerek herhangi bir boyuttaki modelleri başlatır. Bu sayede tüm ağırlıklar anında yüklenmez ve bir anda belleğe yalnızca modelin küçük bir kısmı yüklenir.

Örneğin, boş bir Mixtral-8x7B modelini yüklemek, modelleri ve ağırlıkları CPU üzerinde tamamen yüklemekten çok daha az bellek gerektirir.

from accelerate import init_empty_weights
from transformers import AutoConfig, AutoModelForCausalLM

config = AutoConfig.from_pretrained("mistralai/Mixtral-8x7B-Instruct-v0.1")
with init_empty_weights():
    model = AutoModelForCausalLM.from_config(config)

Ağırlıkları yükle ve dağıt

load_checkpoint_and_dispatch() işlevi, tam veya parçalı denetim noktalarını boş modele yükler ve ağırlıkları tüm kullanılabilir cihazlar arasında otomatik olarak dağıtır.

device_map parametresi, her model katmanının nereye yerleştirileceğini belirler ve "auto" belirtildiğinde katmanlar önce GPU’ya, ardından CPU’ya ve hâlâ yeterli bellek yoksa bellek eşlemeli tensörler olarak sabit diske yerleştirilir. Cihazlar arasında bölünmemesi gereken modülleri belirtmek için no_split_module_classes parametresini kullanın (genellikle bunlar, artımsal bağlantıya sahip olanlardır).

from accelerate import load_checkpoint_and_dispatch

model_checkpoint = "your-local-model-folder"
model = load_checkpoint_and_dispatch(
    model, checkpoint=model_checkpoint, device_map="auto", no_split_module_classes=['Block']
)

Sonraki adımlar

Artık Accelerate'in ana özellikleriyle tanıştırıldığınıza göre, sonraki adımlarınız şunları içerebilir:

  • Accelerate'in kademeli bir tanıtımı için öğreticilere göz atın. Dağıtık eğitim ve kütüphaneye yeni başladıysanız bu özellikle faydalı olacaktır.
  • Belirli kullanım senaryolarında Accelerate'ı nasıl kullanacağınızı görmek için kılavuzlara göz atın.
  • Kavram kılavuzlarını okuyarak Accelerate'in iç işleyişine dair kavramsal anlayışınızı derinleştirin.
  • Hangi parametrelerin ve seçeneklerin mevcut olduğunu görmek için sınıfları ve komutları API referansında arayın.
Update on GitHub