Computação distribuída com as práticas recomendadas do SageMaker AI - SageMaker IA da Amazon

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Computação distribuída com as práticas recomendadas do SageMaker AI

Esta página de melhores práticas apresenta vários tipos de computação distribuída para trabalhos de machine learning (ML) em geral. O termo computação distribuída nesta página abrange treinamento distribuído para tarefas de machine learning e computação paralela para processamento de dados, geração de dados, engenharia de atributos e aprendizado por reforço. Nesta página, discutiremos sobre os desafios comuns da computação distribuída e as opções disponíveis no SageMaker Training e no SageMaker Processing. Para obter materiais de leitura adicionais sobre computação distribuída, consulte O que é computação distribuída?.

Você pode configurar tarefas de ML para serem executadas de forma distribuída em vários nós (instâncias), aceleradores (GPUs NVIDIA, chips Trainium AWS) e núcleos de vCPU. Quando executar a computação distribuída, você pode atingir uma variedade de objetivos, como operações de computação mais rápidas, lidar com grandes conjuntos de dados ou treinar grandes modelos de ML.

A lista a seguir aborda os desafios comuns que você pode enfrentar quando executar um trabalho de treinamento de ML em grande escala.

  • Você precisa tomar decisões sobre como distribuir a computação, dependendo das tarefas de ML, das bibliotecas de software que você deseja usar e dos recursos computacionais.

  • Nem todas as tarefas de ML são fáceis de distribuir. Além disso, nem todas as bibliotecas de ML oferecem apoio à computação distribuída.

  • A computação distribuída pode nem sempre resultar em um aumento linear na eficiência computacional. Em particular, você precisa identificar se a E/S de dados e a comunicação entre GPUs têm gargalos ou causam sobrecarga.

  • A computação distribuída pode perturbar os processos numéricos e alterar a precisão do modelo. Especificamente para o treinamento de redes neurais paralelas a dados, quando você altera o tamanho do lote global ao aumentar a escala verticalmente para um cluster de computação maior, também precisa ajustar a taxa de aprendizado adequadamente.

O SageMaker AI oferece soluções de treinamento distribuído para facilitar esses desafios em vários casos de uso. Escolha uma das opções a seguir que melhor se adequa ao seu caso de uso.

Opção 1: usar um algoritmo integrado do SageMaker AI que ofereça treinamento distribuído

O SageMaker AI oferece algoritmos integrados que você pode usar imediatamente por meio do console do SageMaker AI ou do SageMaker Python SDK. Usando os algoritmos integrados, você não precisa perder tempo personalizando códigos, entendendo a ciência por trás dos modelos ou executando o Docker em instâncias provisionadas do Amazon EC2.

Um subconjunto de algoritmos integrados do SageMaker oferece treinamento distribuído. Para verificar se o algoritmo de sua escolha oferece apoio ao treinamento distribuído, consulte a coluna Paralelizável na tabela Informações comuns sobre algoritmos integrados. Alguns dos algoritmos oferecem apoio ao treinamento distribuído em várias instâncias, enquanto os demais algoritmos paralelizáveis oferecem apoio à paralelização em várias GPUs em uma única instância, conforme indicado na coluna Paralelizável.

Opção 2: executar um código de ML personalizado no ambiente gerenciado de treinamento ou processamento do SageMaker AI

Os trabalhos do SageMaker AI podem instanciar um ambiente de treinamento distribuído para casos de uso e frameworks específicos. Esse ambiente funciona como um quadro branco pronto para uso, onde você pode trazer e executar seu próprio código de ML.

Se o seu código de ML usa uma estrutura de aprendizado profundo

