Amazon SageMaker에서의 분산 훈련
SageMaker는 분산 훈련 라이브러리를 제공하고 딥 러닝 작업을 위해 컴퓨터 비전(CV) 및 자연어 처리(NLP)와 같은 다양한 분산 훈련 옵션을 지원합니다. SageMaker의 분산 훈련 라이브러리를 사용하면 확장성이 뛰어나고 비용 효율적인 사용자 지정 데이터를 병렬로 실행하고 병렬 딥 러닝 트레이닝 작업을 모델링할 수 있습니다. PyTorch DistributedDataParallel (DDP), torchrun
, MPI(mpirun
) 및 파라미터 서버와 같은 다양한 분산 훈련 프레임워크 및 패키지를 사용할 수도 있습니다. 다음 섹션에서는 기본 분산 훈련 개념에 대한 정보를 제공합니다. 지침과 예제는 설명서 전반에 걸쳐 SageMaker Python SDK를 사용하여 딥 러닝 작업을 위한 분산 훈련 옵션을 설정하는 방법에 중점을 둡니다.
작은 정보
기계 학습(ML) 훈련 및 처리 작업의 분산형 컴퓨팅에 대한 일반적인 모범 사례를 알아보려면 SageMaker 모범 사례를 사용한 분산 컴퓨팅을(를) 참조하세요.
분산 훈련 개념
SageMaker의 분산 훈련 라이브러리는 다음과 같은 분산 훈련 용어 및 기능을 사용합니다.
데이터세트 및 배치
-
훈련 데이터세트: 모델을 훈련시키는 데 사용하는 모든 데이터.
-
글로벌 배치 크기: 클러스터의 GPU로 보내기 위해 각 반복의 훈련 데이터세트에서 선택한 레코드 수입니다. 각 반복에서 그라데이션이 계산되는 레코드 수입니다. 데이터 병렬화를 사용하는 경우 총 모델 복제본 수에 복제본별 배치 크기
global batch size = (the number of model replicas) * (per-replica batch size)
을(를) 곱한 값과 같습니다. 기계 학습 문헌에서는 글로벌 배치 크기의 단일 배치를 미니 배치라고 하는 경우가 많습니다. -
복제본별 배치 크기: 데이터 병렬화를 사용하는 경우 각 모델 복제본으로 전송되는 레코드 수입니다. 각 모델 복제본은 이 배치로 정방향 및 역방향 전달을 수행하여 가중치 업데이트를 계산합니다. 결과 가중치 업데이트는 다음 복제본별 배치 세트가 처리되기 전에 모든 복제본에서 동기화(평균화) 됩니다.
-
마이크로 배치: 미니 배치의 서브셋입니다. 하이브리드 모델과 데이터 병렬화를 사용하는 경우 이는 복제본당 크기 배치의 서브셋입니다. SageMaker의 분산 모델 병렬화 라이브러리를 사용하면 각 마이크로 배치가 훈련 파이프라인에 하나씩 공급되며 라이브러리 런타임에 정의된 실행 일정을 따릅니다.
훈련
-
에포크: 전체 데이터세트에 대한 한 번의 훈련 주기. 한 에포크마다 여러 번 반복하는 것이 일반적입니다. 훈련에 사용하는 에포크 수는 모델 및 사용 사례에 따라 다릅니다.
-
반복: 훈련 데이터의 글로벌 배치 크기 배치(미니 배치)를 사용하여 수행한 단일 순방향 및 역방향 패스. 훈련 중에 수행되는 반복 횟수는 전체 배치 크기와 훈련에 사용된 에포크 수에 따라 결정됩니다. 예를 들어 데이터세트에 5,000개의 샘플이 포함되어 있고 글로벌 배치 크기를 500으로 사용하는 경우 단일 에포크를 완료하는 데 10번의 반복이 필요합니다.
-
학습률: 모델의 계산된 오차에 따라 가중치가 변경되는 정도에 영향을 미치는 변수입니다. 학습률은 수렴 속도 및 최적성뿐만 아니라 모델의 수렴 능력에도 중요한 역할을 합니다.
인스턴스 및 GPU
-
인스턴스: AWS 기계 학습 컴퓨팅 인스턴스
. 이를 노드라고도 합니다. -
클러스터 크기: SageMaker의 분산 훈련 라이브러리를 사용하는 경우 인스턴스 수에 각 인스턴스의 GPU 수를 곱한 값입니다. 예를 들어 훈련 작업에 각각 GPU가 4개인 ml.p3.8xlarge 인스턴스 2개를 사용하는 경우 클러스터 크기는 8입니다. 클러스터 크기를 늘리면 훈련 시간이 빨라질 수 있지만 인스턴스 간 통신을 최적화해야 합니다. 그렇지 않으면 노드 간 통신으로 인해 오버헤드가 추가되어 훈련 시간이 느려질 수 있습니다. SageMaker 분산 훈련 라이브러리는 Amazon EC2 ML 컴퓨팅 인스턴스 간의 통신을 최적화하여 디바이스 사용률을 높이고 훈련 시간을 단축하도록 설계되었습니다.
분산 훈련 솔루션
-
데이터 병렬화: 훈련 데이터세트를 다중 Amazon EC2 ML 인스턴스로 구성된 컴퓨팅 클러스터의 여러 GPU로 분할하는 분산 훈련의 전략입니다. 각 GPU는 모델의 복제본을 포함하고, 서로 다른 배치의 훈련 데이터를 수신하고, 순방향 및 역방향 패스를 수행하고, 동기화를 위해 다른 노드와 가중치 업데이트를 공유한 다음 배치와 궁극적으로 또 다른 에포크로 넘어갑니다.
-
모델 병렬화: 모델을 여러 Amazon EC2 ML 인스턴스로 구성된 컴퓨팅 클러스터의 여러 GPU로 분할하는 분산 훈련 전략입니다. 모델이 복잡하고 숨겨진 계층과 가중치가 많아 단일 인스턴스의 메모리에 다 담을 수 없을 수도 있습니다. 각 GPU는 모델의 서브셋을 포함하며, 이를 통해 데이터 흐름과 변환이 공유되고 컴파일됩니다. GPU 사용률 및 훈련 시간 측면에서 모델 병렬화의 효율성은 모델을 분할하는 방식과 정방향 및 역방향 전달을 수행하는 데 사용되는 실행 일정에 따라 크게 달라집니다.
-
파이프라인 실행 일정(파이프라이닝): 파이프라인 실행 일정에 따라 모델 훈련 중에 디바이스 간에 계산(마이크로 배치)이 수행되고 데이터가 처리되는 순서가 결정됩니다. 파이프라이닝은 GPU가 서로 다른 데이터 샘플에서 동시에 계산하도록 함으로써 모델 병렬화의 진정한 병렬화를 달성하고 순차 계산으로 인한 성능 손실을 극복하는 기법입니다. 자세한 내용은 파이프라인 실행 일정을 참조하세요.
고급 개념
기계 학습(ML) 실무자는 모델을 훈련할 때 일반적으로 모델 크기 조정과 훈련 데이터 확장이라는 두 가지 스케일링 문제에 직면합니다. 모델 크기와 복잡성으로 인해 정확도가 향상될 수 있지만 단일 CPU 또는 GPU에 맞출 수 있는 모델 크기에는 한계가 있습니다. 또한 모델 크기를 조정하면 계산 횟수가 늘어나고 훈련 시간이 길어질 수 있습니다.
훈련을 위해 모든 훈련 데이터를 메모리에 수집해야 하기 때문에 모든 모델이 훈련 데이터 스케일링을 똑같이 잘 처리하는 것은 아닙니다. 수직으로만 확장되며 점점 더 큰 인스턴스 유형으로 확장됩니다. 대부분의 경우 훈련 데이터를 확장하면 훈련 시간이 길어집니다.
딥 러닝(DL)은 여러 계층의 인공 신경망으로 구성된 특정 ML 알고리즘 패밀리입니다. 가장 일반적인 훈련 방법은 미니 배치 확률적 경사하강법(SGD)을 사용하는 것입니다. 미니 배치 SGD에서는 오차가 줄어드는 방향으로 계수를 조금씩 반복적으로 변경하여 모델을 훈련합니다. 이러한 반복은 훈련 데이터세트의 동일한 크기의 서브샘플인 미니 배치에서 수행됩니다. 각 미니 배치에 대해 미니 배치의 각 레코드에서 모델을 실행하고 오차를 측정하고 오차의 기울기를 추정합니다. 그런 다음 미니 배치의 모든 레코드에서 평균 기울기를 측정하고 각 모델 계수의 업데이트 방향을 제공합니다. 훈련 데이터세트을 한 번 완전히 통과하는 것을 에포크(epoch)라고 합니다. 모델 훈련은 일반적으로 수십~수백 개의 에포크로 구성됩니다. 미니 배치 SGD에는 여러 가지 이점이 있습니다. 첫째, 반복 설계로 인해 훈련 시간이 이론적으로 데이터세트 크기에 선형적으로 비례합니다. 둘째, 주어진 미니 배치에서 각 레코드는 최종 기울기 평균 이외의 레코드 간 통신 없이 모델에 의해 개별적으로 처리됩니다. 따라서 미니 배치 처리는 특히 병렬화 및 배포에 적합합니다.
미니 배치의 레코드를 여러 컴퓨팅 디바이스에 분산하여 SGD 훈련을 병렬화하는 것을 데이터 병렬 분산 훈련이라고 하며, 이것은 가장 일반적으로 사용되는 DL 분산 패러다임입니다. 데이터 병렬 훈련은 미니 배치 크기를 확장하고 각 미니 배치를 더 빠르게 처리하기 위한 적절한 분포 전략입니다. 하지만 데이터 병렬 훈련에는 모든 작업자에서 가져온 기울기로 미니 배치 기울기 평균을 계산하고 이를 모든 작업자에 전달해야 하는 추가적인 복잡성이 수반됩니다. allreduce라는 단계는 훈련 클러스터가 확장됨에 따라 증가하는 오버헤드를 의미할 수 있으며, 부적절한 하드웨어를 빼고 잘못 구현하거나 구현한 경우 훈련 시간에 막대한 불이익을 줄 수 있습니다.
데이터 병렬적 SGD를 사용하려면 여전히 개발자가 최소한 모델과 단일 레코드를 단일 CPU 또는 GPU와 같은 컴퓨팅 디바이스에 맞출 수 있어야 합니다. 자연어 처리(NLP)의 대형 변환기와 같은 대형 모델을 훈련시키거나 고해상도 이미지를 대상으로 분할 모델을 훈련시키는 경우 이것이 불가능한 상황이 발생할 수 있습니다. 워크로드를 분할하는 또 다른 방법은 모델을 여러 컴퓨팅 디바이스로 분할하는 것인데, 이를 모델 병렬 분산 훈련이라고 합니다.