Elosztott betanítás a TorchDistributor használatával
Ez a cikk azt ismerteti, hogyan végezhet elosztott betanítást PyTorch ML-modelleken a TorchDistributor használatával.
A TorchDistributor egy nyílt forráskódú modul a PySparkban, amely segít a felhasználóknak elosztott betanítást végezni a PyTorch-tal a Spark-fürtöiken, így Lehetővé teszi a PyTorch-betanítási feladatok Spark-feladatokként való elindítását. A motorháztető alatt inicializálja a környezetet és a kommunikációs csatornákat a feldolgozók között, és a CLI-paranccsal torch.distributed.run
elosztott betanítást futtat a feldolgozó csomópontokon.
A TorchDistributor API az alábbi táblázatban látható metódusokat támogatja.
Metódus és aláírás | Leírás |
---|---|
init(self, num_processes, local_mode, use_gpu) |
Hozza létre a TorchDistributor egy példányát. |
run(self, main, *args) |
Elosztott betanítást futtat úgy, hogy meghívja main(**kwargs) , ha a fő függvény egy függvény, és futtatja a CLI-parancsot torchrun main *args , ha a fő fájl elérési útja. |
Követelmények
- Spark 3.4
- Databricks Runtime 13.0 ML vagy újabb
Fejlesztési munkafolyamat jegyzetfüzetekhez
Ha a modell létrehozásának és betanításának folyamata teljes egészében a helyi gépen vagy a Databricks Notebookban található jegyzetfüzetből történik, csak kisebb módosításokat kell végrehajtania ahhoz, hogy a kód készen álljon az elosztott betanításra.
Egycsomópontos kód előkészítése: Az egycsomópontos kód előkészítése és tesztelése a PyTorch, a PyTorch Lightning vagy más, a PyTorch/PyTorch Lightning-alapú keretrendszerekkel, például a HuggingFace Trainer API-val.
Kód előkészítése szabványos elosztott betanításhoz: Az egyetlen folyamat betanítását elosztott betanítássá kell konvertálnia. Legyen ez az elosztott kód egy betanítási függvényen belül, amelyet a
TorchDistributor
.Importálás áthelyezése a betanítási függvényen belül: Adja hozzá a szükséges importálásokat, például
import torch
a betanítási függvényen belül. Ezzel elkerülheti a gyakori válogatós hibákat. A modelleket és adatokat továbbá adevice_id
következők határozzák meg:device_id = int(os.environ["LOCAL_RANK"])
Elosztott betanítás indítása: Példányosíthatja a
TorchDistributor
kívánt paramétereket, és meghívhatja.run(*args)
a betanítás indítását.
A következő példa egy betanítási kódra:
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)
Betanítás migrálása külső adattárakból
Ha már rendelkezik egy külső adattárban tárolt elosztott betanítási eljárással, egyszerűen migrálhat az Azure Databricksbe az alábbiak végrehajtásával:
- Importálja az adattárat: Importálja a külső adattárat Databricks Git-mappaként.
- Új jegyzetfüzet létrehozása Új Azure Databricks-jegyzetfüzet inicializálása az adattárban.
- Elosztott betanítás indítása jegyzetfüzetcellában az alábbihoz hasonló hívással
TorchDistributor
:
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)
Hibaelhárítás
A jegyzetfüzet-munkafolyamat gyakori hibája, hogy elosztott betanítás futtatásakor az objektumok nem találhatók vagy nem válogathatók. Ez akkor fordulhat elő, ha a tár importálási utasításai nem lesznek elosztva más végrehajtók között.
A probléma elkerülése érdekében az összes importálási utasítást (például import torch
) a betanítási függvény tetején, a betanítási metódusban hívott többi felhasználó által definiált függvénybe TorchDistributor(...).run(<func>)
is be kell foglalni.
NCCL-hiba: ncclInternalError: Internal check failed.
Ha ezt a hibát többcsomópontos betanítás során tapasztalja, az általában a GPU-k közötti hálózati kommunikációval kapcsolatos problémát jelez. Ez a probléma akkor merül fel, ha az NCCL (NVIDIA Collective Communications Library) nem tud bizonyos hálózati adaptereket használni a GPU-kommunikációhoz.
A hiba megoldásához adja hozzá a következő kódrészletet a betanítási kódhoz az elsődleges hálózati adapter használatához.
import os
os.environ["NCCL_SOCKET_IFNAME"] = "eth0"
Példajegyzetfüzetek
Az alábbi jegyzetfüzet-példák bemutatják, hogyan végezhet elosztott betanítást a PyTorch használatával.
Végpontok közötti elosztott betanítás a Databricks notebookon
Az Ölelő arc modell jegyzetfüzetének elosztott finomhangolása
Elosztott betanítás PyTorch-fájljegyzetfüzeten
Elosztott betanítás a PyTorch Lightning notebook használatával
Elosztott adatbetöltés Petastorm-jegyzetfüzet használatával
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: