

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

# Entraînement de précision mixte
<a name="model-parallel-core-features-v2-mixed-precision"></a>

La bibliothèque de parallélisme des SageMaker modèles (SMP) v2 permet un entraînement de précision mixte prêt à l'emploi en s'intégrant à des frameworks open source tels que PyTorch FSDP et Transformer Engine. Pour en savoir plus, consultez les rubriques suivantes.

**Topics**
+ [Entraînement de précision mixte avec FP8 sur des instances P5 à l’aide de Transformer Engine](#model-parallel-core-features-v2-mixed-precision-fp8-training-on-p5)
+ [Entraînement de précision mixte avec types de données de demi-précision à l'aide PyTorch du FSDP](#model-parallel-core-features-v2-mixed-precision-half-precision)

## Entraînement de précision mixte avec FP8 sur des instances P5 à l’aide de Transformer Engine
<a name="model-parallel-core-features-v2-mixed-precision-fp8-training-on-p5"></a>

[À partir de la bibliothèque de parallélisme des SageMaker modèles (SMP) v2.2.0, la bibliothèque SMP s'intègre à [Transformer Engine](https://docs.nvidia.com/deeplearning/transformer-engine/index.html) et prend en charge l'[entraînement de précision mixte FP8](https://docs.nvidia.com/deeplearning/transformer-engine/user-guide/examples/fp8_primer.html) prêt à l'emploi, tout en préservant la compatibilité avec le FSDP. PyTorch `MixedPrecision`](https://pytorch.org/docs/stable/fsdp.html#torch.distributed.fsdp.MixedPrecision) Cela signifie que vous pouvez utiliser à la fois le PyTorch FSDP pour l'entraînement de précision mixte et le Transformer Engine pour l'entraînement FP8. Pour les couches du modèle qui ne sont pas prises en charge par la fonction d'entraînement FP8 de Transformer Engine, ces couches reposent sur la précision PyTorch mixte FSDP.

**Note**  
SMP v2 prend actuellement en charge FP8 pour les modèles de transformeur Hugging Face suivants :  
GPT-NeoX (disponible dans SMP v2.2.0 et versions ultérieures)
Llama 2 (disponible dans SMP v2.2.0 et versions ultérieures)
Mixtral 8x7b et Mixtral 8x22b (disponibles dans SMP v2.5.0 et versions ultérieures)

**Note**  
Cette formation FP8 sur la fonctionnalité P5 est disponible dans la combinaison suivante de bibliothèques de SageMaker et de PyTorch bibliothèque :  
Le SDK SageMaker Python v2.212.0 et versions ultérieures
PyTorch v2.2.0 et versions ultérieures

*FP8* (précision en virgule flottante sur 8 bits) est un type de données qui est apparu comme un autre paradigme pour accélérer l’entraînement des modèles LLM en deep learning. Avec le lancement des GPU NVIDIA H100 compatibles avec les types de données FP8, vous pouvez bénéficier des avantages liés à l’amélioration des performances des instances P5 équipées des GPU H100, tout en accélérant l’entraînement distribué grâce à l’entraînement de précision mixte FP8.

Le type de données FP8 se décline ensuite en formats E4M3 et E5M2. *E4M3* offre une meilleure précision, possède une plage dynamique limitée et est idéal pour la transmission vers l’avant lors de l’entraînement des modèles. *E5M2* a une plage dynamique plus large, mais une précision réduite, et convient mieux à la transmission vers l’arrière, où la précision est moins critique et où une plage dynamique plus large devient bénéfique. Par conséquent, nous vous recommandons d’utiliser la [formule de stratégie hybride FP8](https://docs.nvidia.com/deeplearning/transformer-engine/user-guide/examples/fp8_primer.html#FP8-recipe) pour tirer efficacement parti de ces caractéristiques.

Pour les types de données de demi-précision (FP16 et BF16), les techniques globales de mise à l’échelle de la perte, telles que la mise à l’échelle statique ou dynamique, permettent de résoudre les problèmes de convergence liés à la perte d’informations due à l’arrondissement des gradients en demi-précision. Cependant, la plage dynamique de FP8 est encore plus étroite et les techniques de mise à l’échelle globale des pertes ne sont pas suffisantes. À ce stade, nous avons besoin d’une technique de mise à l’échelle par tenseur plus fine. La *mise à l’échelle différée* est une stratégie qui sélectionne un facteur d’échelle basé sur les valeurs absolues maximales observées dans un certain nombre de tenseurs lors des itérations précédentes. Cette stratégie présente un inconvénient : elle utilise tous les avantages du calcul FP8 en termes de performances, mais nécessite de la mémoire pour conserver l’historique des valeurs maximales des tenseurs. Pour en savoir plus sur la stratégie de mise à l’échelle différée en général, consultez l’article [https://arxiv.org/pdf/2209.05433.pdf](https://arxiv.org/pdf/2209.05433.pdf).

En pratique, l’utilisation de FP8 est utile dans tous les scénarios d’entraînement sur les instances P5. Nous recommandons vivement d’activer FP8 dans la mesure du possible pour améliorer les performances d’entraînement.

SMP v2 prend en charge Transformer Engine dès son installation. Par conséquent, lorsque vous exécutez un entraînement FP8 avec SMP v2 sur des instances P5 d' SageMaker AI (`ml.p5.48xlarge`), la seule chose que vous devez faire est d'importer `torch.sagemaker` dans votre script d'entraînement et de continuer à utiliser le package Python Transformer Engine natif. Pour en savoir plus sur l’utilisation de Transformer Engine pour l’entraînement FP8 en général, consultez [Using FP8 with Transformer Engine](https://docs.nvidia.com/deeplearning/transformer-engine/user-guide/examples/fp8_primer.html) dans la documentation *NVIDIA Transformer Engine*. L’extrait de code suivant montre à quoi doivent ressembler les lignes de code permettant d’importer la bibliothèque SMP et de configurer FP8 dans votre script d’entraînement.

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

Pour trouver un exemple pratique d'entraînement FP8 avec SMP v2 sur des instances P5, consultez le bloc-notes d'exemple sur [Accelerate SageMaker PyTorch FSDP Training of Llama-v2 (ou GPT-NeoX) avec FP8 sur des](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) instances P5.

## Entraînement de précision mixte avec types de données de demi-précision à l'aide PyTorch du FSDP
<a name="model-parallel-core-features-v2-mixed-precision-half-precision"></a>

SMP v2 prend en charge le [PyTorch FSDP `MixedPrecision`](https://pytorch.org/docs/stable/fsdp.html#torch.distributed.fsdp.MixedPrecision) pour les tâches de formation sur les instances P4 et P5. PyTorch Le FSDP propose différentes configurations pour une précision mixte, à la fois pour l'amélioration des performances et pour la réduction de la mémoire. 

**Note**  
Cet entraînement de précision mixte avec la fonction PyTorch FSDP est disponible dans la combinaison suivante de bibliothèques de SageMaker et de PyTorch bibliothèque.  
SMP v2.0.0 et versions ultérieures
le SDK SageMaker Python v2.200.0 et versions ultérieures
PyTorch v2.0.1 et versions ultérieures

La méthode standard pour configurer un modèle pour une précision mixte consiste à créer le modèle en `float32`, puis à autoriser FSDP à convertir les paramètres en `float16` ou en `bfloat16` à la volée en transmettant une politique `MixedPrecision`, comme indiqué dans l’extrait de code suivant. *Pour plus d'informations sur les options permettant de modifier `dtype` les paramètres, la réduction ou les tampons pour une précision mixte PyTorch, consultez l'[`MixedPrecision`API PyTorch FSDP](https://pytorch.org/docs/stable/fsdp.html#torch.distributed.fsdp.MixedPrecision) dans la documentation. 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
)
```

Notez que certains modèles (comme le modèle de transformeur Llama Hugging Face) nécessitent des tampons `float32`. Pour utiliser `float32`, remplacez `torch.bfloat16` par `torch.float32` dans la ligne définissant l’objet `dtype`.