Accelerate documentation
Accelerate betiklerini başlatma
Accelerate betiklerini başlatma
Önceki öğreticide, mevcut eğitim betiğinizi Accelerate kullanacak şekilde nasıl değiştireceğinizi öğrendiniz. O kodun son sürümü aşağıda gösterilmektedir:
from accelerate import Accelerator
accelerator = Accelerator()
model, optimizer, training_dataloader, scheduler = accelerator.prepare(
model, optimizer, training_dataloader, scheduler
)
for batch in training_dataloader:
optimizer.zero_grad()
inputs, targets = batch
outputs = model(inputs)
loss = loss_function(outputs, targets)
accelerator.backward(loss)
optimizer.step()
scheduler.step()Peki bu kodu çalıştırıp ona özel olarak sunulan donanımı nasıl kullanırsınız?
Öncelikle, yukarıdaki kodu bir işlev olarak yeniden yazmalı ve bir betik olarak çağrılabilir hale getirmelisiniz. Örneğin:
from accelerate import Accelerator
+ def main():
accelerator = Accelerator()
model, optimizer, training_dataloader, scheduler = accelerator.prepare(
model, optimizer, training_dataloader, scheduler
)
for batch in training_dataloader:
optimizer.zero_grad()
inputs, targets = batch
outputs = model(inputs)
loss = loss_function(outputs, targets)
accelerator.backward(loss)
optimizer.step()
scheduler.step()
+ if __name__ == "__main__":
+ main()Ardından, accelerate launch ile başlatmanız gerekir.
accelerate launchkullanmadan önce ortamınızı istediğiniz şekilde yapılandırmak içinaccelerate configkomutunu çalıştırmanız önerilir. Aksi takdirde Accelerate, sistem kurulumunuza bağlı olarak çok temel varsayılanları kullanır.
accelerate launch kullanma
Accelerate, kodunuzu sisteminizde başlatmanıza yardımcı olmak için accelerate launch adında özel bir CLI komutuna sahiptir.
Bu komut, scriptinizi çeşitli platformlarda başlatmak için gereken tüm farklı komutları sarar; böylece her birinin ne olduğunu hatırlamanıza gerek kalmaz.
PyTorch'ta
torchrungibi betikleri kendiniz başlatma konusunda deneyimliyseniz, bunu yapmaya devam edebilirsiniz.accelerate launchkullanmak zorunlu değildir.
Betiklerinizi hızlı bir şekilde başlatmak için şunu kullanabilirsiniz:
accelerate launch {script_name.py} --arg1 --arg2 ...Sadece komutunuzun başına accelerate launch ekleyin ve ardından scriptinize ek argümanları ve parametreleri normal şekilde iletin!
Bu, çeşitli torch spawn yöntemlerini çalıştırdığı için, beklenen tüm ortam değişkenleri de burada değiştirilebilir.
Örneğin, accelerate launch tek bir GPU ile nasıl kullanılır:
# for cuda device:
CUDA_VISIBLE_DEVICES="0" accelerate launch {script_name.py} --arg1 --arg2 ...
# for xpu device:
ZE_AFFINITY_MASK="0" accelerate launch {script_name.py} --arg1 --arg2 ...Önce accelerate config çalıştırmadan accelerate launch kullanabilirsiniz ancak doğru yapılandırma parametrelerini manuel olarak iletmeniz gerekebilir.
Bu durumda Accelerate, sizin için bazı hiperparametre kararları alır; örneğin GPU'lar kullanılabilirse, karışık hassasiyet olmadan varsayılan olarak hepsini kullanır.
Tüm GPU'ları kullanıp karışık hassasiyet devre dışı bırakılarak eğitim yapmak için:
accelerate launch --multi_gpu {script_name.py} {--arg1} {--arg2} ...Veya kullanılacak GPU sayısını belirleyerek:
accelerate launch --num_processes=2 {script_name.py} {--arg1} {--arg2} ...Daha spesifik olmak için gerekli parametreleri kendiniz geçmelisiniz. Örneğin, aynı betiği karışık hassasiyet kullanarak iki GPU üzerinde başlatırken tüm uyarılardan kaçınmak için bunu yapabilirsiniz:
accelerate launch --multi_gpu --mixed_precision=fp16 --num_processes=2 {script_name.py} {--arg1} {--arg2} ...Geçirebileceğiniz parametrelerin tam listesi için şunu çalıştırın:
accelerate launch -h
Kodunuzda Accelerate kullanmıyorsanız bile, betiklerinizi başlatmak için başlatıcıyı (launcher) kullanmaya devam edebilirsiniz!
Bu farkın bir görselleştirmesi olarak, çoklu GPU üzerinde daha önceki accelerate launch komutu, torchrun ile aşağıdaki gibi görünürdü:
MIXED_PRECISION="fp16" torchrun --nproc_per_node=2 --nnodes=1 {script_name.py} {--arg1} {--arg2} ...Scriptinizi, diğer Python'a özgü başlatma davranışlarını geçme imkânı sağlayacak şekilde, accelerate.commands.launch modülünü bir Python modülü olarak kullanarak başlatabilirsiniz. Bunu yapmak için accelerate launch yerine accelerate.commands.launch kullanın:
python -m accelerate.commands.launch --num_processes=2 {script_name.py} {--arg1} {--arg2}Eğer betiği başka python bayraklarıyla çalıştırmak istiyorsanız, -m benzeri olarak bunları da iletebilirsiniz; örneğin aşağıdaki örnekte tamponlanmamış stdout ve stderr etkinleştirilmektedir:
python -u -m accelerate.commands.launch --num_processes=2 {script_name.py} {--arg1} {--arg2}Kodunuzu CPU üzerinde de çalıştırabilirsiniz! Bu, oyuncak modeller ve veri kümeleri üzerinde hata ayıklama ve test amaçları için faydalıdır.
accelerate launch --cpu {script_name.py} {--arg1} {--arg2}
Neden her zaman accelerate config kullanmalısınız
accelerate config komutunu her zaman çalıştırmanız neden bu kadar faydalıdır?
Daha önceki accelerate launch ve torchrun çağrılarını da hatırlayın.
Yapılandırma sonrasında, bu betiği gerekli parçalarla çalıştırmak için başka bir şey geçirmeden doğrudan accelerate launch kullanmanız yeterlidir:
accelerate launch {script_name.py} {--arg1} {--arg2} ...Özel Yapılandırmalar
Daha önce kısaca belirtildiği gibi, accelerate launch büyük ölçüde accelerate config komutuyla oluşturulan yapılandırmalar birleştirilerek kullanılmalıdır. Bu yapılandırmalar, Accelerate için önbellek klasörünüzdeki default_config.yaml dosyasına kaydedilir.
Bu önbellek klasörü (öncelik sırasına göre azalan düzende) şu konumdadır:
- Ortam değişkeninizin içeriği
HF_HOME,accelerateekiyle birlikte. - Eğer yoksa,
XDG_CACHE_HOMEortam değişkeninizin içeriği,huggingface/accelerateekiyle birlikte yeterlidir. - Eğer bu da yoksa,
~/.cache/huggingface/accelerateklasörü.
Birden çok yapılandırma için, özel yaml dosyasının konumuyla eşleştirilerek accelerate launch komutuna --config_file bayrağı geçirilebilir.
Tek bir makinede iki GPU için fp16 karışık hassasiyet kullanıldığında bir örnek yaml aşağıdaki gibi görünebilir:
compute_environment: LOCAL_MACHINE
deepspeed_config: {}
distributed_type: MULTI_GPU
fsdp_config: {}
machine_rank: 0
main_process_ip: null
main_process_port: null
main_training_function: main
mixed_precision: fp16
num_machines: 1
num_processes: 2
use_cpu: falseO özel yaml dosyasının konumundan bir betik başlatmak aşağıdaki gibidir:
accelerate launch --config_file {path/to/config/my_config_file.yaml} {script_name.py} {--arg1} {--arg2} ...Çok düğümlü eğitim
Accelerate ile çoklu düğüm eğitimi, torchrun ile çoklu düğüm eğitimine benzer. Çoklu düğüm eğitim çalıştırmalarını başlatmanın en basit yolu şudur:
- Kod tabanınızı ve verilerinizi tüm düğümlere kopyalayın. (veya bunları paylaşımlı bir dosya sistemine yerleştirin)
- Tüm düğümlerde Python paketlerinizi yapılandırın.
- Önce ana tek düğümde
accelerate configkomutunu çalıştırın. Düğüm sayısını belirttikten sonra, her düğümün sırasını (ana/baş düğüm için bu değer 0 olacaktır) ve ana süreç için IP adresi ile portu belirtmeniz istenecektir. Bu, işçi düğümlerin ana süreçle iletişim kurabilmesi için gereklidir. Ardından, komutu çalıştırmak zorunda kalmamak için bu yapılandırma dosyasını tüm düğümlerinize kopyalayabilir veya gönderebilir,machine_rankdeğerini 1, 2, 3 vb. olarak değiştirebilirsiniz (veyatorchrunile başlatma için doğrudan talimatlarını izleyebilirsiniz).
Bunu yaptıktan sonra, tüm düğümlerde accelerate launch (veya torchrun) komutunu çalıştırarak çoklu düğümlü eğitim çalıştırmanızı başlatabilirsiniz.
It is required that the command be run on all nodes for everything to start, not just running it from the main node. You can use something like SLURM or a different process executor to wrap around this requirement and call everything from a single command.
Daha iyi gecikme süresi için ana düğümünüzün genel IP'si yerine intranet IP'sini kullanmanız önerilir. Bu, ana düğümde
hostname -Ikomutunu çalıştırdığınızda gördüğünüz192.168.x.xveya172.x.x.xadresidir.
Çok düğüm eğitim hakkında daha iyi bir fikir edinmek için FSDP ile çok düğüm eğitimi örneğimize göz atın.
Update on GitHub