Trenowanie rozproszone za pomocą narzędzia TorchDistributor
W tym artykule opisano sposób wykonywania trenowania rozproszonego na modelach uczenia maszynowego PyTorch przy użyciu narzędzia TorchDistributor.
TorchDistributor to moduł typu open source w programie PySpark, który ułatwia użytkownikom trenowanie rozproszone za pomocą rozwiązania PyTorch w swoich klastrach Spark, dzięki czemu umożliwia uruchamianie zadań szkoleniowych PyTorch jako zadań platformy Spark. Under-the-hood inicjuje środowisko i kanały komunikacji między procesami roboczymi i wykorzystuje polecenie interfejsu wiersza polecenia torch.distributed.run
do uruchamiania rozproszonego szkolenia między węzłami procesu roboczego.
Interfejs API TorchDistributor obsługuje metody przedstawione w poniższej tabeli.
Metoda i podpis | opis |
---|---|
init(self, num_processes, local_mode, use_gpu) |
Utwórz wystąpienie narzędzia TorchDistributor. |
run(self, main, *args) |
Uruchamia trenowanie rozproszone przez wywołanie main(**kwargs) , jeśli main jest funkcją i uruchamia polecenie interfejsu wiersza polecenia torchrun main *args , jeśli głównym jest ścieżka pliku. |
Wymagania
- Spark 3.4
- Databricks Runtime 13.0 ML lub nowsza wersja
Przepływ pracy tworzenia notesów
Jeśli proces tworzenia i trenowania modelu odbywa się całkowicie z notesu na komputerze lokalnym lub notesie usługi Databricks, wystarczy wprowadzić drobne zmiany, aby przygotować kod do trenowania rozproszonego.
Przygotuj kod pojedynczego węzła: przygotuj i przetestuj kod pojedynczego węzła za pomocą biblioteki PyTorch, PyTorch Lightning lub innych struktur opartych na interfejsie API PyTorch/PyTorch Lightning, takim jak Interfejs API trenera HuggingFace.
Przygotowanie kodu do standardowego trenowania rozproszonego: należy przekonwertować trenowanie pojedynczego procesu na trenowanie rozproszone. Aby ten kod rozproszony obejmował wszystkie funkcje trenowania, których można używać z .
TorchDistributor
Przenieś importy w funkcji trenowania: dodaj niezbędne importy, takie jak
import torch
, w funkcji trenowania. Dzięki temu można uniknąć typowych błędów pikowania. Ponadtodevice_id
te modele i dane są powiązane z nimi, są określane przez:device_id = int(os.environ["LOCAL_RANK"])
Uruchom trenowanie rozproszone: utwórz wystąpienie
TorchDistributor
z żądanymi parametrami i wywołaj polecenie.run(*args)
w celu uruchomienia szkolenia.
Poniżej przedstawiono przykład kodu szkoleniowego:
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)
Migrowanie szkolenia z repozytoriów zewnętrznych
Jeśli masz istniejącą procedurę trenowania rozproszonego przechowywaną w repozytorium zewnętrznym, możesz łatwo przeprowadzić migrację do usługi Azure Databricks, wykonując następujące czynności:
- Zaimportuj repozytorium: zaimportuj repozytorium zewnętrzne jako folder Git usługi Databricks.
- Utwórz nowy notes Inicjuj nowy notes usługi Azure Databricks w repozytorium.
- Uruchom trenowanie rozproszone W komórce notesu wywołaj metodę
TorchDistributor
podobną do następującej:
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)
Rozwiązywanie problemów
Typowy błąd przepływu pracy notesu polega na tym, że nie można odnaleźć ani zebrać obiektów podczas uruchamiania trenowania rozproszonego. Może się tak zdarzyć, gdy instrukcje importowania biblioteki nie są dystrybuowane do innych funkcji wykonawczych.
Aby uniknąć tego problemu, uwzględnij wszystkie instrukcje importu (na przykład import torch
) zarówno w górnej części funkcji trenowania, która jest wywoływana z funkcją TorchDistributor(...).run(<func>)
i wewnątrz innych funkcji zdefiniowanych przez użytkownika wywoływanych w metodzie trenowania.
Niepowodzenie listy NCCL: ncclInternalError: Internal check failed.
W przypadku wystąpienia tego błędu podczas trenowania z wieloma węzłami zwykle wskazuje to problem z komunikacją sieciową między procesorami GPU. Ten problem pojawia się, gdy NCCL (biblioteka NVIDIA Collective Communications Library) nie może używać niektórych interfejsów sieciowych do komunikacji z procesorem GPU.
Aby rozwiązać ten błąd, dodaj następujący fragment kodu szkoleniowego, aby użyć podstawowego interfejsu sieciowego.
import os
os.environ["NCCL_SOCKET_IFNAME"] = "eth0"
Przykładowe notesy
W poniższych przykładach notesu pokazano, jak przeprowadzić trenowanie rozproszone za pomocą rozwiązania PyTorch.