Habilite um treinamento mais rápido com a biblioteca paralela de dados do Amazon SageMaker | Amazon Web Services

Habilite um treinamento mais rápido com a biblioteca paralela de dados do Amazon SageMaker | Amazon Web Services

O treinamento em modelos de linguagem grande (LLM) tornou-se cada vez mais popular no último ano com o lançamento de vários modelos disponíveis publicamente, como Llama2, Falcon e StarCoder. Os clientes estão agora treinando LLMs de tamanho sem precedentes, variando de 1 bilhão a mais de 175 bilhões de parâmetros. O treinamento desses LLMs requer recursos e tempo de computação significativos, já que centenas a milhares de unidades de processamento gráfico (GPUs) devem ser usadas para lidar com os vastos conjuntos de dados de treinamento e tamanhos de modelo atuais. Um gargalo no treinamento distribuído pode ser a comunicação da GPU gerenciada pela NVIDIA Collective Communication Library (NCCL). Em alguns trabalhos de treinamento de grande distribuição, pode ser gasto mais tempo na comunicação entre GPUs do que na computação real da GPU. Para aliviar o gargalo de comunicação da GPU e permitir um treinamento mais rápido, Amazon Sage Maker tem o prazer de anunciar uma operação coletiva AllGather otimizada como parte da biblioteca paralela de dados distribuídos SageMaker (SMDDP). AllGather é a operação coletiva mais usada em soluções populares de paralelismo de dados com uso eficiente de memória, como Otimizador de Redundância Zero DeepSpeed ​​(ZeRO) e Paralelismo de dados totalmente fragmentado (FSDP), e é o principal contribuinte para a sobrecarga de comunicação da GPU. Nesta postagem, mostramos uma visão geral de alto nível de como o SMDDP funciona, como você pode habilitar o SMDDP em seus scripts de treinamento do Amazon SageMaker e as melhorias de desempenho que você pode esperar.

Visão geral da solução

tradicional treinamento paralelo de dados envolve a replicação de um modelo inteiro em várias GPUs, com cada modelo sendo treinado em diferentes fragmentos de dados do conjunto de dados. Durante a passagem para trás, os gradientes são calculados em média entre os trabalhadores da GPU para que cada réplica do modelo seja atualizada com os mesmos valores de gradiente, apesar de serem treinados com diferentes fragmentos de dados. Essa técnica permite um treinamento muito mais rápido em vastos conjuntos de dados, paralelizando o consumo de dados de treinamento. No entanto, alguns dos grandes modelos atuais (por exemplo, Llama2 70B) são grandes demais para caber inteiramente na memória da GPU, o que torna o paralelismo de dados tradicional inutilizável. Para continuar colhendo os benefícios do paralelismo de dados e ao mesmo tempo superar a memória limitada da GPU, soluções paralelas de dados fragmentadas, como DeepSpeed ​​ZeRO, PyTorch FSDP e Amazon Biblioteca de paralelismo de modelos SageMaker cresceram em popularidade.

No paralelismo de dados fragmentados, em vez de replicar todo o modelo nos trabalhadores da GPU, os parâmetros do modelo, gradientes e estados do otimizador são divididos e distribuídos (ou seja, fragmentados) entre as GPUs no trabalho de treinamento. Para realizar a computação de avanço e retrocesso, os parâmetros são coletados de fragmentos em outros trabalhadores da GPU para formar uma ou mais camadas de modelo. Após a computação ser realizada, essas camadas são liberadas da memória para permitir que o próximo conjunto de camadas seja reunido. Observe que existem variantes de paralelismo de dados fragmentados em que apenas os estados e gradientes do otimizador são fragmentados, mas não os parâmetros do modelo. AllGather ainda é usado neste tipo de paralelismo de dados fragmentados, mas apenas antes da computação de encaminhamento para coletar parâmetros do modelo que foram atualizados por diferentes gradientes ou fragmentos de estado do otimizador de outros trabalhadores da GPU. Consulte os diferentes Estágios DeepSpeed ​​ZeRO e os votos de SHARD_GRAD_OP Estratégia de fragmentação FSDP para obter mais detalhes.

Uma operação coletiva AllGather é executada sempre que os parâmetros não são fragmentados — o NCCL fornece a implementação padrão de código aberto dessa rotina. Conforme mostrado a seguir, cada trabalhador de GPU envolvido no AllGather começa com um buffer de entrada e termina com todos os buffers de entrada de outros trabalhadores concatenados. Quando AllGather é usado no paralelismo de dados fragmentados, os buffers de entrada contêm os fragmentos de parâmetros do modelo e os grandes buffers de saída contêm uma ou mais camadas de modelo materializadas a partir de outros fragmentos.

