Aracılığıyla paylaş


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.

  1. 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.

  2. 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.

  3. İçeri aktarmaları eğitim işlevi içinde taşıma: Eğitim işlevine gibi import torchgerekli içeri aktarmaları ekleyin. Bunu yaptığınızda sık karşılaşılan pickling hatalarından kaçınabilirsiniz. Ayrıca, modellerin device_id ve verilerin bağlanacağı veriler şunlar tarafından belirlenir:

    device_id = int(os.environ["LOCAL_RANK"])
    
  4. 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:

  1. Depoyu içeri aktarma: Dış depoyu Databricks Git klasörü olarak içeri aktarın.
  2. Yeni not defteri oluşturma Depo içinde yeni bir Azure Databricks Not Defteri başlatın.
  3. 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.

Databricks not defteri üzerinde uçtan uca dağıtılmış eğitim

Not defterini alma

Bir Hugging Yüz Tanıma modeli not defterine dağıtılmış ince ayar

Not defterini alma

PyTorch Dosya not defteri üzerinde dağıtılmış eğitim

Not defterini alma

PyTorch Lightning not defterini kullanarak dağıtılmış eğitim

Not defterini alma