

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 de precisão mista
<a name="model-parallel-core-features-v2-mixed-precision"></a>

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

**Topics**
+ [Treinamento misto de precisão com FP8 instâncias P5 usando o Transformer Engine](#model-parallel-core-features-v2-mixed-precision-fp8-training-on-p5)
+ [Treinamento de precisão mista com tipos de dados de meia precisão usando PyTorch FSDP](#model-parallel-core-features-v2-mixed-precision-half-precision)

## Treinamento misto de precisão com FP8 instâncias P5 usando o Transformer Engine
<a name="model-parallel-core-features-v2-mixed-precision-fp8-training-on-p5"></a>

[A partir da biblioteca de paralelismo de SageMaker modelos (SMP) v2.2.0, a biblioteca SMP se integra ao [Transformer Engine](https://docs.nvidia.com/deeplearning/transformer-engine/index.html) e oferece suporte a [treinamento FP8 misto de precisão](https://docs.nvidia.com/deeplearning/transformer-engine/user-guide/examples/fp8_primer.html) pronto para uso, mantendo a compatibilidade com o FSDP. PyTorch `MixedPrecision`](https://pytorch.org/docs/stable/fsdp.html#torch.distributed.fsdp.MixedPrecision) Isso significa que você pode usar o PyTorch FSDP para treinamento de precisão mista e o Transformer Engine para treinamento. FP8 Para camadas de modelo não suportadas pelo recurso de FP8 treinamento do Transformer Engine, essas camadas retornam à precisão mista do PyTorch FSDP.

**nota**  
O SMP v2 oferece FP8 suporte para os seguintes modelos de Hugging Face Transformer:  
GPT-NeoX (disponível no SMP v2.2.0 e versões posteriores)
Llama 2 (disponível no SMP v2.2.0 e versões posteriores)
Mixtral 8x7b e Mixtral 8x22b (disponíveis no SMP v2.5.0 e versões posteriores)

**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 aprendizado profundo de modelos LLM. Com o lançamento da 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 H100 GPUs, ao mesmo tempo em que acelera o treinamento distribuído com treinamento de precisão mista. FP8 

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 a passagem para trás, onde a precisão é menos crítica e uma faixa dinâmica mais ampla torna-se benéfica. Portanto, recomendamos que você use a [receita da FP8 estratégia híbrida](https://docs.nvidia.com/deeplearning/transformer-engine/user-guide/examples/fp8_primer.html#FP8-recipe) para aproveitar essas características de forma eficaz.

Para tipos de dados de meia precisão (FP16 e BF16), 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. Nesse ponto, precisamos de uma técnica de ajuste de escala por tensor mais refinada. O *ajuste de escala atrasado* é 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 [https://arxiv.org/pdf/2209.05433.pdf](https://arxiv.org/pdf/2209.05433.pdf).

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.

O SMP v2 é compatível com o Transformer Engine pronto para uso. Portanto, ao executar o FP8 treinamento com SMP v2 em instâncias P5 de SageMaker AI (`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](https://docs.nvidia.com/deeplearning/transformer-engine/user-guide/examples/fp8_primer.html) 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 biblioteca SMP e configurar seu script FP8 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](https://github.com/aws/amazon-sagemaker-examples/blob/main/training/distributed_training/pytorch/model_parallel_v2/llama_v2/smp-train-llama-fsdp-tp-fp8.ipynb) (ou GPT-Neox) com instâncias P5. FP8 

## Treinamento de precisão mista com tipos de dados de meia precisão usando PyTorch FSDP
<a name="model-parallel-core-features-v2-mixed-precision-half-precision"></a>

O SMP v2 oferece suporte ao [PyTorch FSDP `MixedPrecision`](https://pytorch.org/docs/stable/fsdp.html#torch.distributed.fsdp.MixedPrecision) para trabalhos de treinamento em instâncias P4 e P5. PyTorch O FSDP fornece 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 recurso PyTorch FSDP está disponível na seguinte combinação de bibliotecas de SageMaker e da PyTorch biblioteca.  
SMP v2.0.0 e versões posteriores
o SageMaker Python SDK v2.200.0 e posterior
PyTorch v2.0.1 e versões posteriores

A forma padrão de configurar um modelo para precisão mista é criar o modelo em `float32` e, em seguida, permitir que o FSDP transmita os parâmetros para `float16` ou `bfloat16` dinamicamente ao passar uma política de `MixedPrecision`, conforme apresentado no trecho de código a seguir. *Para obter mais informações sobre as opções de alteração de parâmetros, redução ou buffers para precisão mista PyTorch, consulte a [`MixedPrecision`API PyTorch FSDP na documentação](https://pytorch.org/docs/stable/fsdp.html#torch.distributed.fsdp.MixedPrecision). `dtype` PyTorch*

```
# 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 Llama da Hugging Face Transformers) esperam buffers como `float32`. Para usar `float32`, substitua `torch.bfloat16` por `torch.float32`, na linha que define o objeto `dtype`.