

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# 혼합 정밀도 훈련
<a name="model-parallel-core-features-v2-mixed-precision"></a>

SageMaker 모델 병렬 처리(SMP) 라이브러리 v2는 PyTorch FSDP 및 Transformer Engine과 같은 오픈 소스 프레임워크와 통합하여 즉시 혼합 정밀도 훈련을 지원합니다. 자세한 내용은 다음 주제를 참조하세요.

**Topics**
+ [Transformer Engine을 사용하여 P5 인스턴스에서 FP8과 혼합된 정밀도 훈련](#model-parallel-core-features-v2-mixed-precision-fp8-training-on-p5)
+ [PyTorch FSDP를 사용하여 절반 정밀도 데이터 유형을 사용한 혼합 정밀도 훈련](#model-parallel-core-features-v2-mixed-precision-half-precision)

## Transformer Engine을 사용하여 P5 인스턴스에서 FP8과 혼합된 정밀도 훈련
<a name="model-parallel-core-features-v2-mixed-precision-fp8-training-on-p5"></a>

SageMaker 모델 병렬 처리(SMP) 라이브러리 v2.2.0부터 SMP 라이브러리는 [Transformer Engine](https://docs.nvidia.com/deeplearning/transformer-engine/index.html)과 통합되며 [FP8 혼합 정밀도 훈련](https://docs.nvidia.com/deeplearning/transformer-engine/user-guide/examples/fp8_primer.html)을 즉시 지원하여 [PyTorch FSDP `MixedPrecision`](https://pytorch.org/docs/stable/fsdp.html#torch.distributed.fsdp.MixedPrecision)과의 호환성을 유지합니다. 즉, 혼합 정밀도 훈련에는 PyTorch FSDP를 사용하고 FP8 훈련에는 Transformer Engine을 모두 사용할 수 있습니다. Transformer Engine의 FP8 훈련 기능에서 지원되지 않는 모델 계층의 경우 해당 계층은 PyTorch FSDP 혼합 정밀도로 돌아갑니다.

**참고**  
SMP v2는 다음 Hugging Face 트랜스포머 모델에 대한 FP8 지원을 제공합니다.  
GPT-NeoX(SMP v2.2.0 이상에서 사용 가능)
Llama 2(SMP v2.2.0 이상에서 사용 가능)
Mixtral 8x7b 및 Mixtral 8x22b(SMP v2.5.0 이상에서 사용 가능)

**참고**  
P5 기능에 대한 이 FP8 훈련은 SageMaker 라이브러리와 PyTorch 라이브러리의 다음 조합에서 사용할 수 있습니다.  
SageMaker Python SDK v2.212.0 이상
PyTorch v2.2.0 이상

*FP8*(8비트 부동 소수점 정밀도)은 LLM 모델의 딥 러닝 훈련을 가속화하기 위한 또 다른 패러다임으로 부상한 데이터 유형입니다. FP8 데이터 유형을 지원하는 NVIDIA H100 GPU 릴리스를 사용하면 FP8 혼합 정밀도 훈련을 통해 분산 훈련을 가속화하면서 H100 GPU가 탑재된 P5 인스턴스의 성능 개선의 이점을 누릴 수 있습니다.

FP8 데이터 유형은 E4M3 및 E5M2 형식으로 더 분기됩니다. *E4M3*은 더 나은 정밀도를 제공하고, 제한된 동적 범위를 가지며, 모델 훈련의 순방향 패스에 적합합니다. *E5M2*는 동적 범위가 더 넓지만 정밀도는 낮으며, 정밀도가 덜 중요하고 동적 범위가 더 넓어지면 역방향 패스에 더 적합합니다. 따라서 [하이브리드 FP8 전략 레시피](https://docs.nvidia.com/deeplearning/transformer-engine/user-guide/examples/fp8_primer.html#FP8-recipe)를 사용하여 이러한 특성을 효과적으로 활용하는 것이 좋습니다.

절반 정밀도 데이터 유형(FP16 및 BF16)의 경우 정적 손실 규모 조정 또는 동적 손실 규모 조정과 같은 글로벌 손실 규모 조정 기술은 반정밀도의 반올림 기울기로 인한 정보 손실로 인해 발생하는 수렴 문제를 처리합니다. 그러나 FP8의 동적 범위는 훨씬 좁으며 글로벌 손실 조정 기법으로는 충분하지 않습니다. 이 시점에서는 더 세분화된 텐서별 조정 기법이 필요합니다. *지연된 조정*은 이전 반복을 구성하는 여러 텐서에서 관찰된 최대 절대값을 기반으로 조정 인자를 선택하는 전략입니다. 이 전략에는 절충점이 있습니다. FP8 계산의 전체 성능 이점을 사용하지만 텐서의 최대 가치 기록을 유지하기 위한 메모리가 필요합니다. 일반적으로 지연 조정 전략에 대한 자세한 내용은 [https://arxiv.org/pdf/2209.05433.pdf](https://arxiv.org/pdf/2209.05433.pdf).

실제로 FP8을 사용하면 P5 인스턴스의 모든 훈련 시나리오에서 유용합니다. 훈련 성능을 향상하려면 가능하면 항상 FP8을 활성화하는 것이 좋습니다.

SMP v2는 구입 즉시 트랜스포머 엔진을 지원합니다. 따라서 SageMaker AI(`ml.p5.48xlarge`)의 P5 인스턴스에서 SMP v2로 FP8 훈련을 실행할 때 해야 할 작업은 훈련 스크립트에서 `torch.sagemaker`를 가져오고 기본 변환기 엔진 Python 패키지를 계속 사용하는 것뿐입니다. 일반적으로 FP8 훈련에 트랜스포머 엔진을 사용하는 방법에 대한 자세한 내용은 *NVIDIA 트랜스포머 엔진 설명서*의 [트랜스포머 엔진과 함께 FP8 사용](https://docs.nvidia.com/deeplearning/transformer-engine/user-guide/examples/fp8_primer.html)을 참조하세요. 다음 코드 조각은 훈련 스크립트에서 SMP 라이브러리를 가져오고 FP8을 설정하기 위한 코드 줄이 어떻게 보여야 하는지 보여줍니다.

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

P5 인스턴스에서 SMP v2를 사용한 FP8 훈련의 실제 예를 찾으려면 P5 [ P5 인스턴스에서 FP8을 사용한 Llama-v2(또는 GPT-NeoX)의 Accelerate SageMaker PyTorch FSDP 훈련의 예제 노트북을 참조하세요](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).

## PyTorch FSDP를 사용하여 절반 정밀도 데이터 유형을 사용한 혼합 정밀도 훈련
<a name="model-parallel-core-features-v2-mixed-precision-half-precision"></a>

SMP v2는 P4 및 P5 인스턴스의 훈련 작업에 대해 [PyTorch FSDP `MixedPrecision`](https://pytorch.org/docs/stable/fsdp.html#torch.distributed.fsdp.MixedPrecision)를 지원합니다. PyTorch FSDP는 성능 개선과 메모리 감소를 위한 혼합 정밀도를 위한 다양한 구성을 제공합니다.

**참고**  
PyTorch FSDP 기능을 사용한 이 혼합 정밀도 훈련은 SageMaker 라이브러리와 PyTorch 라이브러리의 다음 조합에서 사용할 수 있습니다.  
SMP v2.0.0 이상
SageMaker Python SDK v2.200.0 이상
PyTorch v2.0.1 이상

혼합 정밀도에 맞게 모델을 구성하는 표준 방법은 `float32`에서 모델을 생성한 다음 코드 조각과 같이 `MixedPrecision` 정책을 전달하여 FSDP가 파라미터를 즉시 `float16` 또는 `bfloat16`에 캐스팅하도록 허용하는 것입니다. PyTorch에서 혼합 정밀도에 대한 파라미터, 감소 또는 버퍼에 대한`dtype` 를 변경하는 옵션에 대한 자세한 내용은 *PyTorch 설명서*의 [PyTorch FSDP `MixedPrecision` API](https://pytorch.org/docs/stable/fsdp.html#torch.distributed.fsdp.MixedPrecision)를 참조하세요.

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

특정 모델(예: Hugging Face 트랜스포머 Llama 모델)은 버퍼를 `float32`로 예상합니다. `float32`를 사용하려면 `dtype` 객체를 정의하는 줄에서 `torch.float32`를 `torch.bfloat16`으로 바꿉니다.