

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

# Addestramento di precisione misto
<a name="model-parallel-core-features-v2-mixed-precision"></a>

La libreria di parallelismo dei SageMaker modelli (SMP) v2 supporta l'addestramento di precisione misto pronto all'uso grazie all'integrazione con framework open source come FSDP e Transformer Engine. PyTorch Per ulteriori informazioni, consulta i seguenti argomenti.

**Topics**
+ [Addestramento di precisione misto con FP8 su istanze P5 utilizzando Transformer Engine](#model-parallel-core-features-v2-mixed-precision-fp8-training-on-p5)
+ [Addestramento di precisione misto PyTorch con tipi di dati a semiprecisione utilizzando FSDP](#model-parallel-core-features-v2-mixed-precision-half-precision)

## Addestramento di precisione misto con FP8 su istanze P5 utilizzando Transformer Engine
<a name="model-parallel-core-features-v2-mixed-precision-fp8-training-on-p5"></a>

[https://docs.nvidia.com/deeplearning/transformer-engine/user-guide/examples/fp8_primer.html](https://docs.nvidia.com/deeplearning/transformer-engine/user-guide/examples/fp8_primer.html) Ciò significa che puoi utilizzare sia PyTorch FSDP per l'allenamento di precisione misto che Transformer Engine per l'allenamento FP8. Per i livelli del modello non supportati dalla funzione di addestramento FP8 di Transformer Engine, tali livelli ricorrono alla precisione mista FSDP. PyTorch 

**Nota**  
SMP v2 offre il supporto di FP8 per i seguenti modelli di Hugging Face Transformers:  
GPT-NeoX (disponibile in SMP v2.2.0 e versioni successive)
Llama 2 (disponibile in SMP v2.2.0 e versioni successive)
Mixtral 8x7b e Mixtral 8x22b (disponibili in SMP v2.5.0 e versioni successive)

**Nota**  
Questo corso di formazione FP8 sulla funzionalità P5 è disponibile nella seguente combinazione di librerie di e libreria: SageMaker PyTorch   
 SageMaker Python SDK v2.212.0 e versioni successive
PyTorch v2.2.0 e versioni successive

*FP8* (precisione in virgola mobile a 8 bit) è un tipo di dati che si sta affermando come un altro paradigma per accelerare l’addestramento deep learning dei modelli LLM. Il rilascio delle GPU NVIDIA H100 che supportano i tipi di dati FP8 consente di sfruttare i vantaggi derivanti dai miglioramenti delle prestazioni sulle istanze P5 dotate di GPU H100, accelerando al contempo l’addestramento distribuito grazie all’addestramento di precisione misto FP8.

Il tipo di dati FP8 si estende anche ai formati E4M3 ed E5M2. *E4M3* offre una maggiore precisione, dispone di una gamma dinamica limitata ed è ideale per il passaggio all’addestramento dei modelli. *E5M2* si distingue per una gamma dinamica più ampia, ma una precisione ridotta, ed è più adatto per il passaggio all’indietro, in cui la precisione è meno importante e la gamma dinamica più ampia rappresenta un vantaggio. Pertanto, per sfruttare queste caratteristiche in modo efficace ti consigliamo di utilizzare la [strategia FP8 ibrida](https://docs.nvidia.com/deeplearning/transformer-engine/user-guide/examples/fp8_primer.html#FP8-recipe).

Per i tipi di dati a mezza precisione (FP16 e BF16), le tecniche globali di dimensionamento delle perdite, come il dimensionamento statico o il dimensionamento dinamico, permettono di gestire i problemi di convergenza derivanti dalla perdita di informazioni dovuta ai gradienti di arrotondamento a mezza precisione. Tuttavia, l’intervallo dinamico di FP8 è ancora più ristretto e le tecniche di dimensionamento globale delle perdite non sono sufficienti. A questo punto, occorre una tecnica di dimensionamento per tensore di maggiore precisione. Il *dimensionamento ritardato* è una strategia che seleziona un fattore di dimensionamento basato sui valori massimi assoluti osservati in una serie di tensori nelle iterazioni precedenti. Questa strategia rappresenta un compromesso: sfrutta tutti i vantaggi offerti dalle prestazioni del calcolo FP8, ma richiede memoria per conservare la cronologia dei valori massimi dei tensori. Per ulteriori informazioni sulla strategia di dimensionamento ritardato in generale, consulta il documento [https://arxiv.org/pdf/2209.05433.pdf](https://arxiv.org/pdf/2209.05433.pdf).

In pratica, l’utilizzo di FP8 è utile in tutti gli scenari di addestramento sulle istanze P5. Consigliamo vivamente di abilitare FP8 ogni volta che sia possibile per migliorare le prestazioni dell’addestramento.

SMP v2 offre il supporto immediato di Transformer Engine. Pertanto, quando si esegue l'addestramento FP8 con SMP v2 su istanze P5 di SageMaker AI (`ml.p5.48xlarge`), l'unica cosa che devi fare è importare lo script di formazione e continuare `torch.sagemaker` a utilizzare il pacchetto nativo Transformer Engine Python. Per ulteriori informazioni sull’utilizzo di Transformer Engine per l’addestramento su FP8 in generale, consulta [Utilizzo di FP8 con Transformer Engine](https://docs.nvidia.com/deeplearning/transformer-engine/user-guide/examples/fp8_primer.html) nella *documentazione di NVIDIA Transformer Engine*. Il frammento di codice riportato di seguito mostra come dovrebbero apparire le righe di codice per l’importazione della libreria SMP e la configurazione di FP8 nello script di addestramento.

```
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()
```

[Per trovare un esempio pratico di addestramento FP8 con SMP v2 su istanze P5, consultate il taccuino di esempio su Accelerate FSDP Training of (or) with FP8 su istanze P5. SageMaker PyTorch Llama-v2 GPT-NeoX](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)

## Addestramento di precisione misto PyTorch con tipi di dati a semiprecisione utilizzando FSDP
<a name="model-parallel-core-features-v2-mixed-precision-half-precision"></a>

SMP v2 supporta [PyTorch FSDP `MixedPrecision`](https://pytorch.org/docs/stable/fsdp.html#torch.distributed.fsdp.MixedPrecision) per i lavori di formazione su istanze P4 e P5. PyTorch FSDP offre varie configurazioni per una precisione mista sia per il miglioramento delle prestazioni che per la riduzione della memoria. 

**Nota**  
Questo addestramento di precisione misto con la funzionalità PyTorch FSDP è disponibile nella seguente combinazione di librerie di e libreria. SageMaker PyTorch   
SMP v2.0.0 e versioni successive
 SageMaker Python SDK v2.200.0 e versioni successive
PyTorch v2.0.1 e versioni successive

La modalità standard per configurare un modello a precisione mista consiste nel creare il modello interno in `float32` e quindi consentire a FSDP di trasmettere i parametri `float16` o `bfloat16` immediatamente propagando una policy `MixedPrecision`, come mostrato nel frammento di codice riportato di seguito. *Per ulteriori informazioni sulle opzioni per modificare i parametri `dtype` for, la riduzione o i buffer per la precisione mista PyTorch, consulta l'API [PyTorch FSDP `MixedPrecision`](https://pytorch.org/docs/stable/fsdp.html#torch.distributed.fsdp.MixedPrecision) nella documentazione. 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
)
```

Tieni presente che alcuni modelli (come Hugging Face Transformers Llama) prevedono buffer come `float32`. Per utilizzare `float32`, sostituisci `torch.bfloat16` con `torch.float32` nella riga che definisce l’oggetto `dtype`.