Você pode iniciar tarefas de treinamento distribuído usando os contêineres de deep learning (DLC) para o treinamento do SageMaker, que podem ser orquestrados por meio dos módulos dedicados do Python no SageMaker AI Python SDK ou por meio das APIs do SageMaker com a AWS CLI e o AWS SDK para Python (Boto3). O SageMaker AI oferece contêineres de treinamento para frameworks de machine learning, como PyTorch, TensorFlow, Hugging Face Transformers e Apache MXNet. Você tem duas opções para escrever código de aprendizado profundo para treinamento distribuído.

  • Bibliotecas de treinamento distribuído do SageMaker AI

    As bibliotecas de treinamento distribuído do SageMaker AI propõem código gerenciado pela AWS para paralelismo de dados de redes neurais e paralelismo de modelos. Como o treinamento distribuído do SageMaker AI também vem com clientes inicializadores integrados ao SageMaker Python SDK, você não precisa criar código de inicialização paralelo. Para saber mais, consulte, SageMaker AI's data parallelism library e SageMaker AI's model parallelism library.

  • Bibliotecas de treinamento distribuído de código aberto

    As estruturas de código aberto têm seus próprios mecanismos de distribuição, como DistributedDataParallelism (DDP) no PyTorch ou módulos tf.distribute no TensorFlow. Você pode optar por executar esses frameworks de treinamento distribuído nos contêineres do framework gerenciado pelo SageMaker AI. Por exemplo, o código de amostra para treinar o MaskRCNN no SageMaker AI mostra como usar o DDP do PyTorch DDP no contêiner do framework PyTorch do SageMaker AI e o Horovod no contêiner do framework TensorFlow do SageMaker AI.

Os contêineres de ML do SageMaker AI também vêm com o MPI pré-instalado, para que você possa paralelizar seu script de ponto de entrada usando mpi4py. Usar os contêineres de treinamento integrados do MPI é uma ótima opção quando você utiliza um inicializador de treinamento distribuído de terceiros ou escreve código paralelo ad hoc no ambiente de treinamento gerenciado pelo SageMaker.

Notas para treinamento de rede neural paralela a dados em GPUs

  • Escale para paralelismo com várias GPUs e várias máquinas quando apropriado

    Frequentemente, executamos trabalhos de treinamento de redes neurais em instâncias de várias CPUs ou GPUs. Cada instância baseada em GPU geralmente contém vários dispositivos de GPU. Consequentemente, a computação distribuída de GPU pode ocorrer em uma única instância de GPU com várias GPUs (treinamento de várias GPUs de nó único) ou em várias instâncias de GPU com vários núcleos de GPU em cada uma (treinamento de vários nós com várias GPUs). O treinamento em instância única é mais fácil de escrever código e depurar, e o throughput entre nós de GPU para GPU geralmente é mais rápido do que a throughput de GPU para GPU entre nós. Portanto, é uma boa ideia escalar o paralelismo de dados verticalmente primeiro (usar uma instância de GPU com várias GPUs) e expandir para várias instâncias de GPU, se necessário. Isso pode não se aplicar aos casos em que o orçamento da CPU é alto (por exemplo, uma grande workload para pré-processamento de dados) e quando a proporção CPU/GPU de uma instância com várias GPUs é muito baixa. Em todos os casos, você precisa experimentar diferentes combinações de tipos de instância com base em suas próprias necessidades de treinamento de ML e workload.

  • Monitore a qualidade da convergência

    Ao treinar uma rede neural com paralelismo de dados, aumentar o número de GPUs e manter constante o tamanho do minilote por GPU leva ao aumento do tamanho do minilote global para o processo de gradiente descendente estocástico (MSGD) do minilote. Sabe-se que o tamanho dos minilotes do MSGD afeta o ruído descendente e a convergência. Para escalar adequadamente e preservar a precisão, você precisa ajustar outros hiperparâmetros, como a taxa de aprendizado [Goyal et al. (2017)].

  • Monitorar gargalos de E/S

    À medida que você aumenta o número de GPUs, o throughput do armazenamento de leitura e gravação também deve aumentar. Certifique-se de que sua fonte de dados e seu pipeline não se tornem gargalos.

  • Modifique seu script de treinamento conforme necessário

    Os scripts de treinamento escritos para treinamento com uma única GPU devem ser modificados para treinamento com vários nós e várias GPUs. Na maioria das bibliotecas de paralelismo de dados, a modificação do script é necessária para fazer o seguinte:

    • Atribua lotes de dados de treinamento a cada GPU.

    • Use um otimizador que possa lidar com cálculos de gradientes e atualizações de parâmetros em várias GPUs.

    • Atribua a responsabilidade do ponto de verificação a um host e GPU específicos.

Se seu código de ML envolver processamento tabular de dados

O PySpark é um frontend Python do Apache Spark, que é uma estrutura de computação distribuída de código aberto. O PySpark foi amplamente adotado para processamento distribuído de dados tabulares para workloads de produção em grande escala. Se quiser executar o código tabular de processamento de dados, considere usar os contêineres do SageMaker Processing PySpark e executar trabalhos paralelos. Você também pode executar trabalhos de processamento de dados em paralelo usando as APIs de treinamento e processamento do SageMaker no Amazon SageMaker Studio Classic, que é integrado ao Amazon EMR e ao AWS Glue.

