

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

# SageMaker AI 분산형 데이터 병렬화 라이브러리를 사용하여 분산 훈련 실행
<a name="data-parallel"></a>

SageMaker AI 분산 데이터 병렬 처리(SMDDP) 라이브러리는 AWS 인프라에 최적화된 집합 통신 작업을 구현하여 거의 선형적인 조정 효율성으로 딥 러닝 모델에 대한 SageMaker 훈련 기능을 확장합니다.

대규모 언어 모델(LLM) 및 확산 모델과 같은 대규모 기계 학습(ML) 모델을 대규모 훈련 데이터세트에서 훈련할 때 ML 실무자는 액셀러레이터 및 분산 훈련 기법의 클러스터를 사용하여 각 GPU 메모리에 적합하지 않은 모델의 메모리 제약 조건을 훈련하거나 해결하는 시간을 줄입니다. ML 실무자는 단일 인스턴스에서 여러 액셀러레이터로 시작한 다음 워크로드 요구 사항이 증가함에 따라 인스턴스 클러스터로 확장하는 경우가 많습니다. 클러스터 크기가 증가함에 따라 여러 노드 간의 통신 오버헤드도 감소하여 전반적인 컴퓨팅 성능이 저하됩니다.

이러한 오버헤드 및 메모리 문제를 해결하기 위해 SMDDP 라이브러리는 다음을 제공합니다.
+ SMDDP 라이브러리는 AWS 네트워크 인프라 및 Amazon SageMaker AI ML 인스턴스 토폴로지에 대한 훈련 작업을 최적화합니다.
+ SMDDP 라이브러리는 및 AWS 인프라에 최적화된 `AllReduce` `AllGather` 집합 통신 작업을 구현하여 노드 간 통신을 개선합니다.

SMDDP 라이브러리 제공에 대한 자세한 내용을 알아보려면 [SageMaker AI의 분산형 데이터 병렬화 라이브러리 알아보기](data-parallel-intro.md)로 진행하세요.

SageMaker AI에서 제공하는 모델 병렬 전략을 사용한 훈련에 대한 자세한 내용은 [(보관됨) SageMaker 모델 병렬 처리 라이브러리 v1.x](model-parallel.md) 섹션을 참조하세요.

**Topics**
+ [SageMaker AI의 분산형 데이터 병렬화 라이브러리 알아보기](data-parallel-intro.md)
+ [지원되는 프레임워크 AWS 리전및 인스턴스 유형](distributed-data-parallel-support.md)
+ [SageMaker AI 분산형 데이터 병렬화 라이브러리를 사용한 분산 훈련](data-parallel-modify-sdp.md)
+ [Amazon SageMaker AI 데이터 병렬화 라이브러리 예시](distributed-data-parallel-v2-examples.md)
+ [SageMaker AI 분산 데이터 병렬화 라이브러리의 구성에 관한 팁](data-parallel-config.md)
+ [Amazon SageMaker AI 분산형 데이터 병렬화 라이브러리 관련 자주 묻는 질문](data-parallel-faq.md)
+ [Amazon SageMaker AI의 분산 훈련에 관한 문제 해결](distributed-troubleshooting-data-parallel.md)
+ [SageMaker AI 데이터 병렬 처리 라이브러리 릴리스 정보](data-parallel-release-notes.md)

# SageMaker AI의 분산형 데이터 병렬화 라이브러리 알아보기
<a name="data-parallel-intro"></a>

SageMaker AI 분산형 데이터 병렬화(SMDDP) 라이브러리는 분산 데이터 병렬 훈련의 컴퓨팅 성능을 개선하는 집합 통신 라이브러리입니다. SMDDP 라이브러리는 다음을 제공하여 키 집합 통신 작업의 통신 오버헤드를 해결합니다.

1. 라이브러리는에 `AllReduce` 최적화되어 있습니다 AWS. `AllReduce`는 분산 데이터 훈련 중에 각 훈련 반복이 끝날 때 GPUs에서 그라데이션을 동기화하는 데 사용되는 주요 작업입니다.

1. 라이브러리는에 `AllGather` 최적화된를 제공합니다 AWS. `AllGather`는 샤딩된 데이터 병렬 훈련에 사용되는 또 다른 키 작업으로, SageMaker AI 모델 병렬 처리(SMP) 라이브러리, DeepSpeed Zero Redundancy Optimizer(ZeRO) 및 PyTorch 완전 샤딩된 데이터 병렬 처리(FSDP)와 같은 인기 있는 라이브러리에서 제공하는 메모리 효율적인 데이터 병렬 처리 기법입니다.

1. 라이브러리는 AWS 네트워크 인프라와 Amazon EC2 인스턴스 토폴로지를 완전히 활용하여 최적화된 node-to-node 통신을 수행합니다.

SMDDP 라이브러리는 거의 선형적인 조정 효율성과 함께 훈련 클러스터를 확장할 때 성능을 개선하여 훈련 속도를 높일 수 있습니다.

**참고**  
SageMaker AI 분산 훈련 라이브러리는 SageMaker 훈련 플랫폼 내의 PyTorch 및 Hugging Face용 AWS 딥 러닝 컨테이너를 통해 사용할 수 있습니다. 이 라이브러리를 사용하려면 Python(Boto3)용 SDK 또는 AWS Command Line Interface을 통해 SageMaker Python SDK 또는 SageMaker API를 사용해야 합니다. 지침과 예제는 설명서 전반에 걸쳐 SageMaker Python SDK를 사용하여 분산형 훈련 라이브러리를 사용하는 방법에 중점을 둡니다.

## AWS 컴퓨팅 리소스 및 네트워크 인프라에 최적화된 SMDDP 집합 통신 작업
<a name="data-parallel-collective-operations"></a>

SMDDP 라이브러리는 AWS 컴퓨팅 리소스 `AllReduce` 및 네트워크 인프라에 최적화된 및 `AllGather` 집합 작업의 구현을 제공합니다.

### SMDDP `AllReduce` 집합 작업
<a name="data-parallel-allreduce"></a>

SMDDP 라이브러리는 역방향 패스와 `AllReduce` 작업을 최적으로 중첩하여 GPU 사용률을 크게 개선합니다. CPU와 GPU 간 커널 작업을 최적화하여 선형에 가까운 스케일링 효율과 보다 빠른 훈련 속도를 달성합니다. GPU가 추가 GPU 사이클을 제거하지 않고 그래디언트를 계산하는 동안 이 라이브러리는 병렬로 `AllReduce`를 수행하므로 라이브러리가 더 빠른 학습을 달성할 수 있습니다.
+  *CPU 활용*: 라이브러리는 CPU를 사용하여 그래디언트를 하여 GPU에서 이 작업을 오프로드합니다.
+ *향상된 GPU 사용*: 클러스터의 GPU가 컴퓨팅 그래디언트에 집중하여 훈련 전반에 걸쳐 활용도를 높입니다.

다음은 SMDDP `AllReduce` 작업의 상위 수준 워크플로입니다.

1. 이 라이브러리는 GPU(작업자)에 순위를 할당합니다.

1. 각 반복에서 이 라이브러리는 각 글로벌 배치를 총 워커 수(월드 사이즈)로 나누고 작업자에게 작은 배치(배치 샤드)를 할당합니다.
   + 글로벌 배치의 크기는 `(number of nodes in a cluster) * (number of GPUs per node) * (per batch shard)`입니다.
   + 배치 샤드(소규모 배치)는 반복별로 각 GPU(작업자)에 할당되는 데이터세트의 하위 집합입니다.

1. 이 라이브러리는 각 작업자에 대해 훈련 스크립트를 실행합니다.

1. 이 라이브러리는 모든 반복이 끝날 때마다 작업자의 모델 가중치 및 그래디언트 사본을 관리합니다.

1. 이 라이브러리는 작업자 전체의 모델 가중치와 그래디언트를 동기화하여 훈련된 단일 모델을 집계합니다.

아래의 아키텍처 다이어그램은 이 라이브러리가 3개 노드로 구성된 클러스터에 대해 데이터 병렬화를 설정하는 방법의 예를 보여줍니다.

 