Antes e depois da operação AllGather em 4 GPUs

Embora o NCCL seja normalmente usado para AllGather em treinamento distribuído, sua implementação subjacente de baixo nível não é adaptada à infraestrutura de rede do Amazon Elastic Compute Cloud (Amazon EC2) e, portanto, seu desempenho pode retardar o treinamento de ponta a ponta. A biblioteca SMDDP é uma biblioteca de comunicação coletiva para GPUs NVIDIA que serve como um substituto imediato para NCCL e fornece melhor desempenho para trabalhos de treinamento distribuído com PyTorch. Especificamente, o SMDDP fornece uma implementação otimizada do AllGather para Tipos de instância p4d/p4de.

Como operações coletivas como AllGather bloqueiam a computação de avanço e retrocesso, a execução mais rápida dessas operações se traduz diretamente em menor tempo de treinamento de ponta a ponta, sem efeitos colaterais na convergência. Outras operações coletivas que são usadas com menos frequência no treinamento paralelo de dados fragmentados são tratadas recorrendo ao NCCL.

Passo a passo

AllGather otimizado para AWS

AllGather otimizado para AWS usa as seguintes técnicas para obter melhor desempenho na infraestrutura AWS em comparação com NCCL:

  1. Movemos dados entre instâncias via Adaptador de tecido elástico (EFA) rede com um padrão de comunicação todos-para-todos. EFA é a solução de rede de baixa latência e alto rendimento da AWS, e um padrão completo para comunicação de rede entre nós é mais adaptado às características da EFA e da infraestrutura de rede da AWS, exigindo menos saltos de pacotes em comparação com o anel ou padrão de comunicação em árvore.
  2. GDRCopy para coordenar o tráfego de rede local NVLink e EFA. GDRCopy é uma biblioteca que fornece comunicação de baixa latência entre processos de CPU e kernels CUDA de GPU. Com essa tecnologia, somos capazes de canalizar a movimentação de dados intra-nós e entre nós.
  3. Uso reduzido de multiprocessadores de streaming de GPU para devolver mais poder de computação para modelar kernels. As instâncias AWS P4d/P4de são equipadas com GPUs NVIDIA A100, cada uma com 108 multiprocessadores de streaming. Enquanto o NCCL utiliza até 24 multiprocessadores de streaming para executar coletivos, os Coletivos SMDDP usam apenas até nove multiprocessadores de streaming. Os multiprocessadores de streaming salvos podem ser obtidos por kernels de computação modelo para uma execução mais rápida.

Uso

Os coletivos SMDDP integram-se nativamente ao PyTorch por meio do grupo de processos abstração no torch.distributed módulo. Um grupo de processos define as interfaces para operações coletivas comuns, como AllGather, ReduceScatter, AllReduce, etc. Os usuários podem escrever código genérico distribuído e então escolher o código subjacente. backend, que fornece a implementação dessas operações com base no dispositivo de computação usado. Os trabalhos de treinamento de CPU geralmente usam o gloo or mpi back-end enquanto as GPUs NVIDIA usam o nccl Processo interno.

A biblioteca SMDDP entra em cena registrando-se como um back-end personalizado na abstração do grupo de processos. Isso é feito pela instrução import, mostrada nos trechos de código a seguir. Então, ao selecionar o back-end para seu trabalho de treinamento distribuído baseado em GPU, basta substituir nccl de smddp. O smddp back-end segue a mesma semântica do nccl back-end e oferece suporte aos mesmos cenários de treinamento.

Velocidade Profunda

import smdistributed.dataparallel.torch.torch_smddp
deepspeed.init_distributed(dist_backend="smddp") # replacing "nccl"

PSDB

import smdistributed.dataparallel.torch.torch_smddp
dist.init_process_group(backend="smddp")  # replacing "nccl"

Benchmarks

Comparamos o desempenho do AllGather autônomo, onde a operação coletiva é executada isoladamente, sem qualquer treinamento de modelo. Abaixo está um exemplo de resultado em 32 instâncias p4d comparando NCCL e SMDDP AllGather. O eixo X representa o tamanho de saída do AllGather e o eixo Y representa a taxa de utilização da rede EFA de 4 Gbps do p400d. Os 4 subgráficos representam os padrões comuns de grupos de comunicação onde temos 1, 2, 4 e 8 classificações por instância p4d participando da operação AllGather, respectivamente.

Utilização de rede de SMDDP e NCCL AllGather em 32 nós

