Megosztás a következőn keresztül:


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.

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

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

  3. 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 torcha betanítási függvényen belül. Ezzel elkerülheti a gyakori válogatós hibákat. A modelleket és adatokat továbbá a device_id következők határozzák meg:

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

  1. Importálja az adattárat: Importálja a külső adattárat Databricks Git-mappaként.
  2. Új jegyzetfüzet létrehozása Új Azure Databricks-jegyzetfüzet inicializálása az adattárban.
  3. 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

Jegyzetfüzet beszerzése

Az Ölelő arc modell jegyzetfüzetének elosztott finomhangolása

Jegyzetfüzet beszerzése

Elosztott betanítás PyTorch-fájljegyzetfüzeten

Jegyzetfüzet beszerzése

Elosztott betanítás a PyTorch Lightning notebook használatával

Jegyzetfüzet beszerzése

Elosztott adatbetöltés Petastorm-jegyzetfüzet használatával

Jegyzetfüzet beszerzése