Treinamento distribuído com TorchDistributor
Este artigo descreve como realizar o treinamento distribuído nos modelos PyTorch ML usando TorchDistributor.
TorchDistributor é um módulo de código aberto em PySpark que ajuda os usuários a fazer treinamento distribuído com PyTorch em seu clustering Spark, permitindo que o senhor inicie o PyTorch treinamento Job como Spark Job. Sob o capô, ele inicializa o ambiente e o canal de comunicação entre o trabalhador e utiliza o comando CLI torch.distributed.run
para executar o treinamento distribuído nos nós worker.
A API TorchDistributor oferece suporte aos métodos mostrados na tabela a seguir.
Método e assinatura | Descrição |
---|---|
| Crie uma instância do TorchDistributor. |
| execução distribuiu o treinamento invocando |
Requisitos
- Spark 3.4
- Databricks Runtime 13.0 ML ouacima
Desenvolvimento de fluxo de trabalho para Notebook
Se a criação do modelo e o processo de treinamento ocorrerem inteiramente em um Notebook em sua máquina local ou em um Databricks Notebooko senhor só precisará fazer pequenas alterações para deixar o código pronto para o treinamento distribuído.
-
Preparar o código de nó único: Prepare e teste o código de nó único com PyTorch, PyTorch Lightning ou outras estruturas baseadas em PyTorch/PyTorch Lightning, como a API HuggingFace Trainer.
-
Preparar o código para o treinamento distribuído padrão: O senhor precisa converter seu treinamento de processo único em treinamento distribuído. Tenha esse código distribuído todo englobado em uma função de treinamento que o senhor pode usar com o site
TorchDistributor
. -
Mova as importações dentro da função de treinamento: Adicione as importações necessárias, como
import torch
, dentro da função de treinamento. Isso permite que você evite erros comuns de decapagem. Além disso, odevice_id
ao qual os modelos e os dados estão vinculados é determinado por:Pythondevice_id = int(os.environ["LOCAL_RANK"])
-
Iniciar o treinamento distribuído: Instanciar o site
TorchDistributor
com os parâmetros desejados e chamar.run(*args)
para iniciar o treinamento.
A seguir, um exemplo de código de treinamento:
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)
Migrar treinamento de repositórios externos
Se o senhor tiver um procedimento de treinamento distribuído existente armazenado em um repositório externo, poderá migrar facilmente para a Databricks fazendo o seguinte:
- Importar o repositório: Importar o repositório externo como uma pasta Git do Databricks.
- Criar um novo Notebook Inicializar um novo Databricks Notebook dentro do repositório.
- Iniciar treinamento distribuído Em uma célula do Notebook, chame
TorchDistributor
da seguinte forma:
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)
Solução de problemas
Um erro comum no fluxo de trabalho do Notebook é que os objetos não podem ser encontrados ou decapados ao executar o treinamento distribuído. Isso pode ocorrer quando as instruções de importação da biblioteca não são distribuídas para outro executor.
Para evitar esse problema, inclua todas as instruções de importação (por exemplo, import torch
) na parte superior da função de treinamento que é chamada com TorchDistributor(...).run(<func>)
e dentro de qualquer outra função definida pelo usuário chamada no método de treinamento.
Falha na CUDA: peer access is not supported between these two devices
Esse é um possível erro no conjunto de GPUs G5 no AWS. Para resolver esse erro, adicione o seguinte trecho em seu código de treinamento:
import os
os.environ["NCCL_P2P_DISABLE"] = "1"
Falha no NCCL: ncclInternalError: Internal check failed.
Quando o senhor encontra esse erro durante o treinamento com vários nós, ele normalmente indica um problema com a comunicação de rede entre as GPUs. Esse problema surge quando a NCCL (NVIDIA Collective Communications biblioteca) não pode usar determinadas interfaces de rede para comunicação com a GPU.
Para solucionar esse erro, adicione o seguinte trecho ao seu código de treinamento para usar a interface de rede primária.
import os
os.environ["NCCL_SOCKET_IFNAME"] = "eth0"
Exemplo de notebook
Os exemplos de Notebook a seguir demonstram como realizar o treinamento distribuído com o site PyTorch.