![\[SMDDP AllReduce 및 데이터 병렬 아키텍처 다이어그램\]](http://docs.aws.amazon.com/ko_kr/sagemaker/latest/dg/images/distributed/data-parallel/sdp-architecture.png)


### SMDDP `AllGather` 집합 작업
<a name="data-parallel-allgather"></a>

`AllGather`는 각 작업자가 입력 버퍼로 시작한 다음 다른 모든 작업자의 입력 버퍼를 출력 버퍼로 연결하거나 *수집*하는 집합 작업입니다.

**참고**  
SMDDP `AllGather` 집합 작업은 `smdistributed-dataparallel>=2.0.1` 및 PyTorch v2.0.1 이상용 AWS DLC(Deep Learning Containers)에서 사용할 수 있습니다.

`AllGather`는 각 개별 작업자가 모델의 일부를 보유하거나 샤딩된 계층을 보유하는 샤딩된 데이터 병렬 처리와 같은 분산 훈련 기법에 많이 사용됩니다. 작업자는 전달 및 역방향 전달하기 전에 `AllGather`를 호출하여 샤딩된 계층을 재구성합니다. 파라미터가 *모두 수집된* 후 순방향 및 역방향 패스는 계속됩니다. 백워드 패스 중에 각 작업자는 `ReduceScatter`를 호출하여 그라데이션을 수집(감소)하고 그라데이션 샤드로 분할(산란)하여 해당 샤딩된 계층을 업데이트합니다. 샤딩된 데이터 병렬 처리에서 이러한 집합 작업의 역할에 대한 자세한 내용은 [샤딩된 데이터 병렬 처리에 대한 SMP 라이브러리의 구현](https://docs.aws.amazon.com/sagemaker/latest/dg/model-parallel-extended-features-pytorch-sharded-data-parallelism.html), DeepSpeed 설명서의 [ZeRO](https://deepspeed.readthedocs.io/en/latest/zero3.html#) 및 [PyTorch 완전 샤딩된 데이터 병렬 처리](https://engineering.fb.com/2021/07/15/open-source/fsdp/)에 대한 블로그를 참조하세요.

AllGather와 같은 공동 작업은 모든 반복에서 호출되므로 GPU 통신 오버헤드의 주요 기여자입니다. 이러한 집합 작업을 더 빠르게 계산하면 수렴에 대한 부작용 없이 훈련 시간이 단축됩니다. 이를 위해 SMDDP 라이브러리는 [P4d 인스턴스](https://aws.amazon.com/ec2/instance-types/p4/)에 최적화된 `AllGather`를 제공합니다.

SMDDP`AllGather`는 다음 기법을 사용하여 P4d 인스턴스의 계산 성능을 개선합니다.

1. 메시 토폴로지를 사용하여 [EFA(Elastic Fabric Adapter)](https://aws.amazon.com/hpc/efa/) 네트워크를 통해 인스턴스(노드 간) 간에 데이터를 전송합니다. EFA는 지연 시간이 AWS 짧고 처리량이 많은 네트워크 솔루션입니다. 노드 간 네트워크 통신을 위한 메시 토폴로지는 EFA 및 AWS 네트워크 인프라의 특성에 더 잘 맞게 조정됩니다. 여러 패킷 홉이 포함된 NCCL 링 또는 트리 토폴로지와 비교하여 SMDDP는 하나의 홉만 필요하므로 여러 홉의 지연 시간을 축적하지 않습니다. SMDDP는 메시 토폴로지에서 각 통신 피어에 대한 워크로드의 균형을 맞추고 더 높은 글로벌 네트워크 처리량을 달성하는 네트워크 속도 제어 알고리즘을 구현합니다.

1. NVIDIA [GPUDirect RDMA 기술(GDRCopy)을 기반으로 지연 시간이 짧은 GPU 메모리 복사 라이브러리 GDRCopy](https://github.com/NVIDIA/gdrcopy)를 채택하여 로컬 NVLink 및 EFA 네트워크 트래픽을 조정합니다. NVIDIA에서 제공하는 지연 시간이 짧은 GPU 메모리 복사 라이브러리인 GDRCopy는 CPU 프로세스와 GPU CUDA 커널 간의 지연 시간이 짧은 통신을 제공합니다. 이 기술을 사용하면 SMDDP 라이브러리가 노드 내 및 노드 간 데이터 이동을 파이프라인화할 수 있습니다.

1. GPU 스트리밍 멀티프로세서의 사용량을 줄여 모델 커널을 실행하기 위한 컴퓨팅 성능을 높입니다. P4d 및 P4de 인스턴스에는 각각 108개의 스트리밍 멀티프로세서가 있는 NVIDIA A100 GPUs가 탑재되어 있습니다. NCCL은 집합 작업을 실행하는 데 최대 24개의 스트리밍 멀티프로세서를 사용하지만 SMDDP는 9개 미만의 스트리밍 멀티프로세서를 사용합니다. 모델 컴퓨팅 커널은 더 빠른 계산을 위해 저장된 스트리밍 멀티프로세서를 선택합니다.

# 지원되는 프레임워크 AWS 리전및 인스턴스 유형
<a name="distributed-data-parallel-support"></a>

SageMaker AI 분산 데이터 병렬 처리(SMDDP) 라이브러리를 사용하기 전에 지원되는 ML 프레임워크 및 인스턴스 유형과 AWS 계정 및에 충분한 할당량이 있는지 확인합니다 AWS 리전.

## 지원되는 프레임워크
<a name="distributed-data-parallel-supported-frameworks"></a>

다음 표는 SageMaker AI와 SMDDP가 지원하는 딥 러닝 프레임워크와 해당 버전을 보여줍니다. SMDDP 라이브러리는 [SageMaker AI 프레임워크 컨테이너](https://github.com/aws/deep-learning-containers/blob/master/available_images.md#sagemaker-framework-containers-sm-support-only)에서 사용할 수 있으며, [SageMaker 모델 병렬화(SMP) 라이브러리 v2에 의해 배포된 Docker 컨테이너](distributed-model-parallel-support-v2.md#distributed-model-parallel-supported-frameworks-v2)에 통합되거나 바이너리 파일로 다운로드할 수 있습니다.

**참고**  
SMDDP 라이브러리의 최신 업데이트 및 릴리스 정보를 확인하려면 [SageMaker AI 데이터 병렬 처리 라이브러리 릴리스 정보](data-parallel-release-notes.md) 섹션을 참조하세요.

**Topics**
+ [PyTorch](#distributed-data-parallel-supported-frameworks-pytorch)
+ [PyTorch Lightning](#distributed-data-parallel-supported-frameworks-lightning)
+ [Hugging Face 트랜스포머](#distributed-data-parallel-supported-frameworks-transformers)
+ [TensorFlow(사용되지 않음)](#distributed-data-parallel-supported-frameworks-tensorflow)

### PyTorch
<a name="distributed-data-parallel-supported-frameworks-pytorch"></a>


| PyTorch 버전 | SMDDP 라이브러리 버전 | SMDDP가 사전 설치된 SageMaker AI 프레임워크 컨테이너 이미지 | SMDDP가 사전 설치된 SMP Docker 이미지 | 바이너리 파일의 URL\$1\$1 | 
| --- | --- | --- | --- | --- | 
| v2.3.1 | smdistributed-dataparallel==v2.5.0 | 사용할 수 없음 | 658645717510.dkr.ecr.<us-west-2>.amazonaws.com/smdistributed-modelparallel:2.4.1-gpu-py311-cu121 | https://smdataparallel.s3.amazonaws.com/binary/pytorch/2.4.1/cu121/2024-10-09/smdistributed\$1dataparallel-2.5.0-cp311-cp311-linux\$1x86\$164.whl | 
| v2.3.0 | smdistributed-dataparallel==v2.3.0 | 763104351884.dkr.ecr.<region>.amazonaws.com/pytorch-training:2.3.0-gpu-py311-cu121-ubuntu20.04-sagemaker | 현재 사용할 수 없음 | https://smdataparallel.s3.amazonaws.com/binary/pytorch/2.3.0/cu121/2024-05-23/smdistributed\$1dataparallel-2.3.0-cp311-cp311-linux\$1x86\$164.whl | 
| v2.2.0 | smdistributed-dataparallel==v2.2.0 | 763104351884.dkr.ecr.<region>.amazonaws.com/pytorch-training:2.2.0-gpu-py310-cu121-ubuntu20.04-sagemaker | 658645717510.dkr.ecr.<region>.amazonaws.com/smdistributed-modelparallel:2.2.0-gpu-py310-cu121 | https://smdataparallel.s3.amazonaws.com/binary/pytorch/2.2.0/cu121/2024-03-04/smdistributed\$1dataparallel-2.2.0-cp310-cp310-linux\$1x86\$164.whl | 
| v2.1.0 | smdistributed-dataparallel==v2.1.0 | 763104351884.dkr.ecr.<region>.amazonaws.com/pytorch-training:2.1.0-gpu-py310-cu121-ubuntu20.04-sagemaker | 658645717510.dkr.ecr.<region>.amazonaws.com/smdistributed-modelparallel:2.1.2-gpu-py310-cu121 | https://smdataparallel.s3.amazonaws.com/binary/pytorch/2.1.0/cu121/2024-02-04/smdistributed\$1dataparallel-2.1.0-cp310-cp310-linux\$1x86\$164.whl | 
| v2.0.1 | smdistributed-dataparallel==v2.0.1 | 763104351884.dkr.ecr.<region>.amazonaws.com/pytorch-training:2.0.1-gpu-py310-cu118-ubuntu20.04-sagemaker | 사용할 수 없음 | https://smdataparallel.s3.amazonaws.com/binary/pytorch/2.0.1/cu118/2023-12-07/smdistributed\$1dataparallel-2.0.2-cp310-cp310-linux\$1x86\$164.whl | 
| v2.0.0 | smdistributed-dataparallel==v1.8.0 | 763104351884.dkr.ecr.<region>.amazonaws.com/pytorch-training:2.0.0-gpu-py310-cu118-ubuntu20.04-sagemaker | 사용할 수 없음 | https://smdataparallel.s3.amazonaws.com/binary/pytorch/2.0.0/cu118/2023-03-20/smdistributed\$1dataparallel-1.8.0-cp310-cp310-linux\$1x86\$164.whl | 
| v1.13.1 | smdistributed-dataparallel==v1.7.0 | 763104351884.dkr.ecr.<region>.amazonaws.com/pytorch-training:1.13.1-gpu-py39-cu117-ubuntu20.04-sagemaker | 사용할 수 없음 | https://smdataparallel.s3.amazonaws.com/binary/pytorch/1.13.1/cu117/2023-01-09/smdistributed\$1dataparallel-1.7.0-cp39-cp39-linux\$1x86\$164.whl | 
| v1.12.1 | smdistributed-dataparallel==v1.6.0 | 763104351884.dkr.ecr.<region>.amazonaws.com/pytorch-training:1.12.1-gpu-py38-cu113-ubuntu20.04-sagemaker | 사용할 수 없음 | https://smdataparallel.s3.amazonaws.com/binary/pytorch/1.12.1/cu113/2022-12-05/smdistributed\$1dataparallel-1.6.0-cp38-cp38-linux\$1x86\$164.whl | 
| v1.12.0 | smdistributed-dataparallel==v1.5.0 | 763104351884.dkr.ecr.<region>.amazonaws.com/pytorch-training:1.12.0-gpu-py38-cu113-ubuntu20.04-sagemaker | 사용할 수 없음 | https://smdataparallel.s3.amazonaws.com/binary/pytorch/1.12.0/cu113/2022-07-01/smdistributed\$1dataparallel-1.5.0-cp38-cp38-linux\$1x86\$164.whl | 
| v1.11.0 | smdistributed-dataparallel==v1.4.1 | 763104351884.dkr.ecr.<region>.amazonaws.com/pytorch-training:1.11.0-gpu-py38-cu113-ubuntu20.04-sagemaker | 사용할 수 없음 | https://smdataparallel.s3.amazonaws.com/binary/pytorch/1.11.0/cu113/2022-04-14/smdistributed\$1dataparallel-1.4.1-cp38-cp38-linux\$1x86\$164.whl | 

\$1\$1 바이너리 파일의 URL은 SMDDP 라이브러리를 사용자 지정 컨테이너에 설치하기 위한 것입니다. 자세한 내용은 [SageMaker AI 분산 데이터 병렬 라이브러리로 자체 Docker 컨테이너 만들기](data-parallel-bring-your-own-container.md) 단원을 참조하십시오.

**참고**  
SMDDP 라이브러리는 [SageMaker AI 프레임워크 컨테이너](https://github.com/aws/deep-learning-containers/blob/master/available_images.md#sagemaker-framework-containers-sm-support-only)와 [SMP Docker 이미지가](distributed-model-parallel-support-v2.md) 사용 AWS 리전 중인에서 사용할 수 있습니다.

**참고**  
SMDDP 라이브러리 v1.4.0 이상은 PyTorch 분산(torch.distributed) 데이터 병렬화(torch.parallel.DistributedDataParallel)의 백엔드로 작동합니다. 변경 사항에 따라 PyTorch 분산형 패키지를 위한 다음과 같은 [smdistributed API](https://sagemaker.readthedocs.io/en/stable/api/training/sdp_versions/latest/smd_data_parallel_pytorch.html#pytorch-api)는 더 이상 사용되지 않습니다.  
`smdistributed.dataparallel.torch.distributed`는 더 이상 사용되지 않습니다. [torch.distributed](https://pytorch.org/docs/stable/distributed.html) 패키지를 대신 사용하세요.
`smdistributed.dataparallel.torch.parallel.DistributedDataParallel`는 더 이상 사용되지 않습니다. 대신 [torch.nn.Parallel.DistributedDataParallel](https://pytorch.org/docs/stable/generated/torch.nn.parallel.DistributedDataParallel.html) API를 사용하세요.
이전 버전의 라이브러리(v1.3.0 또는 이전 버전)를 사용해야 하는 경우 *SageMaker AI Python SDK 설명서*에서 [아카이브된 SageMaker AI 분산형 데이터 병렬화 설명서](https://sagemaker.readthedocs.io/en/stable/api/training/sdp_versions/latest.html#documentation-archive)를 참조하세요.

### PyTorch Lightning
<a name="distributed-data-parallel-supported-frameworks-lightning"></a>

SMDDP 라이브러리는 PyTorch용 다음 SageMaker AI 프레임워크 컨테이너 및 SMP Docker 컨테이너에서 PyTorch Lightning에 사용할 수 있습니다.

**PyTorch Lightning v2**


| PyTorch Lightning 버전 | PyTorch 버전 | SMDDP 라이브러리 버전 | SMDDP가 사전 설치된 SageMaker AI 프레임워크 컨테이너 이미지 | SMDDP가 사전 설치된 SMP Docker 이미지 | 바이너리 파일의 URL\$1\$1 | 
| --- | --- | --- | --- | --- | --- | 
| 2.2.5 | 2.3.0 | smdistributed-dataparallel==v2.3.0 | 763104351884.dkr.ecr.<region>.amazonaws.com/pytorch-training:2.3.0-gpu-py311-cu121-ubuntu20.04-sagemaker | 현재 사용할 수 없음 | https://smdataparallel.s3.amazonaws.com/binary/pytorch/2.3.0/cu121/2024-05-23/smdistributed\$1dataparallel-2.3.0-cp311-cp311-linux\$1x86\$164.whl | 
| 2.2.0 | 2.2.0 | smdistributed-dataparallel==v2.2.0 | 763104351884.dkr.ecr.<region>.amazonaws.com/pytorch-training:2.2.0-gpu-py310-cu121-ubuntu20.04-sagemaker | 658645717510.dkr.ecr.<region>.amazonaws.com/smdistributed-modelparallel:2.2.0-gpu-py310-cu121 | https://smdataparallel.s3.amazonaws.com/binary/pytorch/2.2.0/cu121/2024-03-04/smdistributed\$1dataparallel-2.2.0-cp310-cp310-linux\$1x86\$164.whl | 
| 2.1.2 | 2.1.0 | smdistributed-dataparallel==v2.1.0 | 763104351884.dkr.ecr.<region>.amazonaws.com/pytorch-training:2.1.0-gpu-py310-cu121-ubuntu20.04-sagemaker | 658645717510.dkr.ecr.<region>.amazonaws.com/smdistributed-modelparallel:2.1.2-gpu-py310-cu121 | https://smdataparallel.s3.amazonaws.com/binary/pytorch/2.1.0/cu121/2024-02-04/smdistributed\$1dataparallel-2.1.0-cp310-cp310-linux\$1x86\$164.whl | 
| 2.1.0 | 2.0.1 | smdistributed-dataparallel==v2.0.1 | 763104351884.dkr.ecr.<region>.amazonaws.com/pytorch-training:2.0.1-gpu-py310-cu118-ubuntu20.04-sagemaker | 사용할 수 없음 | https://smdataparallel.s3.amazonaws.com/binary/pytorch/2.0.1/cu118/2023-12-07/smdistributed\$1dataparallel-2.0.2-cp310-cp310-linux\$1x86\$164.whl | 

**PyTorch Lightning v1**


| PyTorch Lightning 버전 | PyTorch 버전 | SMDDP 라이브러리 버전 | SMDDP가 사전 설치된 SageMaker AI 프레임워크 컨테이너 이미지 | 바이너리 파일의 URL\$1\$1 | 
| --- | --- | --- | --- | --- | 
|  1.7.2 1.7.0 1.6.4 1.6.3 1.5.10  | 1.12.0 | smdistributed-dataparallel==v1.5.0 | 763104351884.dkr.ecr.<region>.amazonaws.com/pytorch-training:1.12.0-gpu-py38-cu113-ubuntu20.04-sagemaker | https://smdataparallel.s3.amazonaws.com/binary/pytorch/1.12.0/cu113/2022-07-01/smdistributed\$1dataparallel-1.5.0-cp38-cp38-linux\$1x86\$164.whl | 

\$1\$1 바이너리 파일의 URL은 SMDDP 라이브러리를 사용자 지정 컨테이너에 설치하기 위한 것입니다. 자세한 내용은 [SageMaker AI 분산 데이터 병렬 라이브러리로 자체 Docker 컨테이너 만들기](data-parallel-bring-your-own-container.md) 섹션을 참조하세요.

**참고**  
PyTorch Lightning 및 Lightning Bolts와 같은 유틸리티 라이브러리는 PyTorch DLC에 사전 설치되어 있지 않습니다. SageMaker AI PyTorch 예측기를 구문화하고 [2단계](https://docs.aws.amazon.com/sagemaker/latest/dg/data-parallel-use-api.html#data-parallel-framework-estimator)에서 훈련 작업 요청을 제출하는 경우, SageMaker AI PyTorch 훈련 컨테이너에 `pytorch-lightning` 및 `lightning-bolts`를 설치하도록 `requirements.txt`를 제공해야 합니다.  

```
# requirements.txt
pytorch-lightning
lightning-bolts
```
훈련 스크립트 및 작업 제출과 함께 `requirements.txt` 파일을 배치할 소스 디렉터리를 지정하는 방법에 대한 자세한 내용은 *Amazon SageMaker AI Python SDK 설명서*의 [서드 파티 라이브러리 사용](https://sagemaker.readthedocs.io/en/stable/frameworks/pytorch/using_pytorch.html#id12)을 참조하세요.

### Hugging Face 트랜스포머
<a name="distributed-data-parallel-supported-frameworks-transformers"></a>

Hugging Face용 AWS 딥 러닝 컨테이너는 PyTorch 및 TensorFlow용 SageMaker 훈련 컨테이너를 기본 이미지로 사용합니다. Hugging Face Transformer 라이브러리 버전과 페어링된 PyTorch 및 TensorFlow 버전을 찾아보려면 최신 [Hugging Face Container](https://github.com/aws/deep-learning-containers/blob/master/available_images.md#huggingface-training-containers) 및 [이전 Hugging Face Container 버전](https://github.com/aws/deep-learning-containers/blob/master/available_images.md#prior-hugging-face-container-versions)을 참조하세요.

### TensorFlow(사용되지 않음)
<a name="distributed-data-parallel-supported-frameworks-tensorflow"></a>

**중요**  
SMDDP 라이브러리는 TensorFlow에 대한 지원을 중단했으며 v2.11.0 이후 TensorFlow용 DLCs에서 더 이상 사용할 수 없습니다. 다음 표에는 SMDDP 라이브러리가 설치된 TensorFlow용 이전 DLCs가 나열되어 있습니다.


| TensorFlow 버전 | SMDDP 라이브러리 버전 | 
| --- | --- | 
| 2.9.1, 2.10.1, 2.11.0 |  smdistributed-dataparallel==v1.4.1  | 
| 2.8.3 |  smdistributed-dataparallel==v1.3.0  | 

## AWS 리전
<a name="distributed-data-parallel-availablity-zone"></a>

SMDDP 라이브러리는 [AWS SageMaker AI용 딥 러닝 컨테이너](https://github.com/aws/deep-learning-containers/blob/master/available_images.md#sagemaker-framework-containers-sm-support-only)와 [SMP Docker 이미지가](distributed-model-parallel-support-v2.md) 사용 AWS 리전 중인 모든에서 사용할 수 있습니다.

## 지원되는 인스턴스 유형
<a name="distributed-data-parallel-supported-instance-types"></a>

SMDDP 라이브러리에는 다음과 같은 인스턴스 유형 중 하나가 필요합니다.


| 인스턴스 유형 | 
| --- | 
| ml.p3dn.24xlarge\$1 | 
| ml.p4d.24xlarge | 
| ml.p4de.24xlarge | 

**작은 정보**  
EFA 지원 인스턴스 유형에 대한 분산 훈련을 올바르게 실행하려면 VPC의 보안 그룹을 설정하여 보안 그룹 자체에서 모든 인바운드 및 아웃바운드 트래픽을 허용하여 인스턴스 간 트래픽을 활성화해야 합니다. 보안 그룹 규칙을 설정하는 방법을 알아보려면 *Amazon EC2 사용 설명서*의 [1단계: EFA 지원 보안 그룹 준비](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/efa-start.html#efa-start-security)를 참조하세요.

**중요**  
\$1 SMDDP 라이브러리는 P3 인스턴스에서 집합 통신 작업을 최적화하기 위한 지원을 중단했습니다. `ml.p3dn.24xlarge` 인스턴스에서 SMDDP 최적화 `AllReduce` 집합체를 계속 활용할 수 있지만 이 인스턴스 유형의 성능을 개선하기 위한 추가 개발 지원은 없습니다. SMDDP 최적화 `AllGather` 집합체는 P4 인스턴스에서만 사용할 수 있습니다.

인스턴스 유형의 사양은 [Amazon EC2 인스턴스 유형 페이지](https://aws.amazon.com/ec2/instance-types/)의 **가속 컴퓨팅** 섹션을 참조하세요. 인스턴스 요금에 대한 자세한 내용은 [Amazon SageMaker 요금](https://aws.amazon.com/sagemaker/pricing/)을 참조하세요.

다음과 유사한 오류 메시지가 나타나는 경우 [SageMaker AI 리소스에 대한 서비스 할당량 증가 요청](https://docs.aws.amazon.com/sagemaker/latest/dg/regions-quotas.html#service-limit-increase-request-procedure)에 나와 있는 설명을 따릅니다.

```
ResourceLimitExceeded: An error occurred (ResourceLimitExceeded) when calling
the CreateTrainingJob operation: The account-level service limit 'ml.p3dn.24xlarge
for training job usage' is 0 Instances, with current utilization of 0 Instances
and a request delta of 1 Instances.
Please contact AWS support to request an increase for this limit.
```

# SageMaker AI 분산형 데이터 병렬화 라이브러리를 사용한 분산 훈련
<a name="data-parallel-modify-sdp"></a>

SageMaker AI 분산형 데이터 병렬화(SMDDP) 라이브러리는 사용하기 쉽고 PyTorch와 원활하게 통합되도록 설계되었습니다.

SageMaker AI에서 SMDDP 라이브러리를 사용하여 딥 러닝 모델을 훈련시키면 사용자는 훈련 스크립트 작성과 모델 훈련에 중점을 둘 수 있습니다.

시작하려면 SMDDP 라이브러리를 가져와 AWS에 최적화된 집합 작업을 사용합니다. 다음 주제에서는 최적화하려는 집합 작업에 따라 훈련 스크립트에 추가할 항목에 대한 지침을 제공합니다.

**Topics**
+ [SMDDP 집합 작업을 사용하도록 훈련 스크립트 조정](data-parallel-modify-sdp-select-framework.md)
+ [SageMaker Python SDK를 사용하여 SMDDP로 분산 훈련 작업 시작](data-parallel-use-api.md)

# SMDDP 집합 작업을 사용하도록 훈련 스크립트 조정
<a name="data-parallel-modify-sdp-select-framework"></a>

이 섹션에 제공된 훈련 스크립트 예시는 간소화되었으며 훈련 스크립트에서 SageMaker AI 분산형 데이터 병렬화(SMDDP) 라이브러리를 사용하는 데 필요한 변경 사항만 강조 표시합니다. SMDDP 라이브러리를 사용하여 분산 훈련 작업을 실행하는 방법을 보여주는 엔드 투 엔드 Jupyter 노트북 예제는 [Amazon SageMaker AI 데이터 병렬화 라이브러리 예시](distributed-data-parallel-v2-examples.md) 섹션을 참조하세요.

**Topics**
+ [PyTorch 훈련 스크립트에서 SMDDP 라이브러리 사용](data-parallel-modify-sdp-pt.md)
+ [PyTorch Lightning 훈련 스크립트에서 SMDDP 라이브러리 사용](data-parallel-modify-sdp-pt-lightning.md)
+ [TensorFlow 훈련 스크립트에서 SMDDP 라이브러리 사용(사용되지 않음)](data-parallel-modify-sdp-tf2.md)

# PyTorch 훈련 스크립트에서 SMDDP 라이브러리 사용
<a name="data-parallel-modify-sdp-pt"></a>

SageMaker AI 분산형 데이터 병렬화(SMDDP) 라이브러리 v1.4.0부터 이 라이브러리를 [PyTorch 분산형 패키지](https://pytorch.org/tutorials/beginner/dist_overview.html)의 백엔드 옵션으로 사용할 수 있습니다. SMDDP `AllReduce` 및 `AllGather` 집합 작업을 사용하려면 훈련 스크립트 시작 시 SMDDP 라이브러리를 가져와서 프로세스 그룹 초기화 중에 SMDDP를 PyTorch 분산 모듈의 백엔드로 설정하기만 하면 됩니다. 한 줄의 백엔드 사양을 사용하면 모든 기본 PyTorch 분산 모듈과 전체 훈련 스크립트를 변경하지 않을 수 있습니다. 다음 코드 조각은 SMDDP 라이브러리를 [PyTorch 분산 데이터 병렬(DDP)](https://pytorch.org/docs/stable/notes/ddp.html), [PyTorch 완전 샤딩 데이터 병렬(FSDP)](https://pytorch.org/docs/stable/fsdp.html), [DeepSpeed](https://github.com/microsoft/DeepSpeed) 및 [Megatron-DeepSpeed](https://github.com/microsoft/Megatron-DeepSpeed) 등 PyTorch 기반 분산 훈련 패키지의 백엔드로 사용하는 방법을 보여줍니다.

## PyTorch DDP 또는 FSDP의 경우
<a name="data-parallel-enable-for-ptddp-ptfsdp"></a>

다음과 같이 프로세스 그룹을 초기화합니다.

```
import torch.distributed as dist
import smdistributed.dataparallel.torch.torch_smddp

dist.init_process_group(backend="smddp")
```

**참고**  
(PyTorch DDP 작업에만 해당)`smddp` 백엔드는 현재 `torch.distributed.new_group()` API를 사용한 하위 프로세스 그룹 생성을 지원하지 않습니다. `smddp` 백엔드는 `NCCL` 및 `Gloo` 같은 다른 프로세스 그룹 백엔드와 동시에 사용할 수 없습니다.

## DeepSpeed 또는 Megatron-DeepSpeed의 경우
<a name="data-parallel-enable-for-deepspeed"></a>

다음과 같이 프로세스 그룹을 초기화합니다.

```
import deepspeed
import smdistributed.dataparallel.torch.torch_smddp

deepspeed.init_distributed(dist_backend="smddp")
```

**참고**  
[SageMaker Python SDK를 사용하여 SMDDP로 분산 훈련 작업 시작](data-parallel-use-api.md)의 `mpirun` 기반 런처(`smdistributed` 및 `pytorchddp`)와 함께 SMDDP `AllGather`를 사용하려면 훈련 스크립트에서 다음 환경 변수도 설정해야 합니다.  

```
export SMDATAPARALLEL_OPTIMIZE_SDP=true
```

PyTorch FSDP 훈련 스크립트 작성에 대한 일반적인 지침은 PyTorch 설명서의 [FSDP(Fully Sharded Data Parallel)를 사용한 고급 모델 훈련](https://pytorch.org/tutorials/intermediate/FSDP_adavnced_tutorial.html)을 참조하세요.

PyTorch DDP 훈련 스크립트 작성에 대한 일반 지침은 PyTorch 설명서의 [분산 데이터 병렬 시작하기](https://pytorch.org/tutorials/intermediate/ddp_tutorial.html)를 참조하세요.

훈련 스크립트 조정을 완료한 후 [SageMaker Python SDK를 사용하여 SMDDP로 분산 훈련 작업 시작](data-parallel-use-api.md) 섹션으로 넘어갑니다.

# PyTorch Lightning 훈련 스크립트에서 SMDDP 라이브러리 사용
<a name="data-parallel-modify-sdp-pt-lightning"></a>

[PyTorch Lightning](https://pytorch-lightning.readthedocs.io/en/latest/starter/introduction.html) 훈련 스크립트를 가져와 SageMaker AI에서 분산형 데이터 병렬 훈련 작업을 실행하려는 경우, 훈련 스크립트를 최소한으로 변경하여 훈련 작업을 실행할 수 있습니다. 필요한 변경 사항에는 `smdistributed.dataparallel` 라이브러리의 PyTorch 모듈을 가져오고, SageMaker 훈련 도구 키트에서 사전 설정된 SageMaker AI 환경 변수를 수락하도록 PyTorch Lightning의 환경 변수를 설정하고, 프로세스 그룹 백엔드를 `"smddp"`로 설정하여 SMDDP 라이브러리를 활성화하는 작업이 포함됩니다. 자세히 알아보려면 코드 예제를 사용하여 단계를 세분화하는 다음 지침을 살펴보세요.

**참고**  
PyTorch Lightning 지원은 SageMaker AI 데이터 병렬 라이브러리 v1.5.0 이상에서 사용할 수 있습니다.

## PyTorch Lightning == v2.1.0 및 PyTorch == 2.0.1
<a name="smddp-pt-201-lightning-210"></a>

1. `pytorch_lightning` 라이브러리 및 `smdistributed.dataparallel.torch` 모듈을 가져옵니다.

   ```
   import lightning as pl
   import smdistributed.dataparallel.torch.torch_smddp
   ```

1. [LightningEnvironment](https://pytorch-lightning.readthedocs.io/en/stable/api/pytorch_lightning.plugins.environments.LightningEnvironment.html)를 인스턴스화합니다.

   ```
   from lightning.fabric.plugins.environments.lightning import LightningEnvironment
   
   env = LightningEnvironment()
   env.world_size = lambda: int(os.environ["WORLD_SIZE"])
   env.global_rank = lambda: int(os.environ["RANK"])
   ```

1. **PyTorch DDP의 경우** - `process_group_backend`용 `"smddp"` 및 `accelerator`용 `"gpu"`를 사용하여 [DDPStrategy](https://lightning.ai/docs/pytorch/stable/api/lightning.pytorch.strategies.DDPStrategy.html) 클래스의 객체를 생성하고 이를 [Trainer](https://pytorch-lightning.readthedocs.io/en/stable/common/trainer.html) 클래스에 전달합니다.

   ```
   import lightning as pl
   from lightning.pytorch.strategies import DDPStrategy
   
   ddp = DDPStrategy(
       cluster_environment=env, 
       process_group_backend="smddp", 
       accelerator="gpu"
   )
   
   trainer = pl.Trainer(
       max_epochs=200, 
       strategy=ddp, 
       devices=num_gpus, 
       num_nodes=num_nodes
   )
   ```

   **PyTorch FSDP의 경우** - `process_group_backend`용 `"smddp"` 및 `accelerator`용 `"gpu"`를 사용하여 [FSDPStrategy](https://lightning.ai/docs/pytorch/stable/api/lightning.pytorch.strategies.FSDPStrategy.html) 클래스의 객체([래핑 정책](https://pytorch.org/docs/stable/fsdp.html) 선택)를 생성하고 이를 [Trainer](https://pytorch-lightning.readthedocs.io/en/stable/common/trainer.html) 클래스에 전달합니다.

   ```
   import lightning as pl
   from lightning.pytorch.strategies import FSDPStrategy
   
   from functools import partial
   from torch.distributed.fsdp.wrap import size_based_auto_wrap_policy
   
   policy = partial(
       size_based_auto_wrap_policy, 
       min_num_params=10000
   )
   
   fsdp = FSDPStrategy(
       auto_wrap_policy=policy,
       process_group_backend="smddp", 
       cluster_environment=env
   )
   
   trainer = pl.Trainer(
       max_epochs=200, 
       strategy=fsdp, 
       devices=num_gpus, 
       num_nodes=num_nodes
   )
   ```

훈련 스크립트 조정을 완료한 후 [SageMaker Python SDK를 사용하여 SMDDP로 분산 훈련 작업 시작](data-parallel-use-api.md) 섹션으로 넘어갑니다.

**참고**  
SageMaker AI PyTorch 예측기를 구문화하고 [SageMaker Python SDK를 사용하여 SMDDP로 분산 훈련 작업 시작](data-parallel-use-api.md)에서 훈련 작업 요청을 제출하는 경우, SageMaker AI PyTorch 훈련 컨테이너에 `pytorch-lightning` 및 `lightning-bolts`를 설치하도록 `requirements.txt`를 제공해야 합니다.  

```
# requirements.txt
pytorch-lightning
lightning-bolts
```
훈련 스크립트 및 작업 제출과 함께 `requirements.txt` 파일을 배치할 소스 디렉터리를 지정하는 방법에 대한 자세한 내용은 *Amazon SageMaker AI Python SDK 설명서*의 [서드 파티 라이브러리 사용](https://sagemaker.readthedocs.io/en/stable/frameworks/pytorch/using_pytorch.html#id12)을 참조하세요.

# TensorFlow 훈련 스크립트에서 SMDDP 라이브러리 사용(사용되지 않음)
<a name="data-parallel-modify-sdp-tf2"></a>

**중요**  
SMDDP 라이브러리는 TensorFlow에 대한 지원을 중단했으며 v2.11.0 이후 TensorFlow용 DLC에서 더 이상 사용할 수 없습니다. SMDDP 라이브러리가 설치된 이전 TensorFlow DLC를 찾으려면 [지원되는 프레임워크](distributed-data-parallel-support.md#distributed-data-parallel-supported-frameworks) 섹션을 참조하세요.

다음 단계에서는 TensorFlow 훈련 스크립트를 수정하여 SageMaker AI 분산형 데이터 병렬 라이브러리를 활용하는 방법을 보여줍니다.  

라이브러리 API는 Horovod API와 유사하도록 설계되었습니다. 라이브러리에서 TensorFlow에 제공하는 각 API에 대한 자세한 내용은 [SageMaker AI 분산형 데이터 병렬 TensorFlow API 설명서](https://sagemaker.readthedocs.io/en/stable/api/training/smd_data_parallel.html#api-documentation)를 참조하세요.

**참고**  
SageMaker AI 분산형 데이터 병렬은 `tf.keras` 모듈을 제외한 `tf` 핵심 모듈로 구성된 TensorFlow 훈련 스크립트에 맞게 조정할 수 있습니다. SageMaker AI 분산형 데이터 병렬에서는 Keras가 구현된 TensorFlow를 지원하지 않습니다.

**참고**  
SageMaker AI의 분산형 데이터 병렬화 라이브러리는 기본적으로 자동 혼합 정밀도(AMP)를 지원합니다. 훈련 스크립트를 프레임워크 수준에서 수정하는 것 외에는 AMP를 활성화하기 위한 추가 조치가 필요하지 않습니다. FP16에 그라디언트가 있는 경우, SageMaker AI 데이터 병렬화 라이브러리는 FP16에서 `AllReduce` 작업을 실행합니다. 훈련 스크립트에 AMP API를 구현하는 방법에 대한 자세한 정보는 다음 리소스를 참조하세요.  
*NVIDIA 딥 러닝성능 문서*의 [프레임워크 - TensorFlow](https://docs.nvidia.com/deeplearning/performance/mixed-precision-training/index.html#tensorflow)
*NVIDIA 개발자 문서*의 [딥 러닝을 위한 자동 혼합 정밀도](https://developer.nvidia.com/automatic-mixed-precision)
*TensorFlow 문서*의 [TensorFlow 혼합 정밀도 API](https://www.tensorflow.org/guide/mixed_precision)

1. 라이브러리의 TensorFlow 클라이언트를 가져와서 초기화합니다.

   ```
   import smdistributed.dataparallel.tensorflow as sdp 
   sdp.init()
   ```

1. `local_rank`을(를) 사용하여 각 GPU를 단일 `smdistributed.dataparallel` 프로세스에 고정합니다. 이는 주어진 노드 내 프로세스의 상대적 순위를 나타냅니다. `sdp.tensorflow.local_rank()` API는 장치의 로컬 순위를 제공합니다. 리더 노드는 순위 0이고 워커 노드는 순위 1, 2, 3 등입니다. 이는 다음 코드 블록에서 `sdp.local_rank()`로 간접 호출됩니다. `set_memory_growth`는 SageMaker AI 분산형과 직접적인 관련이 없지만 TensorFlow로 분산 훈련을 하려면 설정해야 합니다.

   ```
   gpus = tf.config.experimental.list_physical_devices('GPU')
   for gpu in gpus:
       tf.config.experimental.set_memory_growth(gpu, True)
   if gpus:
       tf.config.experimental.set_visible_devices(gpus[sdp.local_rank()], 'GPU')
   ```

1. 작업자 수를 기준으로 학습 속도를 조정하세요. `sdp.tensorflow.size()` API는 클러스터의 작업자 수를 제공합니다. 이는 다음 코드 블록에서 `sdp.size()`(으)로서 간접 호출됩니다.

   ```
   learning_rate = learning_rate * sdp.size()
   ```

1. 라이브러리의 `DistributedGradientTape`을(를) 사용하여 훈련 중에 `AllReduce` 작업을 최적화합니다. 이것이 `tf.GradientTape`을(를) 래핑합니다.  

   ```
   with tf.GradientTape() as tape:
         output = model(input)
         loss_value = loss(label, output)
       
   # SageMaker AI data parallel: Wrap tf.GradientTape with the library's DistributedGradientTape
   tape = sdp.DistributedGradientTape(tape)
   ```

1. 리더 노드(순위 0)에서 모든 작업자 노드(순위 1\$1n)로 초기 모델 변수를 브로드캐스트합니다. 이는 모든 작업자 순위에서 일관된 초기화를 보장하는 데 필요합니다. 모델 및 옵티마이저 변수를 초기화한 후 `sdp.tensorflow.broadcast_variables` API를 사용하세요. 이는 다음 코드 블록에서 `sdp.broadcast_variables()`(으)로서 간접 호출됩니다.

   ```
   sdp.broadcast_variables(model.variables, root_rank=0)
   sdp.broadcast_variables(opt.variables(), root_rank=0)
   ```

1. 마지막으로 리더 노드에만 체크포인트를 저장하도록 스크립트를 수정합니다. 리더 노드에는 동기화된 모델이 있습니다. 이렇게 하면 워커 노드가 체크포인트를 덮어쓰거나 체크포인트가 손상되는 것도 방지할 수 있습니다.

   ```
   if sdp.rank() == 0:
       checkpoint.save(checkpoint_dir)
   ```

다음은 라이브러리를 사용한 분산 훈련을 위한 TensorFlow 훈련 스크립트 예제입니다.

```
import tensorflow as tf

# SageMaker AI data parallel: Import the library TF API
import smdistributed.dataparallel.tensorflow as sdp

# SageMaker AI data parallel: Initialize the library
sdp.init()

gpus = tf.config.experimental.list_physical_devices('GPU')
for gpu in gpus:
    tf.config.experimental.set_memory_growth(gpu, True)
if gpus:
    # SageMaker AI data parallel: Pin GPUs to a single library process
    tf.config.experimental.set_visible_devices(gpus[sdp.local_rank()], 'GPU')

# Prepare Dataset
dataset = tf.data.Dataset.from_tensor_slices(...)

# Define Model
mnist_model = tf.keras.Sequential(...)
loss = tf.losses.SparseCategoricalCrossentropy()

# SageMaker AI data parallel: Scale Learning Rate
# LR for 8 node run : 0.000125
# LR for single node run : 0.001
opt = tf.optimizers.Adam(0.000125 * sdp.size())

@tf.function
def training_step(images, labels, first_batch):
    with tf.GradientTape() as tape:
        probs = mnist_model(images, training=True)
        loss_value = loss(labels, probs)

    # SageMaker AI data parallel: Wrap tf.GradientTape with the library's DistributedGradientTape
    tape = sdp.DistributedGradientTape(tape)

    grads = tape.gradient(loss_value, mnist_model.trainable_variables)
    opt.apply_gradients(zip(grads, mnist_model.trainable_variables))

    if first_batch:
       # SageMaker AI data parallel: Broadcast model and optimizer variables
       sdp.broadcast_variables(mnist_model.variables, root_rank=0)
       sdp.broadcast_variables(opt.variables(), root_rank=0)

    return loss_value

...

# SageMaker AI data parallel: Save checkpoints only from master node.
if sdp.rank() == 0:
    checkpoint.save(checkpoint_dir)
```

훈련 스크립트 조정을 완료한 후 [SageMaker Python SDK를 사용하여 SMDDP로 분산 훈련 작업 시작](data-parallel-use-api.md) 섹션으로 넘어갑니다.

# SageMaker Python SDK를 사용하여 SMDDP로 분산 훈련 작업 시작
<a name="data-parallel-use-api"></a>

[SMDDP 집합 작업을 사용하도록 훈련 스크립트 조정](data-parallel-modify-sdp-select-framework.md)에서 조정된 스크립트로 분산 훈련 작업을 실행하려면 준비된 훈련 스크립트를 진입점 스크립트 및 분산 훈련 구성으로 지정하여 SageMaker Python SDK의 프레임워크 또는 일반 추정기를 사용합니다.

이 페이지에서는 2가지 방법으로 [SageMaker AI Python SDK](https://sagemaker.readthedocs.io/en/stable/api/training/index.html)를 사용하는 방법을 안내합니다.
+ SageMaker AI에서 분산 훈련 작업을 빠르게 채택하려면 SageMaker AI [PyTorch](https://sagemaker.readthedocs.io/en/stable/frameworks/pytorch/sagemaker.pytorch.html#sagemaker.pytorch.estimator.PyTorch) 또는 [TensorFlow](https://sagemaker.readthedocs.io/en/stable/frameworks/tensorflow/sagemaker.tensorflow.html#tensorflow-estimator) 프레임워크 예측기 클래스를 구성합니다. 프레임워크 추정기는 훈련 스크립트를 선택하고 `framework_version` 파라미터에 지정된 값이 주어지면 [사전 빌드된 PyTorch 또는 TensorFlow Deep Learning Containers(DLC)](https://github.com/aws/deep-learning-containers/blob/master/available_images.md#sagemaker-framework-containers-sm-support-only)의 올바른 이미지 URI를 자동으로 매칭합니다.
+ 사전 빌드된 컨테이너 중 하나를 확장하거나 사용자 지정 컨테이너를 구축하여 SageMaker AI로 자체 ML 환경을 만들려면 SageMaker AI 일반 `Estimator` 클래스를 사용하고 Amazon Elastic Container Registry(Amazon ECR)에서 호스팅되는 사용자 지정 Docker 컨테이너의 이미지 URI를 지정합니다.

훈련 데이터 세트는 훈련 작업을 AWS 리전 시작하는의 Amazon S3 또는 [Amazon FSx for Lustre](https://docs.aws.amazon.com/fsx/latest/LustreGuide/what-is.html)에 저장되어야 합니다. Jupyter notebook을 사용하는 경우 동일한 AWS 리전에서 실행되는 SageMaker 노트북 인스턴스 또는 SageMaker Studio Classic 앱이 있어야 합니다. 훈련 데이터를 저장하는 방법에 대한 자세한 내용은 [SageMaker Python SDK 데이터 입력](https://sagemaker.readthedocs.io/en/stable/overview.html#use-file-systems-as-training-input) 설명서를 참조하세요.

**작은 정보**  
훈련 성능을 개선하려면 Amazon S3 대신 Amazon FSx for Lustre를 사용하는 것이 좋습니다. Amazon FSx는 Amazon S3보다 처리량이 많고 지연 시간은 더 짧습니다.

**작은 정보**  
EFA 지원 인스턴스 유형에 대한 분산 훈련을 올바르게 실행하려면 VPC의 보안 그룹을 설정하여 보안 그룹 자체에서 모든 인바운드 및 아웃바운드 트래픽을 허용하여 인스턴스 간 트래픽을 활성화해야 합니다. 보안 그룹 규칙을 설정하는 방법을 알아보려면 *Amazon EC2 사용 설명서*의 [1단계: EFA 지원 보안 그룹 준비](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/efa-start.html#efa-start-security)를 참조하세요.

다음 주제 중 하나를 선택하여 훈련 스크립트의 분산 훈련 작업을 실행하는 방법에 대한 지침을 확인하세요. 훈련 작업을 시작한 후 Amazon CloudWatch를 [Amazon SageMaker Debugger](train-debugger.md)를 사용하여 시스템 사용률 및 모델 성능을 모니터링할 수 있습니다.

기술 세부 정보에 대해 자세히 알아보려면 다음 주제의 지침을 따르면서 [Amazon SageMaker AI 데이터 병렬화 라이브러리 예시](distributed-data-parallel-v2-examples.md)를 시작해 보는 것도 좋습니다.

**Topics**
+ [SageMaker Python SDK에서 PyTorch 프레임워크 추정기 사용](data-parallel-framework-estimator.md)
+ [SageMaker AI 일반 예측기를 사용하여 사전 구축된 DLC 컨테이너 확장](data-parallel-use-python-skd-api.md)
+ [SageMaker AI 분산 데이터 병렬 라이브러리로 자체 Docker 컨테이너 만들기](data-parallel-bring-your-own-container.md)

# SageMaker Python SDK에서 PyTorch 프레임워크 추정기 사용
<a name="data-parallel-framework-estimator"></a>

`distribution` 인수를 SageMaker AI 프레임워크 예측기 [https://sagemaker.readthedocs.io/en/stable/frameworks/pytorch/sagemaker.pytorch.html#sagemaker.pytorch.estimator.PyTorch](https://sagemaker.readthedocs.io/en/stable/frameworks/pytorch/sagemaker.pytorch.html#sagemaker.pytorch.estimator.PyTorch) 또는 [https://sagemaker.readthedocs.io/en/stable/frameworks/tensorflow/sagemaker.tensorflow.html#tensorflow-estimator](https://sagemaker.readthedocs.io/en/stable/frameworks/tensorflow/sagemaker.tensorflow.html#tensorflow-estimator)에 추가하여 분산 훈련을 시작할 수 있습니다. 자세한 내용을 알아보려면 다음 선택 항목에서 SageMaker AI 분산 데이터 병렬 처리(SMDDP) 라이브러리에서 지원하는 프레임워크 중 하나를 선택합니다.

------
#### [ PyTorch ]

PyTorch 분산 훈련을 시작하는 데 다음 시작 관리자 옵션을 사용할 수 있습니다.
+ `pytorchddp` – 이 옵션은 `mpirun`을 실행하고 SageMaker AI에서 PyTorch 분산 훈련을 실행하는 데 필요한 환경 변수를 설정합니다. 이 옵션을 사용하려면 다음 사전을 `distribution` 파라미터에 전달합니다.

  ```
  { "pytorchddp": { "enabled": True } }
  ```
+ `torch_distributed` – 이 옵션은 `torchrun`을 실행하고 SageMaker AI에서 PyTorch 분산 훈련을 실행하는 데 필요한 환경 변수를 설정합니다. 이 옵션을 사용하려면 다음 사전을 `distribution` 파라미터에 전달합니다.

  ```
  { "torch_distributed": { "enabled": True } }
  ```
+ `smdistributed` - 이 옵션은 `mpirun`도 실행하지만 SageMaker AI에서 PyTorch 분산 훈련을 실행하는 데 필요한 환경 변수를 설정하는 `smddprun`도 이용합니다.

  ```
  { "smdistributed": { "dataparallel": { "enabled": True } } }
  ```

NCCL `AllGather`를 SMDDP `AllGather`로 교체하도록 선택한 경우 세 가지 옵션을 모두 사용할 수 있습니다. 사용 사례에 맞는 옵션을 하나 선택합니다.

NCCL `AllReduce`을 SMDDP `AllReduce`로 교체하기로 선택한 경우 `mpirun` 기반 옵션인 `smdistributed` 또는 `pytorchddp` 중 하나를 선택해야 합니다. 다음과 같이 MPI 옵션을 추가할 수도 있습니다.

```
{ 
    "pytorchddp": {
        "enabled": True, 
        "custom_mpi_options": "-verbose -x NCCL_DEBUG=VERSION"
    }
}
```

```
{ 
    "smdistributed": { 
        "dataparallel": {
            "enabled": True, 
            "custom_mpi_options": "-verbose -x NCCL_DEBUG=VERSION"
        }
    }
}
```

다음 코드 샘플은 분산 훈련 옵션이 있는 PyTorch 추정기의 기본 구조를 보여줍니다.

```
from sagemaker.pytorch import PyTorch

pt_estimator = PyTorch(
    base_job_name="training_job_name_prefix",
    source_dir="subdirectory-to-your-code",
    entry_point="adapted-training-script.py",
    role="SageMakerRole",
    py_version="py310",
    framework_version="2.0.1",

    # For running a multi-node distributed training job, specify a value greater than 1
    # Example: 2,3,4,..8
    instance_count=2,

    # Instance types supported by the SageMaker AI data parallel library: 
    # ml.p4d.24xlarge, ml.p4de.24xlarge
    instance_type="ml.p4d.24xlarge",

    # Activate distributed training with SMDDP
    distribution={ "pytorchddp": { "enabled": True } }  # mpirun, activates SMDDP AllReduce OR AllGather
    # distribution={ "torch_distributed": { "enabled": True } }  # torchrun, activates SMDDP AllGather
    # distribution={ "smdistributed": { "dataparallel": { "enabled": True } } }  # mpirun, activates SMDDP AllReduce OR AllGather
)

pt_estimator.fit("s3://bucket/path/to/training/data")
```

**참고**  
PyTorch 라이트닝 및 라이트닝 볼트와 같은 유틸리티 라이브러리는 SageMaker AI PyTorch DLC에 사전 설치되어 있지 않습니다. 다음 `requirements.txt` 파일을 생성하고 훈련 스크립트를 저장하는 소스 디렉터리에 저장합니다.  

```
# requirements.txt
pytorch-lightning
lightning-bolts
```
예를 들어 트리 구조의 디렉터리는 다음과 같아야 합니다.  

```
├── pytorch_training_launcher_jupyter_notebook.ipynb
└── sub-folder-for-your-code
    ├──  adapted-training-script.py
    └──  requirements.txt
```
훈련 스크립트 및 작업 제출과 함께 `requirements.txt` 파일을 배치할 소스 디렉터리를 지정하는 방법에 대한 자세한 내용은 *Amazon SageMaker AI Python SDK 설명서*의 [서드파티 라이브러리 사용](https://sagemaker.readthedocs.io/en/stable/frameworks/pytorch/using_pytorch.html#id12)을 참조하세요.

**SMDDP 집합 작업을 활성화하고 올바른 분산 훈련 시작 관리자 옵션을 사용하기 위한 고려 사항**
+ SMDDP `AllReduce`와 SMDDP `AllGather`는 현재 상호 호환되지 않습니다.
+ SMDDP `AllReduce`는 기본적으로 `mpirun` 기반 런처인 `smdistributed` 또는 `pytorchddp`를 사용할 때 활성화되며 NCCL `AllGather`가 사용됩니다.
+ SMDDP `AllGather`는 `torch_distributed` 시작 관리자를 사용할 때 기본적으로 활성화되며 `AllReduce`는 NCCL로 돌아갑니다.
+ SMDDP `AllGather`는 다음과 같이 설정된 추가 환경 변수와 함께 `mpirun` 기반 시작 관리자를 사용할 때 활성화할 수도 있습니다.

  ```
  export SMDATAPARALLEL_OPTIMIZE_SDP=true
  ```

------
#### [ TensorFlow ]

**중요**  
SMDDP 라이브러리는 TensorFlow에 대한 지원을 중단했으며 v2.11.0 이후 TensorFlow용 DLC에서 더 이상 사용할 수 없습니다. SMDDP 라이브러리가 설치된 이전 TensorFlow DLC를 찾으려면 [TensorFlow(사용되지 않음)](distributed-data-parallel-support.md#distributed-data-parallel-supported-frameworks-tensorflow) 섹션을 참조하세요.

```
from sagemaker.tensorflow import TensorFlow

tf_estimator = TensorFlow(
    base_job_name = "training_job_name_prefix",
    entry_point="adapted-training-script.py",
    role="SageMakerRole",
    framework_version="2.11.0",
    py_version="py38",

    # For running a multi-node distributed training job, specify a value greater than 1
    # Example: 2,3,4,..8
    instance_count=2,

    # Instance types supported by the SageMaker AI data parallel library: 
    # ml.p4d.24xlarge, ml.p3dn.24xlarge, and ml.p3.16xlarge
    instance_type="ml.p3.16xlarge",

    # Training using the SageMaker AI data parallel distributed training strategy
    distribution={ "smdistributed": { "dataparallel": { "enabled": True } } }
)

tf_estimator.fit("s3://bucket/path/to/training/data")
```

------

# SageMaker AI 일반 예측기를 사용하여 사전 구축된 DLC 컨테이너 확장
<a name="data-parallel-use-python-skd-api"></a>

사전 구축된 SageMaker AI Docker 이미지가 지원하지 않는 알고리즘 또는 모델에 대한 추가 기능 요구 사항을 처리할 수 있도록 SageMaker AI 사전 구축 컨테이너를 사용자 지정 또는 확장할 수 있습니다. 사전 빌드된 컨테이너를 확장하는 방법에 대한 예제는 [사전 빌드된 컨테이너 확장](https://docs.aws.amazon.com/sagemaker/latest/dg/prebuilt-containers-extend.html)을 참조하세요.

미리 빌드된 컨테이너를 확장하거나 라이브러리를 사용하도록 자체 컨테이너를 조정하려면 [지원되는 프레임워크](distributed-data-parallel-support.md#distributed-data-parallel-supported-frameworks)에 나열된 이미지 중 하나를 사용해야 합니다.

**참고**  
TensorFlow 2.4.1과 PyTorch 1.8.1부터 SageMaker AI 프레임워크 DLC는 EFA 지원 인스턴스 유형을 지원합니다. TensorFlow 2.4.1 이상 및 PyTorch 1.8.1 이상이 포함된 DLC 이미지를 사용하는 것이 좋습니다.

예를 들어 PyTorch를 사용하는 경우 Dockerfile에는 다음과 같은 `FROM` 문이 포함되어야 합니다.

```
# SageMaker AI PyTorch image
FROM 763104351884.dkr.ecr.<aws-region>.amazonaws.com/pytorch-training:<image-tag>

ENV PATH="/opt/ml/code:${PATH}"

# this environment variable is used by the SageMaker AI PyTorch container to determine our user code directory.
ENV SAGEMAKER_SUBMIT_DIRECTORY /opt/ml/code

# /opt/ml and all subdirectories are utilized by SageMaker AI, use the /code subdirectory to store your user code.
COPY train.py /opt/ml/code/train.py

# Defines cifar10.py as script entrypoint
ENV SAGEMAKER_PROGRAM train.py
```

[SageMaker 훈련 도구 키트](https://github.com/aws/sagemaker-training-toolkit)와 SageMaker AI 분산 데이터 병렬 라이브러리의 바이너리 파일을 사용하여 SageMaker AI에서 작동하도록 자체 Docker 컨테이너를 추가로 사용자 지정할 수 있습니다. 자세한 내용은 다음 섹션의 지침을 참조하세요.

# SageMaker AI 분산 데이터 병렬 라이브러리로 자체 Docker 컨테이너 만들기
<a name="data-parallel-bring-your-own-container"></a>

훈련용 자체 Docker 컨테이너를 직접 구축하고 SageMaker AI 데이터 병렬 라이브러리를 사용하려면 Dockerfile에 SageMaker AI 분산 병렬 라이브러리의 올바른 종속 항목 및 바이너리 파일을 포함해야 합니다. 이 섹션에서는 데이터 병렬 라이브러리를 사용하여 SageMaker AI에서 분산 훈련을 위한 최소 종속성 세트를 포함하는 완전한 Dockerfile을 만드는 방법에 대한 설명을 제공합니다.

**참고**  
SageMaker AI 데이터 병렬 라이브러리를 바이너리로 사용하는 이 사용자 지정 Docker 옵션은 PyTorch에서만 사용할 수 있습니다.

**SageMaker 훈련 툴킷과 데이터 병렬 라이브러리를 사용하여 Dockerfile을 생성하려면**

1. [NVIDIA CUDA](https://hub.docker.com/r/nvidia/cuda)의 도커 이미지로 시작하세요. CUDA 런타임 및 개발 도구(헤더 및 라이브러리)가 포함된 CuDNN 개발자 버전을 사용하여 [PyTorch 소스 코드](https://github.com/pytorch/pytorch#from-source)에서 빌드하세요.

   ```
   FROM nvidia/cuda:11.3.1-cudnn8-devel-ubuntu20.04
   ```
**작은 정보**  
공식 AWS 딥 러닝 컨테이너(DLC) 이미지는 [NVIDIA CUDA 기본 이미지](https://hub.docker.com/r/nvidia/cuda)로 빌드됩니다. 나머지 지침을 따르면서 미리 빌드된 DLC 이미지를 참조로 사용하려면 [AWS PyTorch Dockerfiles용 딥 러닝 컨테이너](https://github.com/aws/deep-learning-containers/tree/master/pytorch)를 참조하세요.

1. 다음 인수를 추가하여 PyTorch 및 기타 패키지의 버전을 지정합니다. 또한 Amazon S3 플러그인과 같은 AWS 리소스를 사용하기 위한 SageMaker AI 데이터 병렬 라이브러리 및 기타 소프트웨어에 대한 Amazon S3 버킷 경로를 지정합니다.

   다음 코드 예제에 제공된 라이브러리 이외의 타사 라이브러리 버전을 사용하려면 [ PyTorch용 AWS 딥 러닝 컨테이너의 공식 Dockerfiles](https://github.com/aws/deep-learning-containers/tree/master/pytorch/training/docker)를 살펴보고 테스트되고 호환되며 애플리케이션에 적합한 버전을 찾는 것이 좋습니다.

   `SMDATAPARALLEL_BINARY` 인수의 URL을 찾으려면 [지원되는 프레임워크](distributed-data-parallel-support.md#distributed-data-parallel-supported-frameworks)의 조회 테이블을 참조하세요.

   ```
   ARG PYTORCH_VERSION=1.10.2
   ARG PYTHON_SHORT_VERSION=3.8
   ARG EFA_VERSION=1.14.1
   ARG SMDATAPARALLEL_BINARY=https://smdataparallel.s3.amazonaws.com/binary/pytorch/${PYTORCH_VERSION}/cu113/2022-02-18/smdistributed_dataparallel-1.4.0-cp38-cp38-linux_x86_64.whl
   ARG PT_S3_WHL_GPU=https://aws-s3-plugin.s3.us-west-2.amazonaws.com/binaries/0.0.1/1c3e69e/awsio-0.0.1-cp38-cp38-manylinux1_x86_64.whl
   ARG CONDA_PREFIX="/opt/conda"
   ARG BRANCH_OFI=1.1.3-aws
   ```

1. 다음 환경 변수를 설정하여 SageMaker 훈련 구성 요소를 올바르게 빌드하고 데이터 병렬 라이브러리를 실행하세요. 다음 단계에서 구성 요소에 이러한 변수를 사용합니다.

   ```
   # Set ENV variables required to build PyTorch
   ENV TORCH_CUDA_ARCH_LIST="7.0+PTX 8.0"
   ENV TORCH_NVCC_FLAGS="-Xfatbin -compress-all"
   ENV NCCL_VERSION=2.10.3
   
   # Add OpenMPI to the path.
   ENV PATH /opt/amazon/openmpi/bin:$PATH
   
   # Add Conda to path
   ENV PATH $CONDA_PREFIX/bin:$PATH
   
   # Set this enviroment variable for SageMaker AI to launch SMDDP correctly.
   ENV SAGEMAKER_TRAINING_MODULE=sagemaker_pytorch_container.training:main
   
   # Add enviroment variable for processes to be able to call fork()
   ENV RDMAV_FORK_SAFE=1
   
   # Indicate the container type
   ENV DLC_CONTAINER_TYPE=training
   
   # Add EFA and SMDDP to LD library path
   ENV LD_LIBRARY_PATH="/opt/conda/lib/python${PYTHON_SHORT_VERSION}/site-packages/smdistributed/dataparallel/lib:$LD_LIBRARY_PATH"
   ENV LD_LIBRARY_PATH=/opt/amazon/efa/lib/:$LD_LIBRARY_PATH
   ```

1. 후속 단계에서 패키지를 다운로드하고 빌드하려면 `curl`, `wget`, `git`를 설치하거나 업데이트하세요.

   ```
   RUN --mount=type=cache,id=apt-final,target=/var/cache/apt \
       apt-get update && apt-get install -y  --no-install-recommends \
           curl \
           wget \
           git \
       && rm -rf /var/lib/apt/lists/*
   ```

1. Amazon EC2 네트워크 통신을 위한 [EFA(Elastic Fabric Adapter)](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/efa.html) 소프트웨어를 설치합니다.

   ```
   RUN DEBIAN_FRONTEND=noninteractive apt-get update
   RUN mkdir /tmp/efa \
       && cd /tmp/efa \
       && curl --silent -O https://efa-installer.amazonaws.com/aws-efa-installer-${EFA_VERSION}.tar.gz \
       && tar -xf aws-efa-installer-${EFA_VERSION}.tar.gz \
       && cd aws-efa-installer \
       && ./efa_installer.sh -y --skip-kmod -g \
       && rm -rf /tmp/efa
   ```

1. 패키지 관리를 처리하려면 [Conda](https://docs.conda.io/en/latest/)를 설치하세요.

   ```
   RUN curl -fsSL -v -o ~/miniconda.sh -O  https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh  && \
       chmod +x ~/miniconda.sh && \
       ~/miniconda.sh -b -p $CONDA_PREFIX && \
       rm ~/miniconda.sh && \
       $CONDA_PREFIX/bin/conda install -y python=${PYTHON_SHORT_VERSION} conda-build pyyaml numpy ipython && \
       $CONDA_PREFIX/bin/conda clean -ya
   ```

1. PyTorch 및 해당 종속성을 가져오고 빌드하고 설치합니다. [AWS OFI NCCL 플러그인](https://github.com/aws/aws-ofi-nccl)과의 호환성을 보장하기 위해 NCCL 버전을 제어해야 하기 때문에 [소스 코드에서 PyTorch](https://github.com/pytorch/pytorch#from-source)를 빌드합니다.

   1. [PyTorch 공식 dockerfile](https://github.com/pytorch/pytorch/blob/master/Dockerfile)의 단계에 따라 빌드 종속성을 설치하고 [ccache](https://ccache.dev/)를 설정하여 재컴파일 속도를 높입니다.

      ```
      RUN DEBIAN_FRONTEND=noninteractive \
          apt-get install -y --no-install-recommends \
              build-essential \
              ca-certificates \
              ccache \
              cmake \
              git \
              libjpeg-dev \
              libpng-dev \
          && rm -rf /var/lib/apt/lists/*
        
      # Setup ccache
      RUN /usr/sbin/update-ccache-symlinks
      RUN mkdir /opt/ccache && ccache --set-config=cache_dir=/opt/ccache
      ```

   1. [PyTorch의 공통 종속 항목과 Linux 종속성](https://github.com/pytorch/pytorch#install-dependencies)을 설치합니다.

      ```
      # Common dependencies for PyTorch
      RUN conda install astunparse numpy ninja pyyaml mkl mkl-include setuptools cmake cffi typing_extensions future six requests dataclasses
      
      # Linux specific dependency for PyTorch
      RUN conda install -c pytorch magma-cuda113
      ```

   1. [PyTorch GitHub 리포지토리](https://github.com/pytorch/pytorch)를 복제합니다.

      ```
      RUN --mount=type=cache,target=/opt/ccache \
          cd / \
          && git clone --recursive https://github.com/pytorch/pytorch -b v${PYTORCH_VERSION}
      ```

   1. 특정 [NCCL](https://developer.nvidia.com/nccl) 버전을 설치하고 빌드하세요. 이렇게 하려면 PyTorch의 기본 NCCL 폴더(`/pytorch/third_party/nccl`)에 있는 콘텐츠를 NVIDIA 리포지토리의 특정 NCCL 버전으로 대체하세요. NCCL 버전은 이 가이드의 3단계에서 설정되었습니다.

      ```
      RUN cd /pytorch/third_party/nccl \
          && rm -rf nccl \
          && git clone https://github.com/NVIDIA/nccl.git -b v${NCCL_VERSION}-1 \
          && cd nccl \
          && make -j64 src.build CUDA_HOME=/usr/local/cuda NVCC_GENCODE="-gencode=arch=compute_70,code=sm_70 -gencode=arch=compute_80,code=sm_80" \
          && make pkg.txz.build \
          && tar -xvf build/pkg/txz/nccl_*.txz -C $CONDA_PREFIX --strip-components=1
      ```

   1. PyTorch를 빌드 및 설치합니다. 이 프로세스는 완료하는데 보통 1시간이 조금 넘게 걸립니다. 이전 단계에서 다운로드한 NCCL 버전을 사용하여 빌드됩니다.

      ```
      RUN cd /pytorch \
          && CMAKE_PREFIX_PATH="$(dirname $(which conda))/../" \
          python setup.py install \
          && rm -rf /pytorch
      ```

1. [AWS OFI NCCL 플러그인](https://github.com/aws/aws-ofi-nccl)을 빌드하고 설치합니다. 이렇게 하면 SageMaker AI 데이터 병렬 라이브러리에 대한 [libfabric](https://github.com/ofiwg/libfabric) 지원이 활성화됩니다.

   ```
   RUN DEBIAN_FRONTEND=noninteractive apt-get update \
       && apt-get install -y --no-install-recommends \
           autoconf \
           automake \
           libtool
   RUN mkdir /tmp/efa-ofi-nccl \
       && cd /tmp/efa-ofi-nccl \
       && git clone https://github.com/aws/aws-ofi-nccl.git -b v${BRANCH_OFI} \
       && cd aws-ofi-nccl \
       && ./autogen.sh \
       && ./configure --with-libfabric=/opt/amazon/efa \
       --with-mpi=/opt/amazon/openmpi \
       --with-cuda=/usr/local/cuda \
       --with-nccl=$CONDA_PREFIX \
       && make \
       && make install \
       && rm -rf /tmp/efa-ofi-nccl
   ```

1. [TorchVision](https://github.com/pytorch/vision.git)을 빌드하고 설치하세요.

   ```
   RUN pip install --no-cache-dir -U \
       packaging \
       mpi4py==3.0.3
   RUN cd /tmp \
       && git clone https://github.com/pytorch/vision.git -b v0.9.1 \
       && cd vision \
       && BUILD_VERSION="0.9.1+cu111" python setup.py install \
       && cd /tmp \
       && rm -rf vision
   ```

1. OpenSSH를 설치 및 구성합니다. MPI가 컨테이너 간에 통신하려면 OpenSSH가 필요합니다. 확인 여부를 묻지 않고 OpenSSH가 컨테이너와 통신할 수 있도록 허용합니다.

   ```
   RUN apt-get update \
       && apt-get install -y  --allow-downgrades --allow-change-held-packages --no-install-recommends \
       && apt-get install -y --no-install-recommends openssh-client openssh-server \
       && mkdir -p /var/run/sshd \
       && cat /etc/ssh/ssh_config | grep -v StrictHostKeyChecking > /etc/ssh/ssh_config.new \
       && echo "    StrictHostKeyChecking no" >> /etc/ssh/ssh_config.new \
       && mv /etc/ssh/ssh_config.new /etc/ssh/ssh_config \
       && rm -rf /var/lib/apt/lists/*
   
   # Configure OpenSSH so that nodes can communicate with each other
   RUN mkdir -p /var/run/sshd && \
    sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd
   RUN rm -rf /root/.ssh/ && \
    mkdir -p /root/.ssh/ && \
    ssh-keygen -q -t rsa -N '' -f /root/.ssh/id_rsa && \
    cp /root/.ssh/id_rsa.pub /root/.ssh/authorized_keys \
    && printf "Host *\n StrictHostKeyChecking no\n" >> /root/.ssh/config
   ```

1. PT S3 플러그인을 설치하면 Amazon S3의 데이터세트에 효율적으로 액세스할 수 있습니다.

   ```
   RUN pip install --no-cache-dir -U ${PT_S3_WHL_GPU}
   RUN mkdir -p /etc/pki/tls/certs && cp /etc/ssl/certs/ca-certificates.crt /etc/pki/tls/certs/ca-bundle.crt
   ```

1. [libboost](https://www.boost.org/) 라이브러리를 설치합니다. 이 패키지는 SageMaker AI 데이터 병렬 라이브러리의 비동기식 IO 기능을 네트워킹하는 데 필요합니다.

   ```
   WORKDIR /
   RUN wget https://sourceforge.net/projects/boost/files/boost/1.73.0/boost_1_73_0.tar.gz/download -O boost_1_73_0.tar.gz \
       && tar -xzf boost_1_73_0.tar.gz \
       && cd boost_1_73_0 \
       && ./bootstrap.sh \
       && ./b2 threading=multi --prefix=${CONDA_PREFIX} -j 64 cxxflags=-fPIC cflags=-fPIC install || true \
       && cd .. \
       && rm -rf boost_1_73_0.tar.gz \
       && rm -rf boost_1_73_0 \
       && cd ${CONDA_PREFIX}/include/boost
   ```

1. PyTorch 훈련을 위해 다음과 같은 SageMaker AI 도구를 설치합니다.

   ```
   WORKDIR /root
   RUN pip install --no-cache-dir -U \
       smclarify \
       "sagemaker>=2,<3" \
       sagemaker-experiments==0.* \
       sagemaker-pytorch-training
   ```

1. 마지막으로 SageMaker AI 데이터 병렬 바이너리와 나머지 종속 항목을 설치합니다.

   ```
   RUN --mount=type=cache,id=apt-final,target=/var/cache/apt \
     apt-get update && apt-get install -y  --no-install-recommends \
     jq \
     libhwloc-dev \
     libnuma1 \
     libnuma-dev \
     libssl1.1 \
     libtool \
     hwloc \
     && rm -rf /var/lib/apt/lists/*
   
   RUN SMDATAPARALLEL_PT=1 pip install --no-cache-dir ${SMDATAPARALLEL_BINARY}
   ```

1. Dockerfile 생성을 완료한 후에는 [자체 훈련 컨테이너 조정](https://docs.aws.amazon.com/sagemaker/latest/dg/adapt-training-container.html)을 참조하여 Docker 컨테이너를 빌드하고 Amazon ECR에서 호스팅하며 SageMaker Python SDK를 사용하여 훈련 작업을 실행하는 방법을 알아보세요.

다음 예제 코드는 이전 코드 블록을 모두 결합한 후의 완전한 Dockerfile을 보여줍니다.

```
# This file creates a docker image with minimum dependencies to run SageMaker AI data parallel training
FROM nvidia/cuda:11.3.1-cudnn8-devel-ubuntu20.04

# Set appropiate versions and location for components
ARG PYTORCH_VERSION=1.10.2
ARG PYTHON_SHORT_VERSION=3.8
ARG EFA_VERSION=1.14.1
ARG SMDATAPARALLEL_BINARY=https://smdataparallel.s3.amazonaws.com/binary/pytorch/${PYTORCH_VERSION}/cu113/2022-02-18/smdistributed_dataparallel-1.4.0-cp38-cp38-linux_x86_64.whl
ARG PT_S3_WHL_GPU=https://aws-s3-plugin.s3.us-west-2.amazonaws.com/binaries/0.0.1/1c3e69e/awsio-0.0.1-cp38-cp38-manylinux1_x86_64.whl
ARG CONDA_PREFIX="/opt/conda"
ARG BRANCH_OFI=1.1.3-aws

# Set ENV variables required to build PyTorch
ENV TORCH_CUDA_ARCH_LIST="3.7 5.0 7.0+PTX 8.0"
ENV TORCH_NVCC_FLAGS="-Xfatbin -compress-all"
ENV NCCL_VERSION=2.10.3

# Add OpenMPI to the path.
ENV PATH /opt/amazon/openmpi/bin:$PATH

# Add Conda to path
ENV PATH $CONDA_PREFIX/bin:$PATH

# Set this enviroment variable for SageMaker AI to launch SMDDP correctly.
ENV SAGEMAKER_TRAINING_MODULE=sagemaker_pytorch_container.training:main

# Add enviroment variable for processes to be able to call fork()
ENV RDMAV_FORK_SAFE=1

# Indicate the container type
ENV DLC_CONTAINER_TYPE=training

# Add EFA and SMDDP to LD library path
ENV LD_LIBRARY_PATH="/opt/conda/lib/python${PYTHON_SHORT_VERSION}/site-packages/smdistributed/dataparallel/lib:$LD_LIBRARY_PATH"
ENV LD_LIBRARY_PATH=/opt/amazon/efa/lib/:$LD_LIBRARY_PATH

# Install basic dependencies to download and build other dependencies
RUN --mount=type=cache,id=apt-final,target=/var/cache/apt \
  apt-get update && apt-get install -y  --no-install-recommends \
  curl \
  wget \
  git \
  && rm -rf /var/lib/apt/lists/*

# Install EFA.
# This is required for SMDDP backend communication
RUN DEBIAN_FRONTEND=noninteractive apt-get update
RUN mkdir /tmp/efa \
    && cd /tmp/efa \
    && curl --silent -O https://efa-installer.amazonaws.com/aws-efa-installer-${EFA_VERSION}.tar.gz \
    && tar -xf aws-efa-installer-${EFA_VERSION}.tar.gz \
    && cd aws-efa-installer \
    && ./efa_installer.sh -y --skip-kmod -g \
    && rm -rf /tmp/efa

# Install Conda
RUN curl -fsSL -v -o ~/miniconda.sh -O  https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh  && \
    chmod +x ~/miniconda.sh && \
    ~/miniconda.sh -b -p $CONDA_PREFIX && \
    rm ~/miniconda.sh && \
    $CONDA_PREFIX/bin/conda install -y python=${PYTHON_SHORT_VERSION} conda-build pyyaml numpy ipython && \
    $CONDA_PREFIX/bin/conda clean -ya

# Install PyTorch.
# Start with dependencies listed in official PyTorch dockerfile
# https://github.com/pytorch/pytorch/blob/master/Dockerfile
RUN DEBIAN_FRONTEND=noninteractive \
    apt-get install -y --no-install-recommends \
        build-essential \
        ca-certificates \
        ccache \
        cmake \
        git \
        libjpeg-dev \
        libpng-dev && \
    rm -rf /var/lib/apt/lists/*

# Setup ccache
RUN /usr/sbin/update-ccache-symlinks
RUN mkdir /opt/ccache && ccache --set-config=cache_dir=/opt/ccache

# Common dependencies for PyTorch
RUN conda install astunparse numpy ninja pyyaml mkl mkl-include setuptools cmake cffi typing_extensions future six requests dataclasses

# Linux specific dependency for PyTorch
RUN conda install -c pytorch magma-cuda113

# Clone PyTorch
RUN --mount=type=cache,target=/opt/ccache \
    cd / \
    && git clone --recursive https://github.com/pytorch/pytorch -b v${PYTORCH_VERSION}
# Note that we need to use the same NCCL version for PyTorch and OFI plugin.
# To enforce that, install NCCL from source before building PT and OFI plugin.

# Install NCCL.
# Required for building OFI plugin (OFI requires NCCL's header files and library)
RUN cd /pytorch/third_party/nccl \
    && rm -rf nccl \
    && git clone https://github.com/NVIDIA/nccl.git -b v${NCCL_VERSION}-1 \
    && cd nccl \
    && make -j64 src.build CUDA_HOME=/usr/local/cuda NVCC_GENCODE="-gencode=arch=compute_70,code=sm_70 -gencode=arch=compute_80,code=sm_80" \
    && make pkg.txz.build \
    && tar -xvf build/pkg/txz/nccl_*.txz -C $CONDA_PREFIX --strip-components=1

# Build and install PyTorch.
RUN cd /pytorch \
    && CMAKE_PREFIX_PATH="$(dirname $(which conda))/../" \
    python setup.py install \
    && rm -rf /pytorch

RUN ccache -C

# Build and install OFI plugin. \
# It is required to use libfabric.
RUN DEBIAN_FRONTEND=noninteractive apt-get update \
    && apt-get install -y --no-install-recommends \
        autoconf \
        automake \
        libtool
RUN mkdir /tmp/efa-ofi-nccl \
    && cd /tmp/efa-ofi-nccl \
    && git clone https://github.com/aws/aws-ofi-nccl.git -b v${BRANCH_OFI} \
    && cd aws-ofi-nccl \
    && ./autogen.sh \
    && ./configure --with-libfabric=/opt/amazon/efa \
        --with-mpi=/opt/amazon/openmpi \
        --with-cuda=/usr/local/cuda \
        --with-nccl=$CONDA_PREFIX \
    && make \
    && make install \
    && rm -rf /tmp/efa-ofi-nccl

# Build and install Torchvision
RUN pip install --no-cache-dir -U \
    packaging \
    mpi4py==3.0.3
RUN cd /tmp \
    && git clone https://github.com/pytorch/vision.git -b v0.9.1 \
    && cd vision \
    && BUILD_VERSION="0.9.1+cu111" python setup.py install \
    && cd /tmp \
    && rm -rf vision

# Install OpenSSH.
# Required for MPI to communicate between containers, allow OpenSSH to talk to containers without asking for confirmation
RUN apt-get update \
    && apt-get install -y  --allow-downgrades --allow-change-held-packages --no-install-recommends \
    && apt-get install -y --no-install-recommends openssh-client openssh-server \
    && mkdir -p /var/run/sshd \
    && cat /etc/ssh/ssh_config | grep -v StrictHostKeyChecking > /etc/ssh/ssh_config.new \
    && echo "    StrictHostKeyChecking no" >> /etc/ssh/ssh_config.new \
    && mv /etc/ssh/ssh_config.new /etc/ssh/ssh_config \
    && rm -rf /var/lib/apt/lists/*
# Configure OpenSSH so that nodes can communicate with each other
RUN mkdir -p /var/run/sshd && \
    sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd
RUN rm -rf /root/.ssh/ && \
    mkdir -p /root/.ssh/ && \
    ssh-keygen -q -t rsa -N '' -f /root/.ssh/id_rsa && \
    cp /root/.ssh/id_rsa.pub /root/.ssh/authorized_keys \
    && printf "Host *\n StrictHostKeyChecking no\n" >> /root/.ssh/config

# Install PT S3 plugin.
# Required to efficiently access datasets in Amazon S3
RUN pip install --no-cache-dir -U ${PT_S3_WHL_GPU}
RUN mkdir -p /etc/pki/tls/certs && cp /etc/ssl/certs/ca-certificates.crt /etc/pki/tls/certs/ca-bundle.crt

# Install libboost from source.
# This package is needed for smdataparallel functionality (for networking asynchronous IO).
WORKDIR /
RUN wget https://sourceforge.net/projects/boost/files/boost/1.73.0/boost_1_73_0.tar.gz/download -O boost_1_73_0.tar.gz \
    && tar -xzf boost_1_73_0.tar.gz \
    && cd boost_1_73_0 \
    && ./bootstrap.sh \
    && ./b2 threading=multi --prefix=${CONDA_PREFIX} -j 64 cxxflags=-fPIC cflags=-fPIC install || true \
    && cd .. \
    && rm -rf boost_1_73_0.tar.gz \
    && rm -rf boost_1_73_0 \
    && cd ${CONDA_PREFIX}/include/boost

# Install SageMaker AI PyTorch training.
WORKDIR /root
RUN pip install --no-cache-dir -U \
    smclarify \
    "sagemaker>=2,<3" \
    sagemaker-experiments==0.* \
    sagemaker-pytorch-training

# Install SageMaker AI data parallel binary (SMDDP)
# Start with dependencies
RUN --mount=type=cache,id=apt-final,target=/var/cache/apt \
    apt-get update && apt-get install -y  --no-install-recommends \
        jq \
        libhwloc-dev \
        libnuma1 \
        libnuma-dev \
        libssl1.1 \
        libtool \
        hwloc \
    && rm -rf /var/lib/apt/lists/*

# Install SMDDP
RUN SMDATAPARALLEL_PT=1 pip install --no-cache-dir ${SMDATAPARALLEL_BINARY}
```

**작은 정보**  
SageMaker AI에서 훈련용 사용자 지정 Dockerfile을 만드는 방법에 대한 일반적인 내용은 [자체 훈련 알고리즘 사용](https://docs.aws.amazon.com/sagemaker/latest/dg/your-algorithms-training-algo.html)을 참조하세요.

**작은 정보**  
사용자 정의 Dockerfile을 확장하여 SageMaker AI 모델 병렬 라이브러리를 통합하려면 [SageMaker 분산 모델 병렬 라이브러리로 자체 Docker 컨테이너 생성](model-parallel-sm-sdk.md#model-parallel-bring-your-own-container) 섹션을 참조하세요.

# Amazon SageMaker AI 데이터 병렬화 라이브러리 예시
<a name="distributed-data-parallel-v2-examples"></a>

이 페이지에서는 SageMaker AI 분산 데이터 병렬화(SMDDP) 라이브러리를 구현하여 SageMaker AI에서 분산 훈련 작업을 실행하는 예시를 보여주는 Jupyter Notebook을 제공합니다.

## 블로그 및 사례 연구
<a name="distributed-data-parallel-v2-examples-blog"></a>

다음 블로그에서는 SMDDP 라이브러리 사용에 대한 사례 연구를 설명합니다.

**SMDDP v2 블로그**
+ [Enable faster training with Amazon SageMaker AI data parallel library](https://aws.amazon.com/blogs/machine-learning/enable-faster-training-with-amazon-sagemaker-data-parallel-library/), *AWS 기계 학습 블로그*(2023년 12월 5일)

**SMDDP v1 블로그**
+ [How I trained 10TB for Stable Diffusion on SageMaker AI](https://medium.com/@emilywebber/how-i-trained-10tb-for-stable-diffusion-on-sagemaker-39dcea49ce32)(*Medium*에 게시, 2022년 11월 29일)
+ [Amazon 검색 기능을 갖춘 Amazon SageMaker 훈련에서 PyTorch Lightning 및 네이티브 PyTorch DDP 실행하기](https://aws.amazon.com/blogs/machine-learning/run-pytorch-lightning-and-native-pytorch-ddp-on-amazon-sagemaker-training-featuring-amazon-search/)(*AWS Machine Learning Blog*에 게시, 2022년 8월 18일)
+ [PyTorch 및 SageMaker AI 분산 데이터 병렬 라이브러리를 AWS 사용하여에서 YOLOv5 훈련](https://medium.com/@sitecao/training-yolov5-on-aws-with-pytorch-and-sagemaker-distributed-data-parallel-library-a196ab01409b), *Medium*(2022년 5월 6일)
+ [Speed up EfficientNet model training on SageMaker AI with PyTorch and the SageMaker AI distributed data parallel library](https://medium.com/@dangmz/speed-up-efficientnet-model-training-on-amazon-sagemaker-with-pytorch-and-sagemaker-distributed-dae4b048c01a)(*Medium*에 게시, 2022년 3월 21일)
+ [SageMaker AI 분산 데이터 병렬 라이브러리 Towards Data Science AWS 를 사용하여에서 EfficientNet 훈련 속도 향상](https://towardsdatascience.com/speed-up-efficientnet-training-on-aws-by-up-to-30-with-sagemaker-distributed-data-parallel-library-2dbf6d1e18e8)(2022년 1월 12일) ** 
+ [Hyundai reduces ML model training time for autonomous driving models using Amazon SageMaker AI](https://aws.amazon.com/blogs/machine-learning/hyundai-reduces-training-time-for-autonomous-driving-models-using-amazon-sagemaker/)(*AWS 기계 학습 블로그*에 게시, 2021년 6월 25일)
+ [Distributed Training: Train BART/T5 for Summarization using Transformers and Amazon SageMaker AI](https://huggingface.co/blog/sagemaker-distributed-training-seq2seq)(*Hugging Face 웹사이트*에 게시, 2021년 4월 8일)

## 예제 노트북
<a name="distributed-data-parallel-v2-examples-pytorch"></a>

예시 노트북은 [SageMaker AI 예시 GitHub 리포지토리](https://github.com/aws/amazon-sagemaker-examples/tree/master/training/distributed_training/)에서 제공됩니다. 예제를 다운로드하려면 다음 명령을 실행하여 리포지토리를 복제하고 `training/distributed_training/pytorch/data_parallel`로 이동합니다.

**참고**  
다음 SageMaker AI ML IDE에서 예시 노트북을 복제하고 실행합니다.  
[SageMaker AI JupyterLab](https://docs.aws.amazon.com/sagemaker/latest/dg/studio-updated-jl.html)(2023년 12월 이후 제작된 [Studio](https://docs.aws.amazon.com/sagemaker/latest/dg/studio-updated.html)에서 사용 가능)
[SageMaker AI Code Editor](https://docs.aws.amazon.com/sagemaker/latest/dg/code-editor.html)(2023년 12월 이후 제작된 [Studio](https://docs.aws.amazon.com/sagemaker/latest/dg/studio-updated.html)에서 사용 가능)
[Studio Classic](https://docs.aws.amazon.com/sagemaker/latest/dg/studio.html)(2023년 12월 이후에 생성된 [Studio](https://docs.aws.amazon.com/sagemaker/latest/dg/studio-updated.html)에서 애플리케이션으로 사용 가능)
[SageMaker Notebook 인스턴스](https://docs.aws.amazon.com/sagemaker/latest/dg/nbi.html)

```
git clone https://github.com/aws/amazon-sagemaker-examples.git
cd amazon-sagemaker-examples/training/distributed_training/pytorch/data_parallel
```

**SMDDP v2 예제**
+ [Train Llama 2 using the SageMaker AI distributed data parallel library (SMDDP) and DeepSpeed](https://github.com/aws/amazon-sagemaker-examples/blob/main/training/distributed_training/pytorch/data_parallel/deepspeed/llama2/smddp_deepspeed_example.ipynb)
+ [Train Falcon using the SageMaker AI distributed data parallel library (SMDDP) and PyTorch Fully Sharded Data Parallelism (FSDP)](https://github.com/aws/amazon-sagemaker-examples/blob/main/training/distributed_training/pytorch/data_parallel/fully_sharded_data_parallel/falcon/smddp_fsdp_example.ipynb)

**SMDDP v1 예제**
+ [PyTorch 및 SageMaker AI 데이터 병렬화 라이브러리를 사용한 CNN](https://github.com/aws/amazon-sagemaker-examples/blob/main/training/distributed_training/pytorch/data_parallel/mnist/pytorch_smdataparallel_mnist_demo.ipynb)
+ [PyTorch 및 SageMaker AI 데이터 병렬화 라이브러리를 사용한 BERT](https://github.com/aws/amazon-sagemaker-examples/blob/main/training/distributed_training/pytorch/data_parallel/bert/pytorch_smdataparallel_bert_demo.ipynb)
+ [TensorFlow 2.3.1 및 SageMaker AI 데이터 병렬화 라이브러리를 사용한 CNN](https://sagemaker-examples.readthedocs.io/en/latest/training/distributed_training/tensorflow/data_parallel/mnist/tensorflow2_smdataparallel_mnist_demo.html)
+ [TensorFlow 2.3.1 및 SageMaker AI 데이터 병렬화 라이브러리를 사용한 BERT](https://sagemaker-examples.readthedocs.io/en/latest/training/distributed_training/tensorflow/data_parallel/bert/tensorflow2_smdataparallel_bert_demo.html)
+ [SageMaker AI 기반 PyTorch에서 HuggingFace 분산형 데이터 병렬화 훈련 - 분산형 관련 질문 응답](https://github.com/huggingface/notebooks/blob/master/sagemaker/03_distributed_training_data_parallelism/sagemaker-notebook.ipynb)
+ [SageMaker AI 기반 PyTorch에서 HuggingFace 분산형 데이터 병렬화 훈련 - 분산형 텍스트 요약](https://github.com/huggingface/notebooks/blob/master/sagemaker/08_distributed_summarization_bart_t5/sagemaker-notebook.ipynb)
+ [SageMaker AI 기반 TensorFlow에서 HuggingFace 분산형 데이터 병렬화 훈련](https://github.com/huggingface/notebooks/blob/master/sagemaker/07_tensorflow_distributed_training_data_parallelism/sagemaker-notebook.ipynb)

# SageMaker AI 분산 데이터 병렬화 라이브러리의 구성에 관한 팁
<a name="data-parallel-config"></a>

SageMaker AI의 분산 데이터 병렬화(SMDDP) 라이브러리를 사용하기 전에 다음 팁을 검토합니다. 이 목록에는 모든 프레임워크에 적용할 수 있는 팁이 포함되어 있습니다.

**Topics**
+ [데이터 사전 처리](#data-parallel-config-dataprep)
+ [단일 노드 및 다중 노드 비교](#data-parallel-config-multi-node)
+ [Debugger를 이용한 디버깅 확장 효율](#data-parallel-config-debug)
+ [배치 크기](#data-parallel-config-batch-size)
+ [사용자 지정 MPI 옵션](#data-parallel-config-mpi-custom)
+ [Amazon FSx 사용과 최적의 스토리지 및 처리량 설정](#data-parallel-config-fxs)

## 데이터 사전 처리
<a name="data-parallel-config-dataprep"></a>

CPU를 사용하는 외부 라이브러리를 이용하여 훈련 중에 데이터를 전처리할 경우, SageMaker AI 분산 데이터 병렬이 `AllReduce` 연산에 CPU를 사용하기 때문에 CPU 병목 현상이 발생할 수 있습니다. 전처리 단계를 GPU를 사용할 라이브러리로 이동시키거나 훈련 전에 모든 전처리를 완료하여 훈련 시간을 개선할 수 있습니다.

## 단일 노드 및 다중 노드 비교
<a name="data-parallel-config-multi-node"></a>

이 라이브러리는 여러 개의 노드와 함께 사용하는 것이 좋습니다. 이 라이브러리는 단일 호스트 및 다중 디바이스 설정(예: 여러 개의 GPU를 갖춘 단일 ML 컴퓨팅 인스턴스)과 함께 사용할 수 있습니다. 다만 노드를 2개 이상 사용하면 라이브러리의 `AllReduce` 연산을 통해 성능이 크게 향상됩니다. NVLink는 이미 단일 호스트에서도 노드 내 `AllReduce` 효율에 기여하고 있습니다.

## Debugger를 이용한 디버깅 확장 효율
<a name="data-parallel-config-debug"></a>

Amazon SageMaker Debugger를 사용하여 훈련 중에 CPU 및 GPU 사용률과 기타 관심 대상 지표를 모니터링하고 시각화할 수 있습니다. Debugger [기본 제공 규칙](https://docs.aws.amazon.com/sagemaker/latest/dg/debugger-built-in-rules.html)을 사용하여 컴퓨팅 성능 문제(예: `CPUBottleneck`, `LoadBalancing`, `LowGPUUtilization`)를 모니터링할 수 있습니다. Amazon SageMaker Python SDK 예측기를 정의하면 [Debugger 구성](https://docs.aws.amazon.com/sagemaker/latest/dg/debugger-configuration-for-debugging.html)으로 이 규칙을 지정할 수 있습니다. SageMaker AI 훈련에 AWS CLI 및 AWS SDK for Python (Boto3) 를 사용하는 경우 [ Amazon SageMaker API를 사용하여 SageMaker 디버거 구성에 표시된 대로 디버거를](https://docs.aws.amazon.com/sagemaker/latest/dg/debugger-createtrainingjob-api.html) 활성화할 수 있습니다.

SageMaker 훈련 작업에서 Debugger를 사용하는 예제를 확인하려면 [SageMaker Notebook Examples GitHub 리포지토리](https://github.com/aws/amazon-sagemaker-examples/tree/master/sagemaker-debugger)에 있는 노트북 예제 중 하나를 참조하면 됩니다. Debugger에 대한 자세한 정보는 [Amazon SageMaker Debugger](https://docs.aws.amazon.com/sagemaker/latest/dg/train-debugger.html)를 참조하세요.

## 배치 크기
<a name="data-parallel-config-batch-size"></a>

분산 훈련에서는 노드가 많이 추가될수록 배치 크기도 그에 비례하여 증가해야 합니다. 훈련 작업에 노드를 더 추가하고 전역 배치 크기를 늘리는 동시에 수렴 속도를 향상시키려면 학습률을 높이세요.

이를 달성할 방법은 훈련 작업이 진행됨에 따라 학습률을 작은 값에서 큰 값으로 높이는 점진적 학습률 워밍업을 이용하는 것입니다. 이와 같은 상승은 학습률의 급격한 증가를 방지함으로써 훈련 시작 시 수렴이 원활해지게 합니다. 그 예로 *선형적 확장 규칙*(소규모 배치 크기에 k를 곱할 때마다 학습률에도 k를 곱함)을 사용할 수 있습니다. 이 기법에 대한 자세한 내용은 연구 논문 [Accurate, Large Minibatch SGD: Training ImageNet in 1 Hour](https://arxiv.org/pdf/1706.02677.pdf)의 2항과 3항을 참조하세요.

## 사용자 지정 MPI 옵션
<a name="data-parallel-config-mpi-custom"></a>

SageMaker AI 분산 데이터 병렬 라이브러리는 고성능 클러스터의 노드 간 통신 관리에 널리 사용되는 표준인 Message Passing Interface(MPI)를 사용하며, GPU 수준의 통신에 NVIDIA의 NCCL 라이브러리를 사용합니다. TensorFlow 또는 Pytorch `Estimator`와 함께 데이터 병렬 라이브러리를 사용하면 각 컨테이너가 MPI 환경을 설정하고 `mpirun` 명령을 실행하여 클러스터 노드로 작업을 시작합니다.

`Estimator`의 `custom_mpi_options` 파라미터를 사용하여 사용자 지정 MPI 연산을 설정할 수 있습니다. 이 필드에 전달된 모든 `mpirun` 플래그는 `mpirun` 명령에 추가되며 훈련 목적으로 SageMaker AI에서 실행됩니다. 그 예로 다음을 사용하여 `Estimator`의 `distribution` 파라미터를 정의하면, 프로그램 시작 시 [https://docs.nvidia.com/deeplearning/nccl/user-guide/docs/env.html#nccl-debug](https://docs.nvidia.com/deeplearning/nccl/user-guide/docs/env.html#nccl-debug) 변수를 사용하여 NCCL 버전을 인쇄할 수 있습니다.

```
distribution = {'smdistributed':{'dataparallel':{'enabled': True, "custom_mpi_options": "-verbose -x NCCL_DEBUG=VERSION"}}}
```

## Amazon FSx 사용과 최적의 스토리지 및 처리량 설정
<a name="data-parallel-config-fxs"></a>

분산 데이터 병렬 처리를 이용하여 다중 노드로 모델을 훈련시킬 때는 [FSx for Lustre](https://docs.aws.amazon.com/fsx/latest/LustreGuide/what-is.html)를 사용하는 것이 가장 좋습니다. Amazon FSx는 더 빠른 처리량으로 공유 파일 스토리지를 지원하는 확장형 고성능 스토리지 서비스입니다. Amazon FSx 스토리지를 대규모로 사용하면 모든 컴퓨팅 노드에서 더 빠른 데이터 로드 속도를 달성할 수 있습니다.

일반적으로는 분산 데이터 병렬 처리를 사용할 경우, 총 훈련 처리량이 GPU 수에 따라 거의 선형적으로 확장될 것으로 예상됩니다. 그러나 최적이 아닌 Amazon FSx 스토리지를 사용한다면 Amazon FSx 처리량이 적어져 훈련 성능이 저하될 수 있습니다.

그 예로 스토리지 용량이 최소 1.2TiB인 [**SCRATCH\$12** 배포 유형의 Amazon FSx 파일 시스템](https://docs.aws.amazon.com/fsx/latest/LustreGuide/performance.html#fsx-aggregate-perf)을 사용할 경우, I/O 처리량은 240MB/s입니다. Amazon FSx 스토리지는 사용자가 물리적 스토리지 디바이스를 할당할 수 있도록 작동합니다. 할당되는 디바이스가 많을수록 사용자가 얻는 처리량도 큽니다. SRATCH\$12 유형의 최소 스토리지 증분은 1.2TiB이며, 이에 해당하는 처리량 증분은 240MB/s입니다.

100GB 이상의 데이터세트를 4노드 클러스터로 훈련시킬 모델이 있다고 가정해 봅시다. 제공된 배치 크기가 클러스터에 최적화되어 있을 경우, 해당 모델이 약 30초 내에 한 에포크를 완료할 수 있다고 가정해 봅시다. 이 경우 필요한 최소 I/O 속도는 약 3GB/s(100GB/30s)입니다. 이러한 속도는 240MB/s보다 훨씬 높은 처리량 요건으로 보입니다. 이처럼 제한된 Amazon FSx 용량을 이용하여 분산 훈련 작업을 대규모 클러스터로 확장하면 I/O 병목 현상 문제가 악화될 수 있습니다. 캐시가 누적되면 이후의 에포크에서 모델 훈련 처리량이 향상될 수 있으나, Amazon FSx 처리량에 병목 현상이 남아 있을 수 있습니다.

이러한 I/O 병목 현상 문제를 완화하려면 처리량이 증가할 수 있도록 Amazon FSx 스토리지 크기를 늘려야 합니다. 일반적으로 최적의 I/O 처리량을 구하기 위해서는, I/O 병목 현상 문제 해결에 충분하다고 판단될 때까지 다양한 Amazon FSx 처리량을 실험하여 추정치와 같거나 그보다 조금 적은 처리량을 할당하면 됩니다. 앞서 언급한 예제의 경우에는 처리량이 2.4GB/s이고 RAM 캐시가 67GB인 Amazon FSx 스토리지가 충분합니다. 파일 시스템의 처리량이 최적인 경우에는 모델 훈련 처리량이 즉시 또는 캐시가 누적된 첫 번째 에포크 이후 최대치에 도달해야 합니다.

Amazon FSx 스토리지 및 배포 유형을 늘리는 방법은 *Amazon FSx for Lustre 설명서*의 다음 페이지를 참조하세요.
+  [스토리지 용량을 늘리는 방법](https://docs.aws.amazon.com/fsx/latest/LustreGuide/managing-storage-capacity.html#increase-storage-capacity) 
+  [집계 파일 시스템 성능](https://docs.aws.amazon.com/fsx/latest/LustreGuide/performance.html#fsx-aggregate-perf) 

# Amazon SageMaker AI 분산형 데이터 병렬화 라이브러리 관련 자주 묻는 질문
<a name="data-parallel-faq"></a>

다음 내용을 통해 SMDDP 라이브러리에 관해 자주 묻는 질문에 대한 답변을 확인하세요.

**Q: 라이브러리 사용 시 `allreduce` 지원 CPU 인스턴스는 어떻게 관리하나요? 이종 CPU-GPU 클러스터를 만들어야 하나요? 아니면 SageMaker AI 서비스를 통해 SMDDP 라이브러리를 사용하는 작업에 대해 추가 C5를 만들어야 하나요? ** 

SMDDP 라이브러리는 NVIDIA A100 GPU 및 EFA를 사용하는 GPU 인스턴스, 특히 P4d GPU 및 P4de 인스턴스만 지원합니다. 추가 C5 또는 CPU 인스턴스는 시작되지 않습니다. SageMaker AI 훈련 작업이 8노드 P4d클러스터인 경우에는 `ml.p4d.24xlarge` 인스턴스 8개만 사용됩니다. 추가 인스턴스는 프로비저닝되지 않습니다.

**Q: 하이퍼파라미터 H1 세트(학습률, 배치 크기, 최적화 프로그램 등)를 사용하는 단일 `ml.p3.24xlarge` 인스턴스에서 훈련 작업을 수행하면 5일이 걸립니다. SageMaker AI의 데이터 병렬화 라이브러리와 5배 더 큰 클러스터를 사용하면 약 5배의 속도 향상을 달성할 수 있나요? 아니면 SMDDP 라이브러리를 활성화한 후에 그 훈련 하이퍼파라미터를 다시 확인해야 하나요? ** 

이 라이브러리는 전체 배치 크기를 변경합니다. 새로운 전체 배치 크기는 사용된 훈련 인스턴스의 수에 따라 선형적으로 조정됩니다. 따라서 학습률 등의 하이퍼파라미터를 변경해야 수렴이 보장됩니다.

**Q: SMDDP 라이브러리가 스팟을 지원하나요? ** 

예. 사용자는 관리형 스팟 훈련을 사용할 수 있습니다. SageMaker 훈련 작업에서는 체크포인트 파일의 경로를 지정해야 합니다. [TensorFlow 훈련 스크립트에서 SMDDP 라이브러리 사용(사용되지 않음)](data-parallel-modify-sdp-tf2.md) 및 [PyTorch 훈련 스크립트에서 SMDDP 라이브러리 사용](data-parallel-modify-sdp-pt.md)의 마지막 단계에서 설명한 대로 훈련 스크립트에 체크포인트를 저장하고 복원해야 합니다.

**Q: SMDDP 라이브러리가 단일 호스트 다중 디바이스 설정과 관련이 있나요?**

이 라이브러리는 단일 호스트 다중 디바이스 훈련에서 사용할 수 있지만, 다중 호스트 훈련에서만 성능 향상을 보여줍니다.

**Q: 훈련 데이터세트는 어디에 저장해야 하나요? ** 

훈련 데이터세트는 Amazon S3 버킷 또는 Amazon FSx 드라이브에 저장할 수 있습니다. [훈련 작업에 지원되는 다양한 입력 파일 시스템](https://sagemaker.readthedocs.io/en/stable/api/utility/inputs.html#sagemaker.inputs.FileSystemInput)은 이 문서를 참조하세요.

**Q: SMDDP 라이브러리 사용 시 훈련 데이터가 반드시 FSx for Lustre에 있어야 하나요? 아마존 EFS 및 아마존 S3를 사용할 수 있나요? ** 

지연 시간이 짧고 처리량이 많으므로, 일반적으로는 Amazon FSx를 사용하는 것이 좋습니다. 선호도에 따라 Amazon EFS 또는 Amazon S3 중 하나를 사용할 수 있습니다.

**Q: 라이브러리를 CPU 노드와 함께 사용할 수 있나요?**

아니요. SMDDP 라이브러리에서 지원되는 인스턴스 유형을 찾으려면 [지원되는 인스턴스 유형](distributed-data-parallel-support.md#distributed-data-parallel-supported-instance-types) 섹션을 참조하세요.

**Q: 출시 시점의 SMDDP 라이브러리에서는 현재 어떤 프레임워크 및 프레임워크 버전을 지원하나요?**

SMDDP 라이브러리는 현재 PyTorch v1.6.0 이상 및 TensorFlow v2.3.0 이상을 지원합니다. TensorFlow 1.x은 지원하지 않습니다. AWS 딥 러닝 컨테이너에 패키징된 SMDDP 라이브러리 버전에 대한 자세한 내용은 [딥 러닝 컨테이너 관련 릴리스 정보](https://docs.aws.amazon.com/deep-learning-containers/latest/devguide/dlc-release-notes.html)를 참조하세요.

**Q: 라이브러리가 AMP를 지원하나요?**

예, SMDDP 라이브러리는 즉시 AMP(Automatic Mixed Precision)를 지원합니다. 훈련 스크립트를 프레임워크 수준에서 수정하는 것 외에는 AMP를 사용하기 위한 추가 작업이 필요하지 않습니다. FP16에 그라디언트가 있는 경우, SageMaker AI 데이터 병렬화 라이브러리는 FP16에서 `AllReduce` 작업을 실행합니다. 훈련 스크립트에서 AMP API를 구현하는 방법에 대한 자세한 내용은 다음 리소스를 참조하세요.
+ *NVIDIA 딥 러닝 성능 설명서*의 [프레임워크 - PyTorch](https://docs.nvidia.com/deeplearning/performance/mixed-precision-training/index.html#pytorch)
+ *NVIDIA 딥 러닝 성능 설명서*의 [프레임워크 - TensorFlow](https://docs.nvidia.com/deeplearning/performance/mixed-precision-training/index.html#tensorflow)
+ *NVIDIA 개발자 문서*의 [딥 러닝용 자동 혼합 정밀도](https://developer.nvidia.com/automatic-mixed-precision)
+ *PyTorch 블로그*의 [NVIDIA GPU에서 더 빠른 훈련을 위한 기본 PyTorch 자동 혼합 정밀도 도입](https://pytorch.org/blog/accelerating-training-on-nvidia-gpus-with-pytorch-automatic-mixed-precision/)
+ *TensorFlow 설명서*의 [TensorFlow 혼합 정밀도 API](https://www.tensorflow.org/guide/mixed_precision)

**Q: 분산 훈련 작업이 I/O 병목 현상 때문에 느려졌는지 어떻게 알 수 있나요?**

클러스터가 클수록 훈련 작업에 필요한 I/O 처리량이 늘어납니다. 따라서 훈련 처리량이 최대 성능까지 높아지기까지 더 오랜 시간(더 많은 에포크)이 걸릴 수 있습니다. 이는 노드를 확장함에 따라 I/O에 병목 현상이 발생하고 캐시 구축이 더 어려워진다는 뜻입니다(처리량 요건이 더 어려워지고 네트워크 토폴로지가 더 복잡해짐). CloudWatch로 Amazon FSx 처리량을 모니터링하는 방법에 대한 자세한 내용은 *FSx for Lustre 사용 설명서*의 [FSx for Lustre 모니터링](https://docs.aws.amazon.com/fsx/latest/LustreGuide/monitoring_overview.html)을 참조하세요.

**Q: 데이터 병렬 처리를 이용하여 분산 훈련 작업을 실행할 때 I/O 병목 현상을 해결하려면 어떻게 해야 하나요?**

Amazon S3를 사용한다면 Amazon FSx를 데이터 채널로 사용하는 것이 가장 좋습니다. 이미 Amazon FSx를 사용하고 있는데도 여전히 I/O 병목 현상 문제가 있다면, Amazon FSx 파일 시스템을 낮은 I/O 처리량과 적은 스토리지 용량으로 설정했을 수도 있습니다. 적절한 I/O 처리량 크기를 추정하고 선택하는 방법에 대한 자세한 내용은 [Amazon FSx 사용과 최적의 스토리지 및 처리량 설정](data-parallel-config.md#data-parallel-config-fxs)을(를) 참조하세요.

**Q: (라이브러리 v1.4.0 이상인 경우) 프로세스 그룹을 초기화하는 동시에 `Invalid backend` 오류를 해결하려면 어떻게 해야 하나요?**

`init_process_group`을(를) 호출할 때 오류 메시지 `ValueError: Invalid backend: 'smddp'`이(가) 나타나는 경우, 이는 SMDDP 라이브러리 v1.4.0 이상의 주요 변경 사항 때문입니다. PyTorch의 백엔드로 `smddp`이(가) 등록되는 라이브러리, 즉 `smdistributed.dataparallel.torch.torch_smddp`의 PyTorch 클라이언트를 가져와야 합니다. 자세한 내용은 [PyTorch 훈련 스크립트에서 SMDDP 라이브러리 사용](data-parallel-modify-sdp-pt.md)를 참조하세요.

**Q: (SMDDP 라이브러리 v1.4.0 이상인 경우) torch.distributed [https://pytorch.org/docs/stable/distributed.html](https://pytorch.org/docs/stable/distributed.html) 인터페이스의 집단적 프리미티브를 호출하고자 합니다. `smddp` 백엔드는 어떤 프리미티브를 지원하나요?**

v1.4.0에서 SMDDP 라이브러리는 `torch.distributed` 인터페이스의 `all_reduce`, `broadcast`, `reduce` `all_gather` 및 `barrier`를 지원합니다.

**Q: (SMDDP 라이브러리 v1.4.0 이상인 경우) 이 새 API는 다른 사용자 지정 DDP 클래스 또는 라이브러리(예: Apex DDP)를 통해 작동하나요? ** 

SMDDP 라이브러리는 `torch.distribtued` 모듈을 사용하는 다른 서드 파티 분산 데이터 병렬 라이브러리 및 프레임워크 구현을 통해 테스트됩니다. SMDDP 라이브러리가 지원하는 사용자 지정 DDP 클래스에서 집합 작업을 사용하는 한, 사용자 지정 DDP 클래스로 SMDDP 라이브러리를 사용하는 것이 가능합니다. 지원 대상 집합체의 목록은 이전 질문을 참조하세요. 이러한 사용 사례에 해당하고 추가 지원이 필요한 경우, [AWS 지원 센터](https://console.aws.amazon.com/support/) 또는 [AWS Amazon SageMaker AI 개발자 포럼](https://forums.aws.amazon.com/forum.jspa?forumID=285)을 통해 SageMaker AI 담당 팀에 문의하세요.

**Q: SMDDP 라이브러리가 자체 컨테이너 가져오기(BYOC) 옵션을 지원하나요? 지원할 경우, 사용자 지정 Dockerfile을 작성하여 라이브러리를 설치하고 분산 훈련 작업을 실행하려면 어떻게 해야 하나요?**

SMDDP 라이브러리와 그 최소 종속성을 자체 Docker 컨테이너에 통합하려는 경우에는 BYOC가 적절한 방법입니다. 라이브러리의 바이너리 파일을 사용하여 자체 컨테이너를 빌드할 수 있습니다. 가장 권장하는 프로세스는 이 라이브러리와 해당 라이브러리의 종속성으로 사용자 지정 Dockerfile을 작성하고, Docker 컨테이너를 빌드하고, Amazon ECR에서 해당 컨테이너를 호스팅하고, ECR 이미지 URI를 사용하여 SageMaker AI 일반 예측기 클래스로 훈련 작업을 시작하는 것입니다. SMDDP 라이브러리를 사용하여 SageMaker AI의 분산 훈련에 필요한 사용자 지정 Dockerfile을 준비하는 방법에 대한 자세한 설명은 [SageMaker AI 분산 데이터 병렬 라이브러리로 자체 Docker 컨테이너 만들기](data-parallel-bring-your-own-container.md) 섹션을 참조하세요.

# Amazon SageMaker AI의 분산 훈련에 관한 문제 해결
<a name="distributed-troubleshooting-data-parallel"></a>

라이브러리 사용 시 훈련 작업을 실행하는 데 문제가 있는 경우, 다음 목록을 사용하여 문제를 해결해 보세요. 추가 지원이 필요한 경우 [AWS 지원 센터](https://console.aws.amazon.com/support/) 또는 [AWS Amazon SageMaker AI의 개발자 포럼](https://forums.aws.amazon.com/forum.jspa?forumID=285)을 통해 SageMaker AI 담당 팀에 문의하세요.

**Topics**
+ [Amazon SageMaker Debugger 및 체크포인트를 통한 SageMaker AI 분산형 데이터 병렬 사용](#distributed-ts-data-parallel-debugger)
+ [모델 파라미터 키에 연결된 예기치 않은 접두사](#distributed-ts-data-parallel-pytorch-prefix)
+ [초기화 도중 SageMaker AI 분산 훈련 작업이 지연되는 현상](#distributed-ts-data-parallel-efa-sg)
+ [훈련 종료 시 SageMaker AI 분산 훈련 작업이 지연되는 현상](#distributed-ts-data-parallel-stall-at-the-end)
+ [Amazon FSx 처리량 병목 현상으로 인한 확장 효율 저하 발견](#distributed-ts-data-parallel-fxs-bottleneck)
+ [PyTorch를 이용한 SageMaker AI 분산 훈련 작업을 통해 반환되는 사용 중단 경고](#distributed-ts-data-parallel-deprecation-warnings)

## Amazon SageMaker Debugger 및 체크포인트를 통한 SageMaker AI 분산형 데이터 병렬 사용
<a name="distributed-ts-data-parallel-debugger"></a>

SageMaker AI 분산형 데이터 병렬을 사용하여 시스템 병목 현상을 모니터링하고, 프레임워크 연산을 프로파일링하고, 훈련 작업에 필요한 모델 출력 텐서를 디버깅하려면 Amazon SageMaker Debugger를 사용하세요.

다만 SageMaker Debugger, SageMaker AI 분산형 데이터 병렬, SageMaker AI 체크포인트를 사용하면 다음 예시와 같은 오류가 나타날 수 있습니다.

```
SMDebug Does Not Currently Support Distributed Training Jobs With Checkpointing Enabled
```

이는 Debugger와 체크포인트 사이의 내부 오류(SageMaker AI 분산형 데이터 병렬을 사용할 때 발생함) 때문입니다.
+ 세 기능을 모두 활성화하면 SageMaker Python SDK가 다음 프레임워크 `estimator` 예제와 동일한 `debugger_hook_config=False`을(를) 전달하여 Debugger를 자동으로 끕니다.

  ```
  bucket=sagemaker.Session().default_bucket()
  base_job_name="sagemaker-checkpoint-test"
  checkpoint_in_bucket="checkpoints"
  
  # The S3 URI to store the checkpoints
  checkpoint_s3_bucket="s3://{}/{}/{}".format(bucket, base_job_name, checkpoint_in_bucket)
  
  estimator = TensorFlow(
      ...
  
      distribution={"smdistributed": {"dataparallel": { "enabled": True }}},
      checkpoint_s3_uri=checkpoint_s3_bucket,
      checkpoint_local_path="/opt/ml/checkpoints",
      debugger_hook_config=False
  )
  ```
+ SageMaker AI 분산형 데이터 병렬 및 SageMaker Debugger 모두 계속 사용하려는 경우, 차선책은 예측기에서 `checkpoint_s3_uri` 및 `checkpoint_local_path` 파라미터를 지정하는 대신 훈련 스크립트에 체크포인트 지정 함수를 수동으로 추가하는 것입니다. 훈련 스크립트 내 수동 체크포인트 지정을 설정하는 방법에 대한 자세한 내용은 [체크포인트 저장](distributed-troubleshooting-model-parallel.md#distributed-ts-model-parallel-checkpoints)을(를) 참조하세요.

## 모델 파라미터 키에 연결된 예기치 않은 접두사
<a name="distributed-ts-data-parallel-pytorch-prefix"></a>

PyTorch 분산 훈련 작업의 경우, 예기치 않은 접두사(예: `model`)가 `state_dict` 키(모델 파라미터)에 붙을 수 있습니다. SageMaker AI 데이터 병렬 라이브러리는 PyTorch 훈련 작업에서 모델 아티팩트를 저장할 때 어떤 모델 파라미터 이름도 직접 변경하거나 다른 단어 앞에 붙이지 않습니다. PyTorch의 분산 훈련에서는 네트워크 전체에 전달되도록 `state_dict`의 이름을 변경하고 접두사를 그 앞에 붙입니다. SageMaker AI 데이터 병렬 라이브러리를 사용하고 PyTorch 훈련용 체크포인트를 사용하는 동안 다른 파라미터 이름 때문에 모델 실패 문제가 발생할 경우, 훈련 스크립트에서 체크포인트를 로드하는 단계에서 접두사가 삭제되도록 다음 예시 코드를 조정합니다.

```
state_dict = {k.partition('model.')[2]:state_dict[k] for k in state_dict.keys()}
```

그러면 각 `state_dict` 키를 문자열 값으로 가져오고 처음으로 나타나는 `'model.'` 문자열을 분리한 다음, 파티션된 문자열의 세 번째 목록 항목(인덱스 2 포함)을 가져오게 됩니다.

접두사 문제에 대한 자세한 내용은 *PyTorch 토론 포럼*의 [다중 GPU로 훈련된 경우 저장된 모델의 파라미터 이름에 접두사를 붙이시겠습니까?](https://discuss.pytorch.org/t/prefix-parameter-names-in-saved-model-if-trained-by-multi-gpu/494)에 있는 토론 스레드를 참조하세요.

모델을 저장 및 로드하는 PyTorch 메서드에 대한 자세한 내용은 *PyTorch 설명서*의 [디바이스 간 모델 저장 및 로드](https://pytorch.org/tutorials/beginner/saving_loading_models.html#saving-loading-model-across-devices)를 참조하세요.

## 초기화 도중 SageMaker AI 분산 훈련 작업이 지연되는 현상
<a name="distributed-ts-data-parallel-efa-sg"></a>

EFA 활성화 인스턴스 사용 시 SageMaker AI 분산형 데이터 병렬 훈련 작업이 초기화 중에 지연된다면, 이는 훈련 작업에 사용되는 VPC 서브넷의 보안 그룹이 잘못 구성되었기 때문일 수 있습니다. EFA에 올바른 보안 그룹 구성이 적용되어야 노드 간 트래픽을 활성화할 수 있습니다.

**보안 그룹의 인바운드 및 아웃바운드 규칙을 구성하려면 다음 방법대로 하세요.**

1. 에 로그인 AWS Management Console 하고 [https://console.aws.amazon.com/vpc/](https://console.aws.amazon.com/vpc/) Amazon VPC 콘솔을 엽니다.

1. 왼쪽 탐색 창에서 **보안 그룹**을 선택하세요.

1. 훈련에 사용하는 VPC 서브넷에 연결된 보안 그룹을 선택하세요.

1. **세부 정보** 섹션에서 **보안 그룹 ID**를 복사하세요.

1. [**인바운드 규칙(Inbound rules)**] 탭에서 [**인바운드 규칙 편집(Edit inbound rules)**]을 선택합니다.

1. [**인바운드 규칙 편집(Edit inbound rules)**] 페이지에서 다음을 수행합니다.

   1. [**Add another rule**]을 선택합니다.

   1. **유형(Type)**에서 **모든 트래픽(All traffic)**을 선택합니다.

   1. **소스**에서 **사용자 지정**을 선택하고 보안 그룹 ID를 검색 창에 붙여 넣은 다음, 팝업 창으로 나타나는 보안 그룹을 선택하세요.

1. **규칙 저장**을 선택하여 해당 보안 그룹에 대한 인바운드 규칙 구성을 마치세요.

1. **아웃바운드 규칙**(Outbound rules) 탭에서 **아웃바운드 규칙 편집**(Edit outbound rules)을 선택합니다.

1. 6단계 및 7단계를 반복하여 동일한 규칙을 아웃바운드 규칙으로 추가하세요.

인바운드 및 아웃바운드 규칙으로 보안 그룹을 구성하는 이전 단계를 완료한 후, 훈련 작업을 다시 실행하고 지연 문제가 해결되었는지 확인하세요.

VPC용 및 EFA용 보안 그룹을 구성하는 방법에 대한 자세한 내용은 [VPC용 보안 그룹](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html) 및 [Elastic Fabric Adapter](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/efa.html)를 참조하세요.

## 훈련 종료 시 SageMaker AI 분산 훈련 작업이 지연되는 현상
<a name="distributed-ts-data-parallel-stall-at-the-end"></a>

훈련 종료 시 지연 문제가 발생하는 근본 원인 중 하나는 여러 순위를 통틀어 에포크 1개당 처리되는 배치의 수가 일치하지 않기 때문입니다. 모든 작업자(GPU)는 배치 반복이 끝날 때 모든 작업자가 동일한 모델 사본을 얻을 수 있도록 하위 버전 전달 시 로컬 그라데이션을 동기화합니다. 훈련의 마지막 에포크에서 배치 크기가 서로 다른 작업자 그룹에 고르지 않게 할당되면 훈련 작업이 지연됩니다. 예를 들면 한 작업자 그룹(그룹 A)이 모든 배치의 처리를 끝내고 훈련 루프를 종료하더라도, 다른 작업자 그룹(그룹 B)은 다른 배치의 처리를 시작하면서도 그룹 A와의 통신을 계속하면서 그라데이션을 동기화합니다. 이렇게 되면 그룹 B는 이미 훈련이 완료되어 동기화할 그라데이션이 없는 그룹 A를 기다리게 됩니다.

따라서 훈련 데이터세트를 설정할 때는 각 작업자가 훈련 기간 동안 동일한 개수의 배치를 거치도록, 각 작업자가 데이터 샘플을 동일한 개수만큼 확보해야 합니다. 이러한 지연 문제를 방지하려면 각 순위에 동일한 개수의 배치를 적용해야 합니다.

## Amazon FSx 처리량 병목 현상으로 인한 확장 효율 저하 발견
<a name="distributed-ts-data-parallel-fxs-bottleneck"></a>

확장 효율 저하의 가능한 원인 중 하나가 바로 FSx 처리량 한도입니다. 규모가 더 큰 훈련 클러스터로 전환할 때 확장 효율이 갑자기 저하되는 것을 발견한 경우, 처리량 한도가 더 높으면서 규모가 더 큰 FSx for Lustre 파일 시스템을 사용해 보세요. 자세한 내용은 *Amazon FSx for Lustre 사용 설명서*의 [파일 시스템 성능 집계](https://docs.aws.amazon.com/fsx/latest/LustreGuide/performance.html#fsx-aggregate-perf) 및 [스토리지 및 처리량 관리](https://docs.aws.amazon.com/fsx/latest/LustreGuide/managing-storage-capacity.html)를 참조하세요.

## PyTorch를 이용한 SageMaker AI 분산 훈련 작업을 통해 반환되는 사용 중단 경고
<a name="distributed-ts-data-parallel-deprecation-warnings"></a>

v1.4.0부터는 SageMaker AI 분산형 데이터 병렬화 라이브러리가 분산된 PyTorch의 백엔드로 작동합니다. PyTorch로 라이브러리를 사용하는 주요 변경 사항으로 인해 PyTorch 분산 패키지의 `smdistributed` API를 더 이상 사용할 수 없다는 경고 메시지가 나타날 수 있습니다. 이 경고 메시지의 내용은 다음과 유사합니다.

```
smdistributed.dataparallel.torch.dist is deprecated in the SageMaker AI distributed data parallel library v1.4.0+.
Please use torch.distributed and specify 'smddp' as a backend when initializing process group as follows:
torch.distributed.init_process_group(backend='smddp')
For more information, see the library's API documentation at
https://docs.aws.amazon.com/sagemaker/latest/dg/data-parallel-modify-sdp-pt.html
```

v1.4.0 이상에서는 라이브러리를 훈련 스크립트 상단에서 한 번만 가져와서 PyTorch 분산 초기화 중에 백엔드로 설정하면 됩니다. 백엔드 사양이 한 행만 있으면 PyTorch 훈련 스크립트를 변경 없이 유지하면서 PyTorch 분산 모듈을 직접 사용할 수 있습니다. 주요 변경 사항 및 PyTorch로 라이브러리를 사용하는 새로운 방법에 대해 알아보려면 [PyTorch 훈련 스크립트에서 SMDDP 라이브러리 사용](data-parallel-modify-sdp-pt.md)을(를) 참조하세요.

# SageMaker AI 데이터 병렬 처리 라이브러리 릴리스 정보
<a name="data-parallel-release-notes"></a>

SageMaker AI 분산형 데이터 병렬화(SMDDP) 라이브러리의 최신 업데이트를 추적하려면 다음 릴리스 정보를 참조하세요.

## SageMaker AI 분산형 데이터 병렬화 라이브러리 v2.5.0
<a name="data-parallel-release-notes-20241017"></a>

*날짜: 2024년 10월 17일*

**새로운 기능**
+ CUDA v12.1이 포함된 PyTorch v2.4.1에 대한 지원이 추가되었습니다.

**SageMaker AI 모델 병렬화(SMP) 라이브러리에서 배포한 Docker 컨테이너에 통합**

이 버전의 SMDDP 라이브러리는 [SageMaker 모델 병렬화 라이브러리 v2.6.0](model-parallel-release-notes.md#model-parallel-release-notes-20241017)으로 마이그레이션됩니다.

```
658645717510.dkr.ecr.<us-west-2>.amazonaws.com/smdistributed-modelparallel:2.4.1-gpu-py311-cu121
```

SMP Docker 이미지를 사용할 수 있는 리전은 [AWS 리전](distributed-model-parallel-support-v2.md#distributed-model-parallel-availablity-zone-v2) 섹션을 참조하세요.

**이 릴리스의 바이너리 파일**

다음 URL을 사용하여 라이브러리를 다운로드 또는 설치할 수 있습니다.

```
https://smdataparallel.s3.amazonaws.com/binary/pytorch/2.4.1/cu121/2024-10-09/smdistributed_dataparallel-2.5.0-cp311-cp311-linux_x86_64.whl
```

## SageMaker AI 분산형 데이터 병렬화 라이브러리 v2.3.0
<a name="data-parallel-release-notes-20240611"></a>

*날짜: 2024년 6월 11일*

**새로운 기능**
+ CUDA v12.1 및 Python v3.11을 사용하는 PyTorch v2.3.0에 대한 지원이 추가되었습니다.
+ PyTorch Lightning v2.2.5에 대한 지원이 추가됨 이는 PyTorch v2.3.0용 SageMaker AI 프레임워크 컨테이너에 통합됩니다.
+ 지원되지 않는 인스턴스 유형에 SMDDP 라이브러리를 로드하지 않도록 가져오기 중에 인스턴스 유형 검증이 추가되었습니다. SMDDP 라이브러리와 호환되는 인스턴스 유형 목록은 [지원되는 프레임워크 AWS 리전및 인스턴스 유형](distributed-data-parallel-support.md) 섹션을 참조하세요.

**SageMaker AI 프레임워크 컨테이너에 통합**

이 버전의 SMDDP 라이브러리는 다음 [SageMaker AI 프레임워크 컨테이너](https://github.com/aws/deep-learning-containers/blob/master/available_images.md#sagemaker-framework-containers-sm-support-only)로 마이그레이션됩니다.
+ PyTorch v2.3.0

  ```
  763104351884.dkr.ecr.<region>.amazonaws.com/pytorch-training:2.3.0-gpu-py311-cu121-ubuntu20.04-sagemaker
  ```

SMDDP 라이브러리 및 사전 구축된 컨테이너의 전체 버전 목록은 [지원되는 프레임워크 AWS 리전및 인스턴스 유형](distributed-data-parallel-support.md) 섹션을 참조하세요.

**이 릴리스의 바이너리 파일**

다음 URL을 사용하여 라이브러리를 다운로드 또는 설치할 수 있습니다.

```
https://smdataparallel.s3.amazonaws.com/binary/pytorch/2.3.0/cu121/2024-05-23/smdistributed_dataparallel-2.3.0-cp311-cp311-linux_x86_64.whl
```

**기타 변경사항**
+ SMDDP 라이브러리 v2.2.0은 PyTorch v2.2.0용 SageMaker AI 프레임워크 컨테이너에 통합됩니다.

## SageMaker AI 분산형 데이터 병렬화 라이브러리 v2.2.0
<a name="data-parallel-release-notes-20240304"></a>

*날짜: 2024년 3월 4일*

**새로운 기능**
+ CUDA v12.1이 포함된 PyTorch v2.2.0에 대한 지원이 추가되었습니다.

**SageMaker AI 모델 병렬화(SMP) 라이브러리에서 배포한 Docker 컨테이너에 통합**

이 버전의 SMDDP 라이브러리는 [SageMaker 모델 병렬화 라이브러리 v2.2.0](model-parallel-release-notes.md#model-parallel-release-notes-20240307)으로 마이그레이션됩니다.

```
658645717510.dkr.ecr.<region>.amazonaws.com/smdistributed-modelparallel:2.2.0-gpu-py310-cu121
```

SMP Docker 이미지를 사용할 수 있는 리전은 [AWS 리전](distributed-model-parallel-support-v2.md#distributed-model-parallel-availablity-zone-v2) 섹션을 참조하세요.

**이 릴리스의 바이너리 파일**

다음 URL을 사용하여 라이브러리를 다운로드 또는 설치할 수 있습니다.

```
https://smdataparallel.s3.amazonaws.com/binary/pytorch/2.2.0/cu121/2024-03-04/smdistributed_dataparallel-2.2.0-cp310-cp310-linux_x86_64.whl
```

## SageMaker AI 분산형 데이터 병렬화 라이브러리 v2.1.0
<a name="data-parallel-release-notes-20240301"></a>

*날짜: 2024년 3월 1일*

**새로운 기능**
+ CUDA v12.1이 포함된 PyTorch v2.1.0에 대한 지원이 추가되었습니다.

**버그 수정**
+ [SMDDP v2.0.1](#data-parallel-release-notes-20231207)에서 CPU 메모리 누수 문제를 해결했습니다.

**SageMaker AI 프레임워크 컨테이너에 통합**

이 버전의 SMDDP 라이브러리는 벤치마크 테스트를 통과했으며 다음 [SageMaker AI 프레임워크 컨테이너](https://github.com/aws/deep-learning-containers/blob/master/available_images.md#sagemaker-framework-containers-sm-support-only)로 마이그레이션됩니다.
+ PyTorch v2.1.0

  ```
  763104351884.dkr.ecr.<region>.amazonaws.com/pytorch-training:2.1.0-gpu-py310-cu121-ubuntu20.04-sagemaker
  ```

**SageMaker AI 모델 병렬화(SMP) 라이브러리에서 배포한 Docker 컨테이너에 통합**

이 버전의 SMDDP 라이브러리는 [SageMaker 모델 병렬화 라이브러리 v2.1.0](model-parallel-release-notes.md#model-parallel-release-notes-20240206)으로 마이그레이션됩니다.

```
658645717510.dkr.ecr.<region>.amazonaws.com/smdistributed-modelparallel:2.1.2-gpu-py310-cu121
```

SMP Docker 이미지를 사용할 수 있는 리전은 [AWS 리전](distributed-model-parallel-support-v2.md#distributed-model-parallel-availablity-zone-v2) 섹션을 참조하세요.

**이 릴리스의 바이너리 파일**

다음 URL을 사용하여 라이브러리를 다운로드 또는 설치할 수 있습니다.

```
https://smdataparallel.s3.amazonaws.com/binary/pytorch/2.1.0/cu121/2024-02-04/smdistributed_dataparallel-2.1.0-cp310-cp310-linux_x86_64.whl
```

## SageMaker AI 분산형 데이터 병렬화 라이브러리 v2.0.1
<a name="data-parallel-release-notes-20231207"></a>

*날짜: 2023년 12월 7일*

**새로운 기능**
+  AWS 컴퓨팅 리소스 및 네트워크 인프라에 최적화된 `AllGather` 집합 작업의 새로운 SMDDP 구현을 추가했습니다. 자세한 내용은 [SMDDP `AllGather` 집합 작업](data-parallel-intro.md#data-parallel-allgather)를 참조하세요.
+ SMDDP `AllGather` 집합 작업은 PyTorch FSDP 및 DeepSpeed 와 호환됩니다. 자세한 내용은 [PyTorch 훈련 스크립트에서 SMDDP 라이브러리 사용](data-parallel-modify-sdp-pt.md)를 참조하세요.
+ PyTorch v2.0.1에 대한 지원이 추가됨

**알려진 문제**
+ `AllReduce` DDP 모드에서 SMDDP로 훈련하는 동안 점진적 CPU 메모리 증가로 인해 CPU 메모리 누수 문제가 발생합니다.

**SageMaker AI 프레임워크 컨테이너에 통합**

이 버전의 SMDDP 라이브러리는 벤치마크 테스트를 통과했으며 다음 [SageMaker AI 프레임워크 컨테이너](https://github.com/aws/deep-learning-containers/blob/master/available_images.md#sagemaker-framework-containers-sm-support-only)로 마이그레이션됩니다.
+ PyTorch v2.0.1

  ```
  763104351884.dkr.ecr.<region>.amazonaws.com/pytorch-training:2.0.1-gpu-py310-cu118-ubuntu20.04-sagemaker
  ```

**이 릴리스의 바이너리 파일**

다음 URL을 사용하여 라이브러리를 다운로드 또는 설치할 수 있습니다.

```
https://smdataparallel.s3.amazonaws.com/binary/pytorch/2.0.1/cu118/2023-12-07/smdistributed_dataparallel-2.0.2-cp310-cp310-linux_x86_64.whl
```

**기타 변경사항**
+ 이 릴리스부터 SMDDP 라이브러리에 대한 설명서는 이 *Amazon SageMaker AI 개발자 안내서*에서 모두 확인할 수 있습니다. *Amazon SageMaker AI 개발자 안내서*에 포함된 SMDDP v2에 대한 전체 개발자 안내서로 전환하면서 *SageMaker AI Python SDK 설명서*의 [SMDDP v1.x에 대한 추가 참조](https://sagemaker.readthedocs.io/en/stable/api/training/smd_data_parallel.html)에 대한 설명서는 더 이상 지원되지 않습니다. 그래도 SMP v1.x 설명서가 필요한 경우 [SageMaker Python SDK v2.212.0 설명서의 다음 설명서 스냅샷](https://sagemaker.readthedocs.io/en/v2.212.0/api/training/distributed.html#the-sagemaker-distributed-data-parallel-library)을 참조하세요.