TorchDistributor ile PyTorch eğitimi dağıtma

Tamamlandı

TensorFlow gibi diğer derin öğrenme çerçeveleriyle ortak olan PyTorch, tek bir bilgisayarda birden çok işlemci (CPU veya GPU) arasında ölçeklendirilecek şekilde tasarlanmıştır. Çoğu durumda, daha fazla veya daha hızlı işlemciye sahip bilgisayarları kullanarak ölçeği artırmaya yönelik bu yaklaşım yeterli eğitim performansı sağlar.

Ancak karmaşık sinir ağlarıyla veya büyük hacimli eğitim verileriyle çalışmanız gerektiğinde Apache Spark'ın birden çok çalışan düğümünde işlem görevlerinin ölçeğini genişletme özelliğinden yararlanabilirsiniz.

Azure Databricks, birden çok çalışan düğümü içerebilen Spark kümelerini kullanır. Bu kümeleri en iyi şekilde kullanmak için, PyTorch eğitim işlerini bir kümedeki düğümler arasında dağıtmanızı sağlayan açık kaynak bir kitaplık olan TorchDistributor'ı kullanabilirsiniz. TorchDistributor, Databricks Runtime ML 13.0 ve üzerinde kullanılabilir.

PyTorch ile zaten bir model eğittiğinizde, tek işlem eğitiminizi TorchDistributor ile dağıtılmış eğitime dönüştürebilirsiniz:

  1. Mevcut kodunuzu uyarlama: Tek düğümlü eğitim kodunuzu dağıtılmış eğitimle uyumlu olacak şekilde değiştirin. Eğitim mantığınızın tek bir işlev içinde kapsüllendiğinden emin olun.
  2. İçeri aktarmaları eğitim işlevi içinde taşıma: Sık karşılaşılan pickling hatalarından kaçınmak için eğitim işlevinin içine gibi import torchgerekli içeri aktarmaları yerleştirin.
  3. Eğitim işlevini hazırlama: Modelinizi, iyileştiricinizi, kayıp işlevinizi ve eğitim döngünüzü eğitim işlevine ekleyin. Modelin ve verilerin uygun cihaza (CPU veya GPU) taşındığından emin olun.
  4. TorchDistributor örneği oluşturun ve çalıştırın: İstenen parametrelerle bir örneği TorchDistributor oluşturun ve dağıtılmış eğitimi başlatmak için çağrısı .run(*args) yapın.

Mevcut kodunuzu uyarlama

İlk olarak, tek düğümlü eğitim kodunuzu dağıtılmış eğitimle uyumlu olacak şekilde değiştirmeniz gerekir. Kodunuzu değiştirirken, eğitim mantığınızın tek bir işlev içinde kapsüllendiğinden emin olmanız gerekir. Bu işlev TorchDistributor tarafından eğitimi birden çok düğüme dağıtmak için kullanılır.

import torch.nn as nn

class SimpleModel(nn.Module):
    def __init__(self):
        super(SimpleModel, self).__init__()
        self.fc = nn.Linear(10, 1)
    
    def forward(self, x):
        return self.fc(x)

Artık kullanarak torch.utils.data.DataLoaderPyTorch ile uyumlu bir biçimdeki veri kümenizi hazırlayabilirsiniz.

# Sample data
inputs = torch.randn(100, 10)
targets = torch.randn(100, 1)

# Create dataset and dataloader
from torch.utils.data import DataLoader, TensorDataset
dataset = TensorDataset(inputs, targets)
dataloader = DataLoader(dataset, batch_size=10)

İçeri aktarmaları eğitim işlevi içinde taşıma

Sık karşılaşılan pickling hatalarını önlemek için, eğitim işlevinin içine gibi import torchgerekli içeri aktarmaları yerleştirin. Tüm içeri aktarmaları eğitim işlevine yerleştirmek, işlev birden çok düğüme dağıtıldığında tüm gerekli modüllerin kullanılabilir olmasını sağlar.

Eğitim işlevini hazırlama

Modelinizi, iyileştiricinizi, kayıp işlevinizi ve eğitim döngünüzü eğitim işlevine ekleyin. Modelin ve verilerin uygun cihaza (CPU veya GPU) taşındığından emin olun.

def train_model(dataloader):
    import torch
    import torch.nn as nn
    from torch.optim import SGD

    device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
    model = SimpleModel().to(device)
    optimizer = SGD(model.parameters(), lr=0.01)
    loss_fn = nn.MSELoss()
    
    for epoch in range(10):
        for batch in dataloader:
            inputs, targets = batch
            inputs, targets = inputs.to(device), targets.to(device)
            optimizer.zero_grad()
            outputs = model(inputs)
            loss = loss_fn(outputs, targets)
            loss.backward()
            optimizer.step()

TorchDistributor örneği oluşturma ve çalıştırma

İstenen parametrelerle bir örneği TorchDistributor oluşturun ve dağıtılmış eğitimi başlatmak için çağrısı .run(*args) gönderin. TorchDistributor'ın çalıştırılması eğitim görevlerini birden çok düğüme dağıtır.

from pyspark.ml.torch.distributor import TorchDistributor

# Distribute the training
distributor = TorchDistributor(num_workers=4)
distributor.run(train_model, dataloader)

Eğitim işinizi izleme ve değerlendirme

Cpu veya GPU kullanımı ve bellek kullanımı dahil olmak üzere kümenizin performansını izlemek için yerleşik araçları kullanabilirsiniz. Eğitim tamamlandığında, modelinizin performansını değerlendirmek için PyTorch değerlendirme tekniklerini kullanarak bir doğrulama veya test veri kümesinde modeli değerlendirebilirsiniz.

# Evaluate the model (after distributed training is complete)
model.eval()
with torch.no_grad():
    for inputs, targets in dataloader:
        outputs = model(inputs)
        # Perform evaluation logic

İpucu

TorchDistributor ile dağıtılmış eğitim hakkında daha fazla bilgi edinin.