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 SageMaker as melhores práticas
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, discutimos sobre os desafios comuns da computação distribuída e as opções disponíveis em SageMaker Treinamento e SageMaker Processamento. 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 AWS Trainium) 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 suporte à 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.
SageMaker fornece soluções de treinamento distribuídas 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.
Tópicos
- Opção 1: usar um algoritmo SageMaker integrado que ofereça suporte ao treinamento distribuído
- Opção 2: executar um código ML personalizado no ambiente SageMaker gerenciado de treinamento ou processamento
- Opção 3: escrever seu próprio código de treinamento distribuído personalizado
- Opção 4: iniciar vários trabalhos em paralelo ou sequencialmente
Opção 1: usar um algoritmo SageMaker integrado que ofereça suporte ao treinamento distribuído
SageMaker fornece algoritmos integrados que você pode usar imediatamente por meio do SageMaker console ou do SDK do SageMaker Python. 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 dos algoritmos SageMaker integrados oferece suporte ao treinamento distribuído. Para verificar se o algoritmo de sua escolha oferece suporte ao treinamento distribuído, consulte a coluna Paralelizável na tabela Informações comuns sobre algoritmos integrados. Alguns dos algoritmos oferecem suporte ao treinamento distribuído em várias instâncias, enquanto os demais algoritmos paralelizáveis oferecem suporte à paralelização em várias GPUs em uma única instância, conforme indicado na coluna Paralelizável.
Opção 2: executar um código ML personalizado no ambiente SageMaker gerenciado de treinamento ou processamento
SageMaker jobs podem instanciar um ambiente de treinamento distribuído para casos de uso e estruturas específicos. Esse ambiente funciona como um ready-to-use quadro branco, 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 trabalhos de treinamento distribuídos usando o Deep Learning Containers (DLC)
-
As bibliotecas de treinamento SageMaker distribuídas
As bibliotecas de treinamento SageMaker distribuídas propõem código AWS gerenciado para paralelismo de dados de redes neurais e paralelismo de modelos. SageMaker o treinamento distribuído também vem com clientes lançadores integrados ao SDK do SageMaker Python, e você não precisa criar um código de lançamento paralelo. Para saber mais, consulte a biblioteca SageMakerde paralelismo de dados e a biblioteca de paralelismo SageMaker de modelos.
-
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) em PyTorch ou
tf.distribute
módulos em. TensorFlow Você pode optar por executar essas estruturas de treinamento distribuídas nos contêineres da estrutura SageMaker gerenciada. Por exemplo, o código de exemplo para treinar o MaskRCNN SageMaker mostra como usar o PyTorch DDP no contêiner da estrutura e o Horovod no contêiner da SageMaker PyTorch estrutura. SageMaker TensorFlow
SageMaker Os contêineres de ML também vêm com o MPI
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 taxa de transferência 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
PySpark é uma interface Python do Apache Spark, que é uma estrutura de computação distribuída de código aberto. PySpark tem sido amplamente adotado para processamento distribuído de dados tabulares para cargas de trabalho de produção em grande escala. Se você quiser executar o código tabular de processamento de dados, considere usar os PySpark contêineres SageMaker de processamento e executar trabalhos paralelos. Você também pode executar trabalhos de processamento de dados paralelamente usando APIs SageMaker de SageMaker treinamento e processamento no Amazon SageMaker Studio Classic, que é integrado ao Amazon EMR
Opção 3: escrever seu próprio código de treinamento distribuído personalizado
Quando você envia um trabalho de treinamento ou processamento para SageMaker, as APIs de SageMaker treinamento e SageMaker processamento iniciam instâncias computacionais do Amazon EC2. Você pode personalizar o ambiente de treinamento e processamento nas instâncias executando seu próprio contêiner Docker ou instalando bibliotecas adicionais nos contêineres AWS gerenciados. Para obter mais informações sobre o Docker with SageMaker Training, consulte Adaptar seu próprio contêiner Docker para trabalhar SageMaker e Criar um contêiner com seus próprios algoritmos e modelos. Para obter mais informações sobre o Docker with SageMaker Processing, consulte Use seu próprio código de processamento.
Cada ambiente SageMaker de trabalho de treinamento contém um arquivo de configuração em/opt/ml/input/config/resourceconfig.json
, e cada ambiente SageMaker de trabalho de processamento 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
Você também pode usar SageMaker Treinamento e SageMaker Processamento para executar cálculos distribuídos personalizados que não exigem comunicação entre trabalhadores. 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 a Amazon. SageMaker Quando você inicia um trabalho de SageMaker treinamento ou SageMaker processamento em um cluster com vários nós, SageMaker por padrão, replica e inicia seu 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 S3DataDistributionType=ShardedByS3Key
facilitadas definindo a configuração de entrada de dados da SageMaker TrainingInput
API.
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 seu próprio trabalho de SageMaker treinamento ou SageMaker processamento. 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 da pesquisa por hiperparâmetros, use o ajuste SageMaker automatizado do modelo. SageMaker O Automated Model Tuning é um orquestrador de pesquisa de parâmetros sem servidor que inicia vários trabalhos 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ários trabalhos de treinamento, você também pode considerar ferramentas de orquestração de fluxo de trabalho, como Pipelines SageMaker ,