

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# Entrenamiento de precisión mixta
<a name="model-parallel-core-features-v2-mixed-precision"></a>

La biblioteca de paralelismo de SageMaker modelos (SMP) v2 admite el entrenamiento mixto de precisión lista para usar, ya que se integra con marcos de código abierto como FSDP y Transformer Engine. PyTorch Para obtener más información, consulte los temas siguientes.

**Topics**
+ [Entrenamiento de precisión mixto con FP8 instancias P5 que utilizan Transformer Engine](#model-parallel-core-features-v2-mixed-precision-fp8-training-on-p5)
+ [Entrenamiento de precisión mixto con PyTorch tipos de datos de precisión media mediante FSDP](#model-parallel-core-features-v2-mixed-precision-half-precision)

## Entrenamiento de precisión mixto con FP8 instancias P5 que utilizan Transformer Engine
<a name="model-parallel-core-features-v2-mixed-precision-fp8-training-on-p5"></a>

[A partir de la biblioteca de paralelismo de SageMaker modelos (SMP) de la versión 2.2.0, la biblioteca SMP se integra con [Transformer Engine](https://docs.nvidia.com/deeplearning/transformer-engine/index.html) y admite un [entrenamiento de precisión FP8 mixto](https://docs.nvidia.com/deeplearning/transformer-engine/user-guide/examples/fp8_primer.html) listo para usar, manteniendo la compatibilidad con el FSDP. PyTorch `MixedPrecision`](https://pytorch.org/docs/stable/fsdp.html#torch.distributed.fsdp.MixedPrecision) Esto significa que puedes usar tanto el PyTorch FSDP para el entrenamiento de precisión mixta como el Transformer Engine para el entrenamiento. FP8 En el caso de las capas de modelos que no son compatibles con la función de FP8 entrenamiento de Transformer Engine, esas capas recurren a la precisión mixta del PyTorch FSDP.

**nota**  
El SMP v2 es FP8 compatible con los siguientes modelos de Hugging Face Transformer:  
GPT-NeoX (disponible en SMP v2.2.0 y versiones posteriores)
Llama 2 (disponible en SMP v2.2.0 y versiones posteriores)
Mixtral 8x7b y Mixtral 8x22b (disponibles en SMP v2.5.0 y versiones posteriores)

**nota**  
Esta FP8 formación sobre la función P5 está disponible en la siguiente combinación de bibliotecas de SageMaker y la biblioteca: PyTorch   
El SDK de SageMaker Python v2.212.0 y versiones posteriores
PyTorch v2.2.0 y versiones posteriores

*FP8*(precisión de punto flotante de 8 bits) es un tipo de datos que se ha convertido en otro paradigma para acelerar el entrenamiento del aprendizaje profundo de los modelos LLM. Con el lanzamiento de la NVIDIA H100 GPUs compatible con FP8 los tipos de datos, puede aprovechar las ventajas de las mejoras de rendimiento de las instancias P5 equipadas con la H100 y, al mismo tiempo GPUs, acelerar el entrenamiento distribuido con un entrenamiento de precisión mixta. FP8 

Además, el tipo de FP8 datos se divide en los formatos E4M3 y E5M2. *E4M3* ofrece mayor precisión, tiene un rango dinámico limitado y es ideal para la pasada hacia delante en entrenamiento de modelos. *E5M2* tiene un rango dinámico más amplio pero menor precisión, y es más adecuado para la pasada hacia atrás, donde la precisión es menos crítica y resulta beneficioso un rango dinámico más amplio. Por lo tanto, le recomendamos que utilice la [receta de la FP8 estrategia híbrida](https://docs.nvidia.com/deeplearning/transformer-engine/user-guide/examples/fp8_primer.html#FP8-recipe) para aprovechar estas características de forma eficaz.

En el caso de los tipos de datos de precisión media (FP16 y BF16), las técnicas de escalado de pérdidas globales, como el escalado de pérdidas estático o el escalado de pérdidas dinámico, solucionan los problemas de convergencia que surgen de la pérdida de información debido al redondeo de los gradientes con precisión media. Sin embargo, el rango dinámico de FP8 es aún más estrecho y las técnicas de escalado de pérdidas globales no son suficientes. En este punto necesitamos una técnica de escalado por tensor más detallada. El *escalado diferido* es una estrategia que selecciona un factor de escalado en función de los valores absolutos máximos observados en varios tensores de iteraciones anteriores. Esta estrategia tiene su contrapartida: aprovecha todas las ventajas de rendimiento de la FP8 computación, pero requiere memoria para mantener el historial de valores máximo de los tensores. Para obtener más información sobre la estrategia de escalado diferido en general, consulte el paper [https://arxiv.org/pdf/2209.05433.pdf](https://arxiv.org/pdf/2209.05433.pdf).

En la práctica, su uso FP8 resulta útil en todos los escenarios de entrenamiento en instancias P5. Recomendamos encarecidamente activarlo FP8 siempre que sea posible para mejorar el rendimiento del entrenamiento.

SMP v2 es compatible con Transformer Engine tal como se entrega. Por lo tanto, cuando ejecute un FP8 entrenamiento con SMP v2 en instancias P5 de SageMaker AI (`ml.p5.48xlarge`), lo único que debe hacer es importar `torch.sagemaker` su script de entrenamiento y seguir usando el paquete Python nativo de Transformer Engine. Para obtener más información sobre el uso de Transformer Engine para el FP8 entrenamiento en general, consulta [Uso FP8 con Transformer Engine](https://docs.nvidia.com/deeplearning/transformer-engine/user-guide/examples/fp8_primer.html) en la documentación de *NVIDIA Transformer Engine*. El siguiente fragmento de código muestra el aspecto que deberían tener las líneas de código para importar la biblioteca SMP y configurarla FP8 en tu script de entrenamiento.

```
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 un ejemplo práctico de FP8 formación con SMP v2 en instancias P5, consulte el cuaderno de ejemplo de [Llama-v2 (o GPT-Neox) en instancias P5 en Accelerate SageMaker PyTorch FSDP Training](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). FP8 

## Entrenamiento de precisión mixto con PyTorch tipos de datos de precisión media mediante FSDP
<a name="model-parallel-core-features-v2-mixed-precision-half-precision"></a>

El SMP v2 es compatible con el [PyTorch FSDP `MixedPrecision`](https://pytorch.org/docs/stable/fsdp.html#torch.distributed.fsdp.MixedPrecision) para tareas de formación en instancias P4 y P5. PyTorch El FSDP ofrece varias configuraciones para lograr una precisión mixta, tanto para mejorar el rendimiento como para reducir la memoria. 

**nota**  
Este entrenamiento de precisión combinada con la función PyTorch FSDP está disponible en la siguiente combinación de bibliotecas de SageMaker y la biblioteca. PyTorch   
SMP v2.0.0 y versiones posteriores
el SDK de SageMaker Python v2.200.0 y versiones posteriores
PyTorch v2.0.1 y versiones posteriores

La forma estándar de configurar un modelo para precisión mixta consiste en crear el modelo en `float32` y, a continuación, permitir que FSDP envíe los parámetros a `float16` o `bfloat16` sobre la marcha pasando una política de `MixedPrecision`, como se muestra en el siguiente fragmento de código. *Para obtener más información sobre las opciones `dtype` para cambiar los parámetros, la reducción o los búferes para obtener una precisión mixta PyTorch, consulte la API del [PyTorch FSDP `MixedPrecision`](https://pytorch.org/docs/stable/fsdp.html#torch.distributed.fsdp.MixedPrecision) en la documentación. 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
)
```

Tenga en cuenta que algunos modelos (como el modelo Transformers Llama de Hugging Face) esperan búferes como `float32`. Para usar `float32`, sustituya `torch.bfloat16` por `torch.float32` en la línea que define el objeto `dtype`.