

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

# 옵티마이저 상태 샤딩
<a name="model-parallel-extended-features-pytorch-optimizer-state-sharding"></a>

*옵티마이저 상태 샤딩*은 옵티마이저 상태(옵티마이저 상태를 설명하는 가중치 세트)를 데이터 병렬 디바이스 그룹 전체에 분할하는 유용한 메모리 절약 기법입니다. 상태 저장 옵티마이저(예: Adam)또는 FP16 옵티마이저(파라미터의 FP16 및 FP32 사본을 모두 저장)를 사용할 때마다 옵티마이저 상태 샤딩을 사용할 수 있습니다.

**참고**  
옵티마이저 상태 샤딩은 SageMaker 모델 병렬 처리 라이브러리 v1.6.0 이상에서 PyTorch에 사용할 수 있습니다.

## 옵티마이저 상태 샤딩 사용 방법
<a name="model-parallel-extended-features-pytorch-optimizer-state-sharding-how-to-use"></a>

`modelparallel` 구성에서 `"shard_optimizer_state": True`를 설정하여 *옵티마이저 상태 샤딩*을 켤 수 있습니다.

이 기능을 켜면 라이브러리는 데이터 병렬도를 기반으로 모델 파라미터 세트를 분할합니다. `i`번째 파티션에 해당하는 그라디언트는 `i`번째 데이터 병렬 랭크에서만 줄어듭니다. `smp.step` 데코레이터 함수에 대한 첫 번째 호출이 끝나면 `smp.DistributedOptimizer`로 래핑된 옵티마이저는 현재 데이터 병렬 랭크의 파티션에 해당하는 파라미터로만 제한되도록 파라미터를 재정의합니다. 재정의된 파라미터를 *가상 파라미터*라고 하며 원본 파라미터와 기본 저장소를 공유합니다. `optimizer.step`으로 처음 호출할 때 이러한 재정의된 파라미터를 기반으로 옵티마이저 상태가 생성되며 이 파라미터는 원래의 파티션 때문에 샤딩됩니다. 옵티마이저 업데이트 후 AllGather 작업(`optimizer.step` 호출의 일부)은 데이터 병렬 랭크에서 실행되어 파라미터 상태를 일관되게 유지합니다.

**작은 정보**  
옵티마이저 상태 샤딩은 데이터 병렬도가 1보다 크고 모델에 10억 개 이상의 파라미터가 있는 경우에 유용합니다.  
데이터 병렬도는 `(processes_per_host * instance_count / pipeline_parallel_degree)`에 의해 계산되며 `smp.dp_size()` 함수는 백그라운드에서 크기 조정을 처리합니다.

**SageMaker PyTorch 예측기 구성**

```
mpi_options = {
    "enabled" : True,
    "processes_per_host" : 8,               # 8 processes
    "custom_mpi_options" : "--mca btl_vader_single_copy_mechanism none "
}

smp_options = {
    "enabled":True,
    "parameters": {
        "microbatches": 4,
        "pipeline_parallel_degree": 2,    # alias for "partitions"
        "placement_strategy": "cluster",
        "tensor_parallel_degree": 2,      # tp over 2 devices
        "ddp": True,
        "shard_optimizer_state": True
    }
}
```

**PyTorch 훈련 스크립트 조정**

*텐서 병렬 처리와 파이프라인 병렬 처리의 결합* 섹션에서 [PyTorch 훈련 스크립트 조정](model-parallel-extended-features-pytorch-tensor-parallelism-examples.md#model-parallel-extended-features-pytorch-tensor-and-pipeline-parallelism-script)을 참조하세요. 스크립트에는 추가 수정이 필요하지 않습니다.