Opção 3: escrever seu próprio código de treinamento distribuído personalizado

Quando você envia uma tarefa de treinamento ou processamento para o SageMaker AI, a API de treinamento do SageMaker e a API de processamento do SageMaker AI iniciam instâncias de computação do Amazon EC2. Você pode personalizar o ambiente de treinamento e processamento nas instâncias executando seu próprio contêiner do Docker ou instalando bibliotecas adicionais nos contêineres AWS gerenciados. Para ter mais informações sobre o Docker com o SageMaker Training, consulte Adapting your own Docker container to work with SageMaker AI e Create a container with your own algorithms and models. Para ter mais informações sobre o Docker com o SageMaker AI Processing, consulte Use Your Own Processing Code.

Cada ambiente de tarefa de treinamento do SageMaker contém um arquivo de configuração em /opt/ml/input/config/resourceconfig.json e cada ambiente de trabalho de processamento do SageMaker contém um arquivo de configuração semelhante em /opt/ml/config/resourceconfig.json. Seu código pode ler esse arquivo para encontrar hostnames e estabelecer comunicações entre nós. Para saber mais, incluindo o esquema do arquivo JSON, consulte Configuração de treinamento distribuído e Como o Amazon SageMaker Processing configura seu contêiner de processamento. Você também pode instalar e usar bibliotecas de computação distribuída de terceiros, como Ray ou DeepSpeed, no SageMaker AI.

Você também pode usar o SageMaker Training e o SageMaker Processing para executar cálculos distribuídos personalizados que não exigem comunicação entre operadores. Na literatura de computação, essas tarefas são frequentemente descritas como embaraçosamente paralelas ou que não compartilham nada. Os exemplos incluem processamento paralelo de arquivos de dados, treinamento de modelos em paralelo em configurações diferentes ou execução de inferência em lote em uma coleção de registros. Você pode paralelizar trivialmente esses casos de uso sem compartilhar nada com o Amazon SageMaker AI. Quando você inicia uma tarefa de treinamento ou um trabalho de processamento do SageMaker em um cluster com vários nós, o SageMaker AI, por padrão, replica e inicia o código de treinamento (em Python ou Docker) em todos os nós. Tarefas que exigem distribuição aleatória de dados de entrada entre esses vários nós podem ser facilitadas definindo S3DataDistributionType=ShardedByS3Key na configuração da entrada de dados da API TrainingInput do SageMaker AI.

Opção 4: iniciar vários trabalhos em paralelo ou sequencialmente

Você também pode distribuir um fluxo de trabalho de computação de ML em tarefas computacionais paralelas ou sequenciais menores, cada uma representada por sua própria tarefa de SageMaker Training ou SageMaker Processing. Dividir uma tarefa em vários trabalhos pode ser benéfico para as seguintes situações ou tarefas:

  • Quando você tem canais de dados e entradas de metadados específicos (como hiperparâmetros, configuração do modelo ou tipos de instância) para cada subtarefa.

  • Quando você implementa etapas de repetição em nível de subtarefa.

  • Quando você varia a configuração das subtarefas ao longo da workload, como ao treinar para aumentar o tamanho dos lotes.

  • Quando você precisa executar uma tarefa de ML que demore mais do que o tempo máximo de treinamento permitido para um único trabalho de treinamento (máximo de 28 dias).

  • Quando diferentes etapas de um fluxo de trabalho computacional exigem tipos de instância diferentes.

Para o caso específico de pesquisa de hiperparâmetros, use o Ajuste Automático de Modelos do Amazon SageMaker AI. O Ajuste Automático de Modelos do Amazon SageMaker AI é um orquestrador de pesquisa de parâmetros sem servidor que inicia várias tarefas de treinamento em seu nome, de acordo com uma lógica de pesquisa que pode ser aleatória, bayesiana ou HyperBand.

Além disso, para orquestrar várias tarefas de treinamento, você também pode considerar ferramentas de orquestração de fluxo de trabalho, como SageMaker Pipelines, AWS Step Functions e Apache Airflow, compatíveis com o Amazon Managed Workflows for Apache Airflow (MWAA) e o SageMaker AI Workflows.