Partager via


Entraînement distribué avec TorchDistributor

Cet article décrit comment effectuer une formation distribuée sur les modèles PyTorch ML à l'aide de TorchDistributor.

TorchDistributor est un module open source de PySpark qui aide les utilisateurs à effectuer une formation distribuée avec PyTorch sur leurs clusters Spark, il vous permet donc de lancer des tâches de formation PyTorch en tant que tâches Spark. Sous le capot, il initialise l’environnement et les canaux de communication entre les workers et utilise la commande torch.distributed.run CLI pour exécuter une formation distribuée sur les nœuds Worker.

L'API TorchDistributor prend en charge les méthodes présentées dans le tableau suivant.

Méthode et signature Description
init(self, num_processes, local_mode, use_gpu) Créez une instance de TorchDistributor.
run(self, main, *args) Exécute la formation distribuée en appelant main(**kwargs) si main est une fonction et exécute la commande CLI torchrun main *args si main est un chemin de fichier.

Spécifications

  • Spark 3.4
  • Databricks Runtime 13.0 ML ou supérieur

Workflow de développement pour les notebooks

Si le processus de création et de formation du modèle s'effectue entièrement à partir d'un bloc-notes sur votre ordinateur local ou d'un Notebook Databricks, vous n'avez qu'à apporter des modifications mineures pour préparer votre code pour la formation distribuée.

  1. Préparer le code de nœud unique : préparez et testez le code de nœud unique avec PyTorch, PyTorch Lightning ou d'autres frameworks basés sur PyTorch/PyTorch Lightning comme l'API HuggingFace Trainer.

  2. Préparez le code pour la formation distribuée standard : vous devez convertir votre formation à processus unique en formation distribuée. Intégrez ce code distribué dans une seule fonction de formation que vous pouvez utiliser avec le TorchDistributor.

  3. Déplacer les importations dans la fonction de formation : ajoutez les importations nécessaires, telles que import torch, dans la fonction de formation. Cela vous permet d’éviter les erreurs courantes de décapage. De plus, la manière device_id dont les modèles et les données sont liés est déterminée par :

    device_id = int(os.environ["LOCAL_RANK"])
    
  4. Lancer une formation distribuée : instanciez le TorchDistributor avec les paramètres souhaités et appelez .run(*args) pour lancer la formation.

Voici un exemple de code de formation :

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)

Migrer la formation à partir de référentiels externes

Si vous disposez d’une procédure de formation distribuée existante stockée dans un référentiel externe, vous pouvez facilement migrer vers Azure Databricks en procédant comme suit :

  1. Importer le référentiel : importez le référentiel externe en tant que Dossier Databricks GIT.
  2. Créer un nouveau notebook Initialisez un nouveau Notebook Azure Databricks dans le référentiel.
  3. Lancer une formation distribuée Dans une cellule de notebook TorchDistributor, appelez comme suit :
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)

Dépannage

Une erreur courante dans le flux de travail des notebooks est que les objets ne peuvent pas être trouvés ou récupérés lors de l'exécution d'une formation distribuée. Cela peut se produire lorsque les instructions d'importation de bibliothèque ne sont pas distribuées aux autres exécuteurs.

Pour éviter ce problème, incluez toutes les instructions d'importation (par exemple, import torch) à la fois en haut de la fonction de formation appelée avec TorchDistributor(...).run(<func>) et à l'intérieur de toute autre fonction définie par l'utilisateur appelée dans la méthode de formation.

Échec de la bibliothèque NCCL : ncclInternalError: Internal check failed.

Lorsque vous rencontrez cette erreur lors d’un entraînement à plusieurs nœuds, cela indique généralement un problème de communication réseau entre les GPU. Ce problème survient lorsque la bibliothèque NCCL (NVIDIA Collective Communications Library) ne peut pas utiliser certaines interfaces réseau pour la communication avec le GPU.

Pour résoudre cette erreur, ajoutez l’extrait de code suivant dans votre code d’entraînement pour utiliser l’interface réseau principale.

import os
os.environ["NCCL_SOCKET_IFNAME"] = "eth0"

Exemples de notebooks

Les exemples de notebook suivants montrent comment effectuer une formation distribuée avec PyTorch.

Formation distribuée de bout en bout sur notebook Databricks

Obtenir le notebook

Distribué la mise au point d'un carnet de notes modèle Hugging Face

Obtenir le notebook

Formation distribuée sur un notebook PyTorch File

Obtenir le notebook

Formation distribuée à l'aide du bloc-notes PyTorch Lightning

Obtenir le notebook