Esses microbenchmarks mostram que o SMDDP supera o NCCL com duas características principais:

  1. O desempenho máximo do SMDDP (aproximadamente 90% de utilização da largura de banda) é superior ao do NCCL (aproximadamente 80% de utilização da largura de banda) em todas as configurações.
  2. O SMDDP atinge o desempenho máximo em tamanhos de buffer muito menores que o NCCL. Isso melhora particularmente as velocidades de treinamento para modelos menores ou quando o usuário define um tamanho pequeno de buffer AllGather no DeepSpeed ​​(onde o tamanho AllGather não precisa ser igual ao tamanho da camada).

Referências de treinamento de modelo

Em trabalhos de treinamento em larga escala, onde a comunicação da GPU é um gargalo significativo, o SMDDP pode melhorar significativamente as velocidades de treinamento, conforme medido pelo modelo TFLOPS/GPU.

Configuração Performance
Modelo/Treinamento Agrupar Solução de paralelismo de dados fragmentados Modelo TFLOPS/GPU com NCCL Modelo TFLOPS/GPU com SMDDP % acelerar
13B Lhama2
Comprimento da sequência: 4096
Tamanho global do lote: 4 milhões de tokens
64 nós p4d.24xlarge (512 GPUs NVIDIA A100) PyTorchFSDP 97.89 121.85 24.40%
65B GPT-NeoX
Comprimento da sequência: 2048
Tamanho global do lote: 4 milhões de tokens
64 nós p4d.24xlarge (512 GPUs NVIDIA A100) DeepSpeed ​​ZeRO Estágio 3* 99.23 108.66 9.50%

*Megatron-DeepSpeed ​​da EleutherAI repositório foi usado. O paralelismo tensorial também foi habilitado com um grau de paralelo tensorial de oito.

Nota: O modelo TFLOPS/GPU é baseado no cálculo de utilização do modelo FLOPS definido no artigo SUA PARTICIPAÇÃO FAZ A DIFERENÇA e números de benchmark em outros lugares podem citar TFLOPS/GPU de hardware como métrica de desempenho. Hardware TFLOPS/GPU pode ser aproximado como 4/3 x modelo TFLOPS/GPU.

Conclusão

Nesta postagem, mostramos como acelerar significativamente os trabalhos de treinamento paralelo de dados fragmentados no Amazon SageMaker com apenas duas linhas de alteração de código. A formação distribuída em grande escala está a tornar-se cada vez mais omnipresente com o surgimento dos LLMs, mas esta escala acarreta custos elevados. Ao reduzir o gargalo de comunicação entre GPUs, o SMDDP ajuda você a treinar mais rapidamente em escala e a economizar recursos computacionais. Você pode encontrar mais exemplos de SMDDP com treinamento paralelo de dados fragmentados no Exemplos do Amazon SageMaker Repositório GitHub.


Sobre os autores

Habilite um treinamento mais rápido com a biblioteca paralela de dados do Amazon SageMaker | Inteligência de dados PlatoBlockchain da Amazon Web Services. Pesquisa vertical. Ai.Apoorv Gupta é engenheiro de desenvolvimento de software na AWS, focado na construção de sistemas de aprendizado profundo ideais para infraestrutura e hardware da AWS. Ele está interessado em computação distribuída, sistemas de aprendizagem profunda e aceleradores de ML. Fora do trabalho, Apoorv gosta de viajar, fazer caminhadas e jogar videogame.

Habilite um treinamento mais rápido com a biblioteca paralela de dados do Amazon SageMaker | Inteligência de dados PlatoBlockchain da Amazon Web Services. Pesquisa vertical. Ai.Karan Dhiman é engenheiro de desenvolvimento de software na AWS, baseado em Toronto, Canadá. Ele é muito apaixonado pelo espaço de aprendizado de máquina e pela criação de soluções para acelerar cargas de trabalho computacionais distribuídas.

Habilite um treinamento mais rápido com a biblioteca paralela de dados do Amazon SageMaker | Inteligência de dados PlatoBlockchain da Amazon Web Services. Pesquisa vertical. Ai.Ruhan Prasad é engenheiro de desenvolvimento de software na AWS e está trabalhando para tornar o treinamento de aprendizado profundo distribuído mais rápido, barato e fácil de usar no SageMaker. Fora do trabalho, Ruhan gosta de jogar tênis, viajar e cozinhar.

Habilite um treinamento mais rápido com a biblioteca paralela de dados do Amazon SageMaker | Inteligência de dados PlatoBlockchain da Amazon Web Services. Pesquisa vertical. Ai.Zhao Qi Zhu é engenheiro sênior de desenvolvimento de software na AWS, apaixonado por sistemas distribuídos e otimizações de baixo nível. Ele gosta de assistir partidas de futebol enquanto bebe refrigerante (não diet).

Carimbo de hora:

Mais de Aprendizado de máquina da AWS