Treinamento de Modelos de Linguagem em Grande Escala: Técnicas e Estratégias para Múltiplas GPUs

Saiba como treinar modelos de linguagem de grande escala em milhares de GPUs, usando paralelismo, otimizações de memória e comunicação eficiente. Técnicas simplificadas para iniciantes e avançadas para especialistas.

Publicado em: 25, fevereiro 2025

Representação de uso de placas nvidia para treinamento de inteligencia artificial

O treinamento de modelos de linguagem de grande escala (LLMs), como Llama e DeepSeek, exige o uso de milhares de GPUs para processar grandes volumes de dados. Este documento explica como dividir o trabalho entre GPUs usando técnicas de paralelismo, como paralelismo de dados, tensor, sequência, pipeline e especialistas. Também aborda otimizações para reduzir o uso de memória, como recomputação de ativações e treinamento em precisão mista, além de estratégias para equilibrar computação e comunicação entre GPUs, garantindo eficiência e escalabilidade.

O que é o treinamento de LLMs e por que precisamos de muitas GPUs?

  • Modelos de Linguagem de Grande Escala (LLMs): São sistemas de inteligência artificial (IA) que aprendem a entender e gerar linguagem humana, como o Llama e o DeepSeek. Eles têm bilhões de parâmetros (peças de informação que o modelo usa para aprender).
  • Por que muitas GPUs?
    • Esses modelos exigem enormes quantidades de memória para armazenar parâmetros, gradientes (ajustes feitos durante o aprendizado) e ativações (resultados intermediários).
    • Uma única GPU não tem memória suficiente para o modelo inteiro, então precisamos dividir o trabalho entre várias GPUs.
    • Além disso, o treinamento envolve bilhões de cálculos, e GPUs podem processar muitos cálculos ao mesmo tempo, acelerando o processo.

Principais Desafios no Treinamento de LLMs

  1. Uso de Memória: Cada GPU tem memória limitada (ex.: 80 GB em uma H100). Precisamos encontrar maneiras de dividir o modelo e os dados para caber nessa memória.
  2. Eficiência Computacional: Queremos que as GPUs passem a maior parte do tempo calculando, não esperando por dados ou comunicação.
  3. Comunicação entre GPUs: As GPUs precisam trocar informações (ex.: gradientes), mas isso pode ser lento, especialmente entre GPUs em computadores diferentes (nós).

Técnicas de Paralelismo para Dividir o Trabalho

Para resolver esses desafios, usamos várias estratégias de paralelismo, que dividem o modelo e os dados entre as GPUs:

  1. Paralelismo de Dados (DP)
    • O que é? Cada GPU recebe uma cópia do modelo inteiro, mas trabalha com uma parte diferente dos dados (ex.: diferentes frases).
    • Como funciona?
      • Cada GPU faz cálculos independentes em sua parte dos dados.
      • Depois, as GPUs trocam gradientes (usando uma operação chamada "all-reduce") para manter o modelo sincronizado.
    • Vantagens
      • Fácil de implementar.
      • Aumenta a velocidade, pois cada GPU processa dados em paralelo.
    • Limitações
      • Cada GPU precisa armazenar o modelo inteiro, o que não funciona para modelos muito grandes.
      • Muita comunicação entre GPUs pode ser lenta em grande escala.
  2. Paralelismo de Tensor (TP)
    • O que é? Divide partes do modelo (ex.: matrizes de pesos) entre GPUs, reduzindo o uso de memória por GPU.
    • Como funciona?
      • Usa propriedades matemáticas para dividir cálculos (ex.: multiplicações de matrizes) entre GPUs.
      • Inclui "paralelismo de sequência" (SP) para dividir ativações (resultados intermediários) ao longo da sequência de dados.
    • Vantagens
      • Reduz a memória necessária por GPU, permitindo treinar modelos maiores.
    • Limitações
      • Exige muita comunicação dentro de um nó (computador com várias GPUs), o que pode ser lento entre nós.
  3. Paralelismo de Contexto (CP)
    • O que é? Divide a sequência de dados (ex.: frases longas) entre GPUs, especialmente útil para treinar com sequências muito longas (ex.: 128 mil tokens).
    • Como funciona?
      • Usa técnicas como "Ring Attention" para trocar informações entre GPUs de forma eficiente.
    • Vantagens
      • Reduz a memória necessária para ativações em sequências longas.
    • Limitações
      • Adiciona comunicação extra, especialmente nos cálculos de atenção.
  4. Paralelismo de Pipeline (PP)
    • O que é? Divide as camadas do modelo entre GPUs, como uma linha de produção.
    • Como funciona?
      • Cada GPU processa uma parte das camadas e passa os resultados para a próxima GPU.
      • Técnicas como "1F1B" (um forward, um backward) e intercalação de camadas ajudam a reduzir o tempo ocioso ("bubble").
    • Vantagens
      • Reduz a memória por GPU, permitindo treinar modelos muito grandes.
      • Melhor escalabilidade entre nós.
    • Limitações
      • O tempo ocioso pode reduzir a eficiência.
      • Implementação complexa.
  5. Paralelismo de Especialistas (EP)
    • O que é? Usado em modelos de Mistura de Especialistas (MoE), onde cada especialista (parte do modelo) é colocado em uma GPU diferente.
    • Como funciona?
      • Cada token (palavra ou parte dela) é enviado ao especialista correto para processamento.
    • Vantagens
      • Reduz a memória e o tempo de computação, pois cada GPU processa apenas uma parte do modelo.
    • Limitações
      • Requer modelos MoE específicos.
      • Adiciona comunicação para rotear tokens.

