Treinamento misto de precisão - Amazon SageMaker

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á.

Treinamento misto de precisão

A biblioteca SageMaker model parallelism (SMP) v2 oferece suporte a treinamento misto de precisão pronto para uso, integrando-se a estruturas de código aberto, como o Transformer Engine. PyTorch FSDP Para saber mais, consulte os tópicos a seguir.

Treinamento misto de precisão com FP8 instâncias P5 usando o Transformer Engine

A partir da biblioteca SageMaker model parallelism (SMP) v2.2.0, a biblioteca se integra ao SMP Transformer Engine e oferece suporte a treinamento FP8 misto de precisão pronto para uso, mantendo a compatibilidade com o. PyTorch FSDPMixedPrecision Isso significa que você pode usar tanto PyTorch FSDP para treinamento misto de precisão quanto o Transformer Engine para FP8 treinamento. Para camadas de modelo não suportadas pelo recurso de FP8 treinamento do Transformer Engine, essas camadas retornam à precisão PyTorch FSDP mista.

nota

SMPA v2 oferece FP8 suporte para os seguintes modelos de Hugging Face Transformer:

  • GPT-NeoX (disponível na SMP versão 2.2.0 e posterior)

  • Llama 2 (disponível na SMP versão 2.2.0 e versões posteriores)

  • Mixtral 8x7b e Mixtral 8x22b (disponíveis na versão 2.5.0 e posterior) SMP

nota

Esse FP8 treinamento sobre o recurso P5 está disponível na seguinte combinação de bibliotecas de SageMaker e da PyTorch biblioteca:

  • O SageMaker Python SDK v2.212.0 e versões posteriores

  • PyTorch v2.2.0 e versões posteriores

FP8(precisão de ponto flutuante de 8 bits) é um tipo de dados que surgiu como outro paradigma para acelerar o treinamento de LLM modelos em aprendizado profundo. Com o lançamento do NVIDIA H100 GPUs suportando tipos de FP8 dados, você pode se beneficiar das vantagens das melhorias de desempenho nas instâncias P5 equipadas com o H100GPUs, ao mesmo tempo em que acelera o treinamento distribuído com FP8 treinamento de precisão mista.

O tipo FP8 de dados se ramifica ainda mais para os formatos E4M3 e E5M2. O E4M3 oferece uma melhor precisão, tem uma faixa dinâmica limitada e é ideal para o passe para frente no treinamento de modelos. O E5M2 tem uma faixa dinâmica mais ampla, mas com precisão reduzida, e é mais adequado para o retrocesso, onde a precisão é menos crítica e uma faixa dinâmica mais ampla se torna benéfica. Portanto, recomendamos que você use a receita da FP8 estratégia híbrida para aproveitar essas características de forma eficaz.

Para tipos de dados de meia precisão (FP16eBF16), técnicas globais de escalonamento de perdas, como escalabilidade de perda estática ou escalabilidade dinâmica de perdas, lidam com problemas de convergência que surgem da perda de informações devido a gradientes de arredondamento em meia precisão. No entanto, a faixa dinâmica de FP8 é ainda mais estreita e as técnicas de escalonamento de perdas globais não são suficientes. Neste ponto, precisamos de uma técnica de escalonamento por tensor mais refinada. O escalonamento retardado é uma estratégia que seleciona um fator de escala com base nos valores absolutos máximos observados em vários tensores das iterações anteriores. Há uma desvantagem nessa estratégia: ela usa todos os benefícios de desempenho da FP8 computação, mas requer memória para manter o histórico de valores máximos dos tensores. Para saber mais sobre a estratégia de escalabilidade retardada em geral, consulte o artigo FP8Formats for Deep Learning.

Na prática, o uso FP8 é útil em todos os cenários de treinamento em instâncias P5. É altamente recomendável ativar FP8 sempre que possível para melhorar o desempenho do treinamento.

SMPO v2 suporta o Transformer Engine pronto para uso. Portanto, ao executar o FP8 treinamento com a SMP v2 em instâncias P5 de SageMaker (ml.p5.48xlarge), a única coisa que você precisa fazer é importar torch.sagemaker seu script de treinamento e continuar usando o pacote Python nativo do Transformer Engine. Para saber mais sobre como usar o Transformer Engine para FP8 treinamento em geral, consulte Usando FP8 com o Transformer Engine na documentação do NVIDIA Transformer Engine. O trecho de código a seguir mostra como devem ser as linhas de código para importar a SMP biblioteca e configurar FP8 seu script de treinamento.

import torch.sagemaker as tsm import transformer_engine.pytorch as te from transformer_engine.common.recipe import DelayedScaling, Format # Initialize the SMP torch.sagemaker API. tsm.init() # Define a transformer model and wrap it with the torch.sagemaker.transform API. from transformers import AutoModelForCausalLM model = AutoModelForCausalLM.from_config(ModelConfig) model = tsm.transform(model) # Enable E4M3 during forward pass, E5M2 during backward pass. fp8_format = Format.HYBRID # Create an FP8 recipe. fp8_recipe = DelayedScaling(fp8_format=fp8_format, amax_history_len=32, amax_compute_algo="max") # Enable FP8 autocasting. with te.fp8_autocast(enabled=True, fp8_recipe=fp8_recipe, fp8_group=tsm.state.world_process_group): out = model(inp) loss = out.sum() loss.backward()

Para encontrar um exemplo prático de FP8 treinamento com SMP v2 em instâncias P5, consulte o exemplo de caderno em Accelerate SageMaker PyTorch FSDP Training of LLama-v2 (ou GPT -NeoX) com instâncias P5. FP8

Treinamento misto de precisão com tipos de dados de meia precisão usando PyTorch FSDP

SMPA v2 oferece suporte PyTorch FSDPMixedPrecisionpara trabalhos de treinamento em instâncias P4 e P5. PyTorch FSDPfornece várias configurações para precisão mista para melhoria de desempenho e redução de memória.

nota

Esse treinamento misto de precisão com o PyTorch FSDP recurso está disponível na seguinte combinação de bibliotecas de SageMaker e da PyTorch biblioteca.

  • SMPv2.0.0 e versões posteriores

  • o SageMaker Python SDK v2.200.0 e versões posteriores

  • PyTorch v2.0.1 e versões posteriores

A forma padrão de configurar um modelo para precisão mista é criar o modelo em efloat32, em seguida, FSDP permitir a conversão dos parâmetros para float16 ou bfloat16 em tempo real passando uma MixedPrecision política, conforme mostrado no trecho de código a seguir. Para obter mais informações sobre as opções dtype para alterar os parâmetros for, a redução ou os buffers para precisão mista PyTorch, consulte PyTorch FSDPMixedPrecisionAPIa PyTorchdocumentação.

# Native PyTorch API from torch.distributed.fsdp import MixedPrecision dtype = torch.bfloat16 mixed_precision_policy = MixedPrecision( param_dtype=dtype, reduce_dtype=dtype, buffer_dtype=dtype ) model = FSDP( model, ..., mixed_precision=mixed_precision_policy )

Observe que certos modelos (como o modelo Hugging Face Transformers Llama) esperam amortecedores como. float32 Para usarfloat32, torch.bfloat16 substitua por torch.float32 na linha que define o dtype objeto.