TorchDistributor ile dağıtılmış eğitim
Bu makalede, TorchDistributor kullanarak PyTorch ML modellerinde dağıtılmış eğitimin nasıl gerçekleştirildiği açıklanmaktadır.
TorchDistributor, PySpark'ta kullanıcıların Spark kümelerinde PyTorch ile dağıtılmış eğitim yapmalarına yardımcı olan açık kaynak bir modüldür, bu nedenle PyTorch eğitim işlerini Spark işleri olarak başlatmanıza olanak tanır. Altta, çalışanlar arasındaki ortamı ve iletişim kanallarını başlatır ve çalışan düğümleri arasında dağıtılmış eğitim çalıştırmak için CLI komutunu torch.distributed.run
kullanır.
TorchDistributor API'si aşağıdaki tabloda gösterilen yöntemleri destekler.
Yöntem ve imza | Açıklama |
---|---|
init(self, num_processes, local_mode, use_gpu) |
TorchDistributor'ın bir örneğini oluşturun. |
run(self, main, *args) |
Main bir işlevse çağırarak main(**kwargs) dağıtılmış eğitimi çalıştırır ve main bir dosya yoluysa CLI komutunu torchrun main *args çalıştırır. |
Gereksinimler
- Spark 3.4
- Databricks Runtime 13.0 ML veya üzeri
Not defterleri için geliştirme iş akışı
Model oluşturma ve eğitim işlemi tamamen yerel makinenizdeki bir not defterinden veya Databricks Not Defteri'nden gerçekleşirse, kodunuzu dağıtılmış eğitime hazır hale getirmek için yalnızca küçük değişiklikler yapmanız gerekir.
Tek düğümlü kod hazırlama: HuggingFace Trainer API'si gibi PyTorch, PyTorch Lightning veya PyTorch/PyTorch Lightning'i temel alan diğer çerçevelerle tek düğüm kodunu hazırlayın ve test edin.
Standart dağıtılmış eğitim için kod hazırlama: Tek işlem eğitiminizi dağıtılmış eğitime dönüştürmeniz gerekir. Bu dağıtılmış kodun, ile kullanabileceğiniz tek bir eğitim işlevi içinde yer almalarını sağlayın
TorchDistributor
.İçeri aktarmaları eğitim işlevi içinde taşıma: Eğitim işlevine gibi
import torch
gerekli içeri aktarmaları ekleyin. Bunu yaptığınızda sık karşılaşılan pickling hatalarından kaçınabilirsiniz. Ayrıca, modellerindevice_id
ve verilerin bağlanacağı veriler şunlar tarafından belirlenir:device_id = int(os.environ["LOCAL_RANK"])
Dağıtılmış eğitimi başlatma:
TorchDistributor
İstenen parametrelerle örneği oluşturup eğitimi başlatmak için çağrısı.run(*args)
yapın.
Aşağıda bir eğitim kodu örneği verilmiştir:
from pyspark.ml.torch.distributor import TorchDistributor
def train(learning_rate, use_gpu):
import torch
import torch.distributed as dist
import torch.nn.parallel.DistributedDataParallel as DDP
from torch.utils.data import DistributedSampler, DataLoader
backend = "nccl" if use_gpu else "gloo"
dist.init_process_group(backend)
device = int(os.environ["LOCAL_RANK"]) if use_gpu else "cpu"
model = DDP(createModel(), **kwargs)
sampler = DistributedSampler(dataset)
loader = DataLoader(dataset, sampler=sampler)
output = train(model, loader, learning_rate)
dist.cleanup()
return output
distributor = TorchDistributor(num_processes=2, local_mode=False, use_gpu=True)
distributor.run(train, 1e-3, True)
Dış depolardan eğitimi geçirme
Dış depoda depolanan mevcut bir dağıtılmış eğitim yordamınız varsa, aşağıdakileri yaparak Azure Databricks'e kolayca geçiş yapabilirsiniz:
- Depoyu içeri aktarma: Dış depoyu Databricks Git klasörü olarak içeri aktarın.
- Yeni not defteri oluşturma Depo içinde yeni bir Azure Databricks Not Defteri başlatın.
- Dağıtılmış eğitimi başlatma Not defteri hücresinde aşağıdaki gibi çağrı
TorchDistributor
yapın:
from pyspark.ml.torch.distributor import TorchDistributor
train_file = "/path/to/train.py"
args = ["--learning_rate=0.001", "--batch_size=16"]
distributor = TorchDistributor(num_processes=2, local_mode=False, use_gpu=True)
distributor.run(train_file, *args)
Sorun giderme
Not defteri iş akışı için yaygın bir hata, dağıtılmış eğitim çalıştırılırken nesnelerin bulunamaması veya seçilememesidir. Kitaplık içeri aktarma deyimleri diğer yürütücülere dağıtılmadığında bu durum oluşabilir.
Bu sorunu önlemek için, eğitim yönteminde çağrılan diğer kullanıcı tanımlı işlevlerin içinde ve ile TorchDistributor(...).run(<func>)
çağrılan eğitim işlevinin en üstüne tüm içeri aktarma deyimlerini (örneğin, import torch
) ekleyin.
NCCL hatası: ncclInternalError: Internal check failed.
Çok düğümlü eğitim sırasında bu hatayla karşılaştığınızda, genellikle GPU'lar arasındaki ağ iletişimi ile ilgili bir sorun olduğunu gösterir. Bu sorun, NCCL (NVIDIA Kolektif İletişim Kitaplığı) GPU iletişimi için belirli ağ arabirimlerini kullanamadığında ortaya çıkar.
Bu hatayı çözmek için, birincil ağ arabirimini kullanmak üzere eğitim kodunuza aşağıdaki kod parçacığını ekleyin.
import os
os.environ["NCCL_SOCKET_IFNAME"] = "eth0"
Örnek not defterleri
Aşağıdaki not defteri örnekleri, PyTorch ile dağıtılmış eğitimin nasıl gerçekleştiriltiğini gösterir.