Otimização de Memória

  • Recomputation de Ativações
    • Em vez de armazenar todas as ativações (que consomem muita memória), algumas são descartadas e recalculadas quando necessário.
    • Troca memória por mais cálculos, mas reduz o uso de memória.
  • Acumulação de Gradientes
    • Divide o lote de dados em partes menores (micro-batches) e acumula os gradientes antes de atualizar o modelo.
    • Reduz o uso de memória por iteração.
  • ZeRO (Zero Redundancy Optimizer)
    • Divide estados do otimizador, gradientes e parâmetros entre GPUs, reduzindo redundâncias na memória.
    • Etapas: ZeRO-1 (otimizador), ZeRO-2 (+ gradientes), ZeRO-3 (+ parâmetros).
    • Vantagem: Permite treinar modelos grandes com menos GPUs.
    • Limitação: Aumenta a comunicação entre GPUs.

Treinamento em Precisão Mista

  • O que é? Usa diferentes formatos numéricos (ex.: FP32, BF16, FP8) para reduzir memória e acelerar cálculos.
  • Como funciona?
    • Partes críticas (ex.: pesos principais) são mantidas em FP32 (alta precisão).
    • Outras partes (ex.: ativações) usam BF16 ou FP8 (menor precisão, menos memória).
  • Vantagens
    • Reduz o uso de memória.
    • Acelera cálculos, especialmente em GPUs modernas (ex.: H100 suporta FP8).
  • Limitações
    • Pode causar instabilidade (ex.: perdas divergentes) se não for bem ajustado.

Equilibrando Computação e Comunicação

  • Sobreposição de Computação e Comunicação
    • Tenta fazer comunicação (ex.: trocar gradientes) ao mesmo tempo que cálculos, para evitar que GPUs fiquem ociosas.
    • Exemplo: No paralelismo de dados, sincronizar gradientes enquanto faz cálculos backward.
  • Fusão de Kernels
    • Combina várias operações em uma única tarefa na GPU, reduzindo idas e vindas entre memória e unidade de cálculo.
    • Exemplo: Flash Attention, que otimiza cálculos de atenção, reduzindo memória e acelerando o treinamento.
  • Perfilamento (Profiling)
    • Usa ferramentas (ex.: PyTorch Profiler, NVIDIA Nsight) para identificar gargalos, como tempo ocioso ou comunicação lenta, e otimizar o treinamento.

Escolhendo a Melhor Configuração

  • Passo 1: Ajustar à Memória Disponível
    • Para modelos pequenos (<10B parâmetros): Use TP ou ZeRO-3/DP.
    • Para modelos grandes (10B-100B): Combine TP com PP ou DP/ZeRO-3.
    • Para sequências longas: Adicione CP.
    • Para MoE: Use EP.
  • Passo 2: Atingir o Tamanho de Lote Desejado
    • Aumente DP ou acumulação de gradientes para lotes maiores.
    • Reduza DP ou CP para lotes menores.
  • Passo 3: Otimizar Velocidade
    • Maximize TP dentro de um nó (alta largura de banda).
    • Use PP para comunicação entre nós.
    • Ajuste o tamanho dos micro-batches para equilibrar computação e comunicação.

Exemplo Prático

  • Modelo de 70B parâmetros, 512 GPUs
    • Configuração: TP=8 (intra-nó), DP com ZeRO-2, PP para comunicação entre nós.
    • Benefício: Reduz memória por GPU, melhora velocidade com comunicação eficiente.
  • Sequência longa (16k tokens)
    • Adicione CP com Ring Attention para dividir ativações.
    • Benefício: Reduz memória necessária para ativações.

Conclusão

Treinar LLMs em grande escala exige combinar várias técnicas de paralelismo (DP, TP, SP/CP, PP, EP) e otimizações (recomputação, ZeRO, precisão mista) para superar limitações de memória e maximizar a eficiência. A escolha da configuração depende do tamanho do modelo, GPUs disponíveis, tamanho do lote e infraestrutura de rede. Ferramentas de perfilamento ajudam a identificar gargalos, enquanto frameworks como Nanotron e DeepSpeed facilitam a implementação. Com essas estratégias, é possível treinar modelos como Llama-405B e DeepSeek-V3 em milhares de GPUs, equilibrando computação, memória e comunicação.