Distribuované trénování s využitím TorchDistributoru
Tento článek popisuje, jak provádět distribuované trénování na modelech PyTorch ML pomocí TorchDistributor.
TorchDistributor je opensourcový modul v PySparku, který uživatelům pomáhá provádět distribuované trénování pomocí PyTorchu v jejich clusterech Spark, takže umožňuje spouštět trénovací úlohy PyTorch jako úlohy Sparku. Inicializuje prostředí a komunikační kanály mezi pracovními procesy a využívá příkaz torch.distributed.run
rozhraní příkazového řádku ke spuštění distribuovaného trénování napříč pracovními uzly.
Rozhraní API TorchDistributor podporuje metody uvedené v následující tabulce.
Metoda a podpis | Popis |
---|---|
init(self, num_processes, local_mode, use_gpu) |
Vytvořte instanci TorchDistributor. |
run(self, main, *args) |
Spustí distribuované trénování vyvoláním main(**kwargs) hlavní funkce a spuštěním příkazu torchrun main *args CLI, pokud je hlavní cestou k souboru. |
Požadavky
- Spark 3.4
- Databricks Runtime 13.0 ML nebo vyšší
Pracovní postup vývoje pro poznámkové bloky
Pokud se proces vytváření a trénování modelu děje zcela z poznámkového bloku na místním počítači nebo v poznámkovém bloku Databricks, stačí udělat menší změny, abyste mohli připravit kód na distribuované trénování.
Příprava kódu s jedním uzlem: Připravte a otestujte kód s jedním uzlem pomocí PyTorchu, PyTorch Lightning nebo jiných architektur založených na PyTorch/PyTorch Lightning, jako je rozhraní API HuggingFace Trainer.
Příprava kódu pro standardní distribuované trénování: Potřebujete převést trénování jednoho procesu na distribuované trénování. Mít tento distribuovaný kód všech součástí jedné trénovací funkce, kterou můžete použít s
TorchDistributor
.Přesun importů v rámci trénovací funkce: Přidejte potřebné importy, například
import torch
, v rámci trénovací funkce. Díky tomu se můžete vyhnout běžným chybám při výběru. Kromě toho jsoudevice_id
modely a data svázané s tímto:device_id = int(os.environ["LOCAL_RANK"])
Spusťte distribuované trénování: Vytvořte instanci
TorchDistributor
s požadovanými parametry a volání.run(*args)
pro spuštění trénování.
Následuje příklad trénovacího kódu:
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)
Migrace trénování z externích úložišť
Pokud máte existující distribuovanou trénovací proceduru uloženou v externím úložišti, můžete snadno migrovat do Azure Databricks následujícím způsobem:
- Import úložiště: Import externího úložiště jako složky Git Databricks
- Vytvořte nový poznámkový blok Inicializace nového poznámkového bloku Azure Databricks v rámci úložiště.
- Spusťte distribuované trénování v buňce poznámkového bloku a volejte
TorchDistributor
takto:
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)
Řešení problému
Běžnou chybou pracovního postupu poznámkového bloku je, že při spuštění distribuovaného trénování se objekty nedají najít ani vybrat. K tomu může dojít v případě, že příkazy importu knihovny nejsou distribuovány do jiných exekutorů.
Abyste se tomuto problému vyhnuli, zahrňte všechny příkazy importu (například import torch
) do horní části trénovací funkce, která je volána s jinými uživatelem TorchDistributor(...).run(<func>)
definovanými funkcemi volanými v metodě trénování.
Selhání seznamu NCCL: ncclInternalError: Internal check failed.
Když při trénování s více uzly narazíte na tuto chybu, obvykle to značí problém se síťovými komunikacemi mezi grafickými procesory. K tomuto problému dochází, když NCCL (NVIDIA Collective Communications Library) nemůže pro komunikaci s GPU používat určitá síťová rozhraní.
Pokud chcete tuto chybu vyřešit, přidejte do trénovacího kódu následující fragment kódu pro použití primárního síťového rozhraní.
import os
os.environ["NCCL_SOCKET_IFNAME"] = "eth0"
Příklady poznámkových bloků
Následující příklady poznámkového bloku ukazují, jak provádět distribuované trénování pomocí PyTorchu.