쿠키 기본 설정 선택

당사는 사이트와 서비스를 제공하는 데 필요한 필수 쿠키 및 유사한 도구를 사용합니다. 고객이 사이트를 어떻게 사용하는지 파악하고 개선할 수 있도록 성능 쿠키를 사용해 익명의 통계를 수집합니다. 필수 쿠키는 비활성화할 수 없지만 '사용자 지정' 또는 ‘거부’를 클릭하여 성능 쿠키를 거부할 수 있습니다.

사용자가 동의하는 경우 AWS와 승인된 제3자도 쿠키를 사용하여 유용한 사이트 기능을 제공하고, 사용자의 기본 설정을 기억하고, 관련 광고를 비롯한 관련 콘텐츠를 표시합니다. 필수가 아닌 모든 쿠키를 수락하거나 거부하려면 ‘수락’ 또는 ‘거부’를 클릭하세요. 더 자세한 내용을 선택하려면 ‘사용자 정의’를 클릭하세요.

샤딩된 데이터 병렬 처리

포커스 모드
샤딩된 데이터 병렬 처리 - Amazon SageMaker AI

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

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

샤딩된 데이터 병렬 처리는 모델 상태(모델 파라미터, 그라데이션 및 옵티마이저 상태)를 데이터 병렬 그룹GPUs으로 분할하는 메모리 절약형 분산 훈련 기법입니다.

참고

샤딩된 데이터 병렬 처리는 SageMaker 모델 병렬 처리 라이브러리 v1.11.0 이상 PyTorch 에서에 사용할 수 있습니다.

훈련 작업을 대규모 GPU 클러스터로 확장할 때 여러에 걸쳐 모델의 훈련 상태를 샤딩하여 모델의 메모리당GPU 공간을 줄일 수 있습니다GPUs. 이렇게 하면 두 가지 이점이 있습니다. 즉, 표준 데이터 병렬 처리로 메모리가 부족하거나 여유 GPU 메모리를 사용하여 배치 크기를 늘릴 수 있는 더 큰 모델을 맞출 수 있습니다.

표준 데이터 병렬 처리 기법은 데이터 병렬 그룹의 GPUs에서 훈련 상태를 복제하고 AllReduce 작업을 기반으로 그라데이션 집계를 수행합니다. 샤딩된 데이터 병렬 처리는 옵티마이저 상태의 샤딩 특성을 고려하여 표준 데이터 병렬 분산 훈련 절차를 수정합니다. 모델과 옵티마이저 상태가 샤딩되는 순위 그룹을 샤딩 그룹이라고 합니다. 샤딩된 데이터 병렬 처리 기법은 샤딩 그룹의에서 모델의 훈련 가능한 파라미터와 해당 그라데이션 및 옵티마이저 상태를 샤딩GPUs합니다.

SageMaker AI는 MiCS 구현을 통해 샤딩된 데이터 병렬화를 달성합니다. MiCS 구현은에 대한 거대 모델 훈련의 거의 선형적 조정 AWS AWS 블로그 게시물에서 설명합니다. 이 구현에서는 샤딩 정도를 구성 가능한 파라미터로 설정할 수 있으며 이 파라미터는 데이터 병렬도보다 작아야 합니다. 각 순방향 및 역방향 패스 동안 MiCS는 AllGather 작업을 GPUs 통해 모든에서 모델 파라미터를 일시적으로 재결합합니다. 각 계층의 순방향 또는 역방향 패스 후 MiCS는 파라미터를 다시 샤딩하여 GPU 메모리를 저장합니다. 이전 패스 중에 MiCS는 그라데이션을 줄이고 동시에 ReduceScatter 작업을 GPUs 통해 샤딩합니다. 마지막으로 MiCS는 옵티마이저 상태의 로컬 샤드를 사용하여 축소 및 샤딩된 로컬 그라디언트를 해당 로컬 파라미터 샤드에 적용합니다. 통신 오버헤드를 줄이기 위해 SageMaker 모델 병렬 처리 라이브러리는 앞으로 또는 뒤로 패스에서 예정된 계층을 미리 가져오고 네트워크 통신을 계산과 중첩합니다.

모델의 훈련 상태는 샤딩 그룹 전체에 복제됩니다. 즉, 파라미터에 그라디언트를 적용하기 전에 샤딩 그룹 내에서 수행되는 ReduceScatter 작업 외에도 샤딩 그룹 전체에서 AllReduce 작업이 수행되어야 합니다.

실제로 샤딩된 데이터 병렬 처리는 통신 오버헤드와 GPU 메모리 효율성 간의 균형을 가져옵니다. 샤딩된 데이터 병렬 처리를 사용하면 통신 비용이 증가하지만에 따른 메모리 공간GPU(활성화로 인한 메모리 사용량 제외)은 샤딩된 데이터 병렬 처리 수준으로 나뉘어 더 큰 모델을 GPU 클러스터에 맞출 수 있습니다.

샤딩된 데이터 병렬도 선택

분할된 데이터 병렬도 값을 선택할 때는 값이 데이터 병렬도를 균등하게 나누어야 합니다. 예를 들어 8방향 데이터 병렬 처리 작업의 경우 샤딩된 데이터 병렬도 등급으로 2, 4 또는 8을 선택합니다. 샤딩된 데이터 병렬도를 선택할 때는 적은 수로 시작하여 모델이 메모리 및 배치 크기에 맞을 때까지 점진적으로 늘리는 것이 좋습니다.

배치 크기 선택

샤딩된 데이터 병렬 처리를 설정한 후 GPU 클러스터에서 성공적으로 실행할 수 있는 최적의 훈련 구성을 찾아야 합니다. 대규모 언어 모델(LLM)을 훈련하는 경우 배치 크기 1부터 시작하여 (OOM) 오류를 수신할 지점에 도달할 때까지 점차 늘리십시오 out-of-memory. 배치 크기가 가장 작더라도 OOM 오류가 발생하면 더 높은 수준의 샤딩된 데이터 병렬 처리 또는 샤딩된 데이터 병렬 처리와 텐서 병렬 처리의 조합을 적용합니다.

샤딩된 데이터 병렬 처리를 훈련 작업에 적용하는 방법

샤딩된 데이터 병렬 처리를 시작하려면 훈련 스크립트에 필요한 수정 사항을 적용하고 sharded-data-parallelism-specific 파라미터로 SageMaker PyTorch 예측기를 설정합니다. 참조 값 및 예제 노트북을 시작점으로 사용하는 것도 고려해 봅니다.

PyTorch 훈련 스크립트 조정

1단계: PyTorch 훈련 스크립트 수정의 지침에 따라 모델 및 옵티마이저 객체를 torch.nn.paralleltorch.distributed 모듈의 smdistributed.modelparallel.torch 래퍼로 래핑합니다.

(선택 사항)외부 모델 파라미터를 등록하기 위한 추가 수정

모델이 로 빌드torch.nn.Module되고 모듈 클래스 내에 정의되지 않은 파라미터를 사용하는 경우에서 수동으로에 등록SMP하여에서 전체 파라미터를 수집해야 합니다. 파라미터를 모듈에 등록하려면 smp.register_parameter(module, parameter)를 사용합니다.

class Module(torch.nn.Module): def __init__(self, *args): super().__init__(self, *args) self.layer1 = Layer1() self.layer2 = Layer2() smp.register_parameter(self, self.layer1.weight) def forward(self, input): x = self.layer1(input) # self.layer1.weight is required by self.layer2.forward y = self.layer2(x, self.layer1.weight) return y

SageMaker PyTorch 예측기 설정

에서 SageMaker PyTorch 예측기를 구성할 때 샤딩된 데이터 병렬 처리를 위한 파라미터를 2단계: Python을 사용하여 SageMaker 훈련 작업 시작 SDK추가합니다.

샤딩된 데이터 병렬 처리를 켜려면 sharded_data_parallel_degree 파라미터를 예측기에 추가합니다 SageMaker PyTorch. 이 파라미터는 훈련 상태가 샤딩GPUs되는 수를 지정합니다. sharded_data_parallel_degree 값은 1과 데이터 병렬도 사이의 정수여야 하며 데이터 병렬도를 균등하게 나누어야 합니다. 라이브러리는의 수를 자동으로 감지GPUs하므로 데이터 병렬도를 감지합니다. 샤딩된 데이터 병렬 처리를 구성하는 데 다음과 같은 추가 파라미터를 사용할 수 있습니다.

  • "sdp_reduce_bucket_size" (int, 기본값: 5e8) - PyTorch DDP그라데이션 버킷의 크기를 기본 dtype의 요소 수로 지정합니다.

  • "sdp_param_persistence_threshold" (int, 기본값: 1e6) - 파라미터 텐서의 크기를 각에서 지속될 수 있는 요소 수로 지정합니다GPU. 샤딩된 데이터 병렬 처리는 각 파라미터 GPUs 텐서를 데이터 병렬 그룹 간에 분할합니다. 파라미터 텐서의 요소 수가이 임계값보다 작으면 파라미터 텐서는 분할되지 않습니다. 이렇게 하면 파라미터 텐서가 데이터 병렬 간에 복제되므로 통신 오버헤드를 줄일 수 있습니다GPUs.

  • "sdp_max_live_parameters" (int, default: 1e9) – 순방향 및 역방향 패스 중 동시에 재조합된 훈련 상태에 있을 수 있는 최대 파라미터 수를 지정합니다. 활성 파라미터 수가 지정된 임계값에 도달하면 AllGather 작업을 통한 파라미터 가져오기가 일시 중지됩니다. 이 파라미터를 늘리면 메모리 사용량이 늘어납니다.

  • "sdp_hierarchical_allgather" (bool, default: True)True로 설정하면 AllGather 작업이 계층적으로 실행됩니다. 즉, 먼저 각 노드 내에서 실행된 후 여러 노드에서 실행됩니다. 여러 노드 분산 훈련 작업의 경우 계층적 AllGather 작업이 자동으로 활성화됩니다.

  • "sdp_gradient_clipping" (float, default: 1.0) – 모델 파라미터를 통해 그라디언트를 역방향으로 전파하기 전에 그라디언트의 L2 규범을 클리핑하기 위한 그라디언트 임곗값을 지정합니다. 샤딩된 데이터 병렬 처리가 활성화되면 그라디언트 클리핑도 활성화됩니다. 기본 임곗값은 1.0입니다. 폭발적인 그라디언트 문제가 발생할 경우 이 파라미터를 조정합니다.

다음 코드는 샤딩된 데이터 병렬 처리를 구성하는 방법의 예를 보여줍니다.

import sagemaker from sagemaker.pytorch import PyTorch smp_options = { "enabled": True, "parameters": { # "pipeline_parallel_degree": 1, # Optional, default is 1 # "tensor_parallel_degree": 1, # Optional, default is 1 "ddp": True, # parameters for sharded data parallelism "sharded_data_parallel_degree": 2, # Add this to activate sharded data parallelism "sdp_reduce_bucket_size": int(5e8), # Optional "sdp_param_persistence_threshold": int(1e6), # Optional "sdp_max_live_parameters": int(1e9), # Optional "sdp_hierarchical_allgather": True, # Optional "sdp_gradient_clipping": 1.0 # Optional } } mpi_options = { "enabled" : True, # Required "processes_per_host" : 8 # Required } smp_estimator = PyTorch( entry_point="your_training_script.py", # Specify your train script role=sagemaker.get_execution_role(), instance_count=1, instance_type='ml.p3.16xlarge', framework_version='1.13.1', py_version='py3', distribution={ "smdistributed": {"modelparallel": smp_options}, "mpi": mpi_options }, base_job_name="sharded-data-parallel-job" ) smp_estimator.fit('s3://my_bucket/my_training_data/')

참조 구성

SageMaker 분산 훈련 팀은 시작점으로 사용할 수 있는 다음과 같은 참조 구성을 제공합니다. 다음 구성에서 외삽하여 모델 구성의 GPU 메모리 사용량을 실험하고 추정할 수 있습니다.

SMDDP Collectives를 사용한 샤딩된 데이터 병렬 처리

모델/파라미터 수 Num 인스턴스 인스턴스 유형 시퀀스 길이 글로벌 배치 크기 미니 배치 크기 샤딩된 데이터 병렬도
GPT-NEOX-20B 2 ml.p4d.24xlarge 2048 64 4 16
GPT-NEOX-20B 8 ml.p4d.24xlarge 2048 768 12 32

예를 들어, 200억 파라미터 모델의 시퀀스 길이를 늘이거나 모델 크기를 650억 파라미터로 늘리려면 먼저 배치 크기를 줄여야 합니다. 모델이 여전히 가장 작은 배치 크기(배치 크기 1)에 맞지 않으면 모델 병렬도를 높여 봅니다.

텐서 병렬 처리 및 NCCL Collective를 사용한 샤딩된 데이터 병렬 처리

모델/파라미터 수 Num 인스턴스 인스턴스 유형 시퀀스 길이 글로벌 배치 크기 미니 배치 크기 샤딩된 데이터 병렬도 텐서 병렬도 활성화 오프로딩
GPT-NEOX-65B 64 ml.p4d.24xlarge 2048 512 8 16 8 Y
GPT-NEOX-65B 64 ml.p4d.24xlarge 4096 512 2 64 2 Y

샤딩된 데이터 병렬 처리와 텐서 병렬 처리를 결합하면 시퀀스 길이가 더 긴 텍스트 데이터를 사용하면서 대규모 언어 모델(LLM)을 대규모 클러스터에 맞추려는 경우 배치 크기가 더 작아지고 결과적으로 GPU 메모리 사용량을 처리하여 더 긴 텍스트 시퀀스에 LLMs 대해 훈련할 수 있습니다. 자세한 내용은 텐서 병렬 처리를 사용한 샤딩된 데이터 병렬 처리을 참조하십시오.

사례 연구, 벤치마크 및 기타 구성 예제는 블로그 게시물 Amazon SageMaker AI 모델 병렬 라이브러리의 새로운 성능 개선 사항을 참조하세요.

SMDDP Collectives를 사용한 샤딩된 데이터 병렬 처리

SageMaker 데이터 병렬 처리 라이브러리는 AWS 인프라에 최적화된 집합 통신 프리미티브(SMDDP 집합체)를 제공합니다. Elastic Fabric Adapter(EFA)를 all-to-all-type 사용하여 통신 패턴을 채택하여 처리량이 높고 지연 시간에 민감한 집합체를 줄이고, 통신 관련 처리를 로 오프로드하고CPU, 계산을 위한 GPU 주기를 확보하여 최적화합니다. 대규모 클러스터에서 SMDDP Collectives는에 비해 분산 훈련 성능을 최대 40% 개선할 수 있습니다NCCL. 사례 연구 및 벤치마크 결과는 Amazon SageMaker AI 모델 병렬 처리 라이브러리의 새로운 성능 개선 블로그를 참조하세요.

참고

SMDDP Collectives를 사용한 샤딩된 데이터 병렬 처리는 SageMaker 모델 병렬 처리 라이브러리 v1.13.0 이상과 SageMaker 데이터 병렬 처리 라이브러리 v1.6.0 이상에서 사용할 수 있습니다. SMDDP Collectives와 함께 샤딩된 데이터 병렬 처리를 Supported configurations 사용하려면를 참조하세요.

대규모 분산 훈련에서 일반적으로 사용되는 기법인 샤딩된 데이터 병렬 처리에서는 AllGather 집합체가 계산과 함께 순방향 및 역방향 패스 계산을 위해 샤딩된 계층 파라미터를 재구성하는 데 사용됩니다GPU. 대규모 모델의 경우 GPU 병목 현상을 방지하고 훈련 속도를 늦추려면 AllGather 작업을 효율적으로 수행하는 것이 중요합니다. 샤딩된 데이터 병렬 처리가 활성화되면 SMDDP Collectives는 이러한 성능에 중요한 AllGather 집합체로 이동하여 훈련 처리량을 개선합니다.

SMDDP Collectives로 훈련

훈련 작업에 샤딩된 데이터 병렬 처리가 활성화되어 있고를 충족하면 Supported configurations SMDDP Collectives가 자동으로 활성화됩니다. 내부적으로 SMDDP Collectives는 AWS 인프라에서 성능을 발휘하도록 AllGather 집합체를 최적화하고 다른 모든 집합체에 NCCL 대해 로 돌아갑니다. 또한 지원되지 않는 구성에서는를 포함한 모든 집합체가 NCCL 백엔드를 AllGather자동으로 사용합니다.

SageMaker 모델 병렬 처리 라이브러리 버전 1.13.0부터 "ddp_dist_backend" 파라미터가 modelparallel 옵션에 추가됩니다. 이 구성 파라미터의 기본값은 이며"auto", 가능하면 SMDDP Collectives를 사용하고 그렇지 NCCL 않으면 로 돌아갑니다. 라이브러리가 항상를 사용하도록 강제하려면 "ddp_dist_backend" 구성 파라미터에 "nccl"를 NCCL지정합니다.

다음 코드 예제에서는 "ddp_dist_backend" 파라미터와 함께 샤딩된 데이터 병렬 처리를 사용하여 예측기를 설정하는 방법을 보여줍니다.이 파라미터는 "auto" 기본적으로 PyTorch 로 설정되어 있으므로 추가할 수 있습니다.

import sagemaker from sagemaker.pytorch import PyTorch smp_options = { "enabled":True, "parameters": { "partitions": 1, "ddp": True, "sharded_data_parallel_degree": 64 "bf16": True, "ddp_dist_backend": "auto" # Specify "nccl" to force to use NCCL. } } mpi_options = { "enabled" : True, # Required "processes_per_host" : 8 # Required } smd_mp_estimator = PyTorch( entry_point="your_training_script.py", # Specify your train script source_dir="location_to_your_script", role=sagemaker.get_execution_role(), instance_count=8, instance_type='ml.p4d.24xlarge', framework_version='1.13.1', py_version='py3', distribution={ "smdistributed": {"modelparallel": smp_options}, "mpi": mpi_options }, base_job_name="sharded-data-parallel-demo", ) smd_mp_estimator.fit('s3://my_bucket/my_training_data/')

지원되는 구성

SMDDP Collectives를 사용한 AllGather 작업은 다음 구성 요구 사항이 모두 충족되면 훈련 작업에서 활성화됩니다.

  • 샤딩된 데이터 병렬도가 1보다 큼

  • Instance_count가 1보다 큼

  • Instance_typeml.p4d.24xlarge와 같음

  • SageMaker PyTorch v1.12.1 이상용 훈련 컨테이너

  • SageMaker 데이터 병렬 처리 라이브러리 v1.6.0 이상

  • SageMaker 모델 병렬 처리 라이브러리 v1.13.0 이상

성능 및 메모리 조정

SMDDP 집합체는 추가 GPU 메모리를 사용합니다. 모델 훈련 사용 사례에 따라 GPU 메모리 사용량을 구성하는 두 가지 환경 변수가 있습니다.

  • SMDDP_AG_SCRATCH_BUFFER_SIZE_BYTES - SMDDP AllGather 작업 중에 AllGather 입력 버퍼는 노드 간 통신을 위해 임시 버퍼로 복사됩니다. SMDDP_AG_SCRATCH_BUFFER_SIZE_BYTES 변수는 이 임시 버퍼의 크기(바이트)를 제어합니다. 임시 버퍼의 크기가 AllGather 입력 버퍼 크기보다 작으면 AllGather 집합체는 다시를 사용합니다NCCL.

    • 기본값: 16 * 1024 * 1024(16MB)

    • 허용되는 값: 8192의 모든 배수

  • SMDDP_AG_SORT_BUFFER_SIZE_BYTESSMDDP_AG_SORT_BUFFER_SIZE_BYTES 변수는 노드 간 통신에서 수집한 데이터를 보관할 임시 버퍼의 크기(바이트)입니다. 이 임시 버퍼의 크기가 보다 작으면 AllGather 집합1/8 * sharded_data_parallel_degree * AllGather input size체는 다시를 사용합니다NCCL.

    • 기본값: 128 * 1024 * 1024(128MB)

    • 허용되는 값: 8192의 모든 배수

버퍼 크기 변수의 조정 지침

환경 변수의 기본값은 대부분의 사용 사례에서 잘 작동합니다. 훈련이 out-of-memory (OOM) 오류로 실행되는 경우에만 이러한 변수를 튜닝하는 것이 좋습니다.

다음 목록에서는 SMDDP Collectives의 GPU 메모리 풋프린트를 줄이는 동시에 성능 향상을 유지하기 위한 몇 가지 튜닝 팁에 대해 설명합니다.

  • SMDDP_AG_SCRATCH_BUFFER_SIZE_BYTES 튜닝

    • 모델이 작을수록 AllGather 입력 버퍼 크기도 작습니다. 따라서 파라미터가 적은 모델의 경우 필요한 SMDDP_AG_SCRATCH_BUFFER_SIZE_BYTES 크기가 더 작을 수 있습니다.

    • 모델이 더 많은에서 샤딩되기 때문에 AllGather 입력 버퍼 크기가 sharded_data_parallel_degree 증가함에 따라 감소합니다GPUs. 따라서 sharded_data_parallel_degree 값이 큰 훈련 작업의 경우 SMDDP_AG_SCRATCH_BUFFER_SIZE_BYTES의 필수 크기가 작아도 됩니다.

  • SMDDP_AG_SORT_BUFFER_SIZE_BYTES 튜닝

    • 파라미터가 적은 모델의 경우 노드 간 통신에서 수집되는 데이터 양이 더 적습니다. 따라서 파라미터 수가 적은 모델의 경우 필요한 SMDDP_AG_SORT_BUFFER_SIZE_BYTES 크기가 더 작을 수 있습니다.

일부 집합체는를 사용하기 위해 돌아갈 수 NCCL있으므로 최적화된 SMDDP 집합체에서 성능 향상을 얻지 못할 수 있습니다. 추가 GPU 메모리를 사용할 수 있는 경우 및 값을 늘려 성능 향상의 SMDDP_AG_SCRATCH_BUFFER_SIZE_BYTES SMDDP_AG_SORT_BUFFER_SIZE_BYTES 이점을 얻을 수 있습니다.

다음 코드는 PyTorch 예측기의 배포 파라미터mpi_options에서 환경 변수를에 추가하여 환경 변수를 구성하는 방법을 보여줍니다.

import sagemaker from sagemaker.pytorch import PyTorch smp_options = { .... # All modelparallel configuration options go here } mpi_options = { "enabled" : True, # Required "processes_per_host" : 8 # Required } # Use the following two lines to tune values of the environment variables for buffer mpioptions += " -x SMDDP_AG_SCRATCH_BUFFER_SIZE_BYTES=8192" mpioptions += " -x SMDDP_AG_SORT_BUFFER_SIZE_BYTES=8192" smd_mp_estimator = PyTorch( entry_point="your_training_script.py", # Specify your train script source_dir="location_to_your_script", role=sagemaker.get_execution_role(), instance_count=8, instance_type='ml.p4d.24xlarge', framework_version='1.13.1', py_version='py3', distribution={ "smdistributed": {"modelparallel": smp_options}, "mpi": mpi_options }, base_job_name="sharded-data-parallel-demo-with-tuning", ) smd_mp_estimator.fit('s3://my_bucket/my_training_data/')

샤딩된 데이터 병렬 처리를 사용한 혼합 정밀도 훈련

절반 정밀도 부동 소수점 번호와 샤딩된 데이터 병렬 처리로 GPU 메모리를 추가로 저장하려면 분산 훈련 구성에 하나의 추가 파라미터를 추가하여 16비트 부동 소수점 형식(FP16) 또는 뇌 부동 소수점 형식(BF16)을 활성화할 수 있습니다.

참고

샤딩된 데이터 병렬 처리를 사용한 혼합 정밀도 훈련은 SageMaker 모델 병렬 처리 라이브러리 v1.11.0 이상에서 사용할 수 있습니다.

샤딩된 데이터 병렬 처리를 사용한 FP16 훈련용

샤딩된 데이터 병렬 처리로 FP16 훈련"fp16": True"을 실행하려면 smp_options 구성 사전에를 추가합니다. 훈련 스크립트에서 smp.DistributedOptimizer 모듈을 통해 정적 손실 스케일링 옵션과 동적 손실 스케일링 옵션 중 선택할 수 있습니다. 자세한 내용은 FP16 모델 병렬 처리를 사용한 훈련 단원을 참조하십시오.

smp_options = { "enabled": True, "parameters": { "ddp": True, "sharded_data_parallel_degree": 2, "fp16": True } }

샤딩된 데이터 병렬 처리를 사용한 BF16 훈련용

SageMaker AI의 샤딩된 데이터 병렬 처리 기능은 BF16 데이터 형식 훈련을 지원합니다. BF16 데이터 형식은 8비트를 사용하여 부동 소수점 수의 지수를 나타내는 반면, FP16 데이터 형식은 5비트를 사용합니다. 지수에 대해 8비트를 보존하면가 32비트 단일 정밀도 부동 소수점(FP32) 수의 지수를 동일하게 표현할 수 있습니다. 이렇게 하면 FP32와 간의 변환이 더 BF16 간단하고 훨씬 덜 발생하기 때문에 특히 더 큰 모델을 FP16 훈련할 때 훈련 중에 자주 발생하는 오버플로우 및 언더플로우 문제가 발생합니다. 두 데이터 유형 모두 총 16비트를 사용하지만 BF16 형식의 지수에 대한 표현 범위가 증가하면 정밀도가 저하됩니다. 대형 모델을 훈련시키는 경우 이러한 정밀도 감소는 범위와 훈련 안정성의 적절한 절충안으로 고려됩니다.

참고

현재 BF16 훈련은 샤딩된 데이터 병렬 처리가 활성화된 경우에만 작동합니다.

샤딩된 데이터 병렬 처리로 BF16 훈련"bf16": True을 실행하려면 smp_options 구성 사전에를 추가합니다.

smp_options = { "enabled": True, "parameters": { "ddp": True, "sharded_data_parallel_degree": 2, "bf16": True } }

텐서 병렬 처리를 사용한 샤딩된 데이터 병렬 처리

샤딩된 데이터 병렬 처리를 사용하고 글로벌 배치 크기도 줄여야 하는 경우 샤딩된 데이터 병렬 처리와 함께 텐서 병렬 처리를 사용하는 것을 고려해 보세요. 매우 큰 컴퓨팅 클러스터(일반적으로 노드 128개 이상)에서 샤딩된 데이터 병렬 처리로 대규모 모델을 훈련GPU할 때 개당 배치 크기가 작더라도 글로벌 배치 크기가 매우 커집니다. 이로 인해 컨버전스 문제나 낮은 컴퓨팅 성능 문제가 발생할 수 있습니다. 단일 배치가 이미 크고 더 이상 축소할 수 없는 경우 샤딩된 데이터 병렬 처리만으로는 배치 크기를 줄일 수 없는 GPU 경우가 있습니다. 이러한 경우 샤딩된 데이터 병렬 처리를 텐서 병렬 처리와 함께 사용하면 글로벌 배치 크기를 줄이는 데 도움이 됩니다.

최적의 샤딩된 데이터 병렬도와 텐서 병렬도를 선택하는 것은 모델의 규모, 인스턴스 유형, 모델이 수렴하기에 적합한 글로벌 배치 크기에 따라 달라집니다. CUDA out-of-memory 오류를 해결하고 최상의 성능을 얻으려면 글로벌 배치 크기를 컴퓨팅 클러스터에 맞추기 위해 낮은 텐서 병렬 정도부터 시작하는 것이 좋습니다. 텐서 병렬 처리와 샤딩된 데이터 병렬 처리의 조합이 모델 병렬 처리를 GPUs 위해 그룹화하여 글로벌 배치 크기를 조정하는 데 어떻게 도움이 되는지 알아보려면 다음 두 가지 예제 사례를 참조하세요.

참고

이 기능은 SageMaker 모델 병렬 처리 라이브러리 v1.15에서 사용할 수 있으며 PyTorch v1.13.1을 지원합니다.

참고

이 기능은 라이브러리의 텐서 병렬 처리 기능을 통해 지원되는 모델에 사용할 수 있습니다. 지원 모델 목록은 Hugging Face Transformer 모델 지원을 참조하세요. 또한 훈련 스크립트를 수정할 때는 tensor_parallelism=Truesmp.model_creation 인수에 전달해야 합니다. 자세한 내용은 SageMaker AI 예제 GitHub 리포지토리의 훈련 스크립트train_gpt_simple.py를 참조하세요.

예시 1

1536개의 클러스터GPUs(각각 8개의 노드가 있는 192개의 노드)GPUs를 통해 모델을 훈련하고 샤딩된 데이터 병렬 처리 정도를 32(sharded_data_parallel_degree=32)로 설정하고 배치 크기를 1GPU로 설정한다고 가정해 보겠습니다. 여기서 각 배치의 시퀀스 길이는 토큰 4,096개입니다. 이 경우 모델 복제본은 1536개이고 글로벌 배치 크기는 1536이 되며 각 글로벌 배치에는 약 600만 개의 토큰이 포함됩니다.

(1536 GPUs) * (1 batch per GPU) = (1536 global batches) (1536 batches) * (4096 tokens per batch) = (6,291,456 tokens)

여기에 텐서 병렬 처리를 추가하면 글로벌 배치 크기를 줄일 수 있습니다. 한 가지 구성 예제는 텐서 병렬도를 8로 설정하고 배치 크기를에서 4GPU로 설정하는 것입니다. 이는 192개의 텐서 병렬 그룹 또는 192개의 모델 복제본을 형성하며, 여기서 각 모델 복제본은 8개에 분산됩니다GPUs. 배치 크기 4는 반복당 및 텐서 병렬 그룹당 훈련 데이터의 양입니다. 즉, 각 모델 복제본은 반복당 4개의 배치를 소비합니다. 이 경우 글로벌 배치 크기는 768이 되고 각 글로벌 배치에는 약 300만 개의 토큰이 포함됩니다. 따라서 샤딩된 데이터 병렬 처리만 사용하는 이전 사례에 비해 글로벌 배치 크기가 절반으로 줄어듭니다.

(1536 GPUs) / (8 tensor parallel degree) = (192 tensor parallelism groups) (192 tensor parallelism groups) * (4 batches per tensor parallelism group) = (768 global batches) (768 batches) * (4096 tokens per batch) = (3,145,728 tokens)

예시 2

샤딩된 데이터 병렬 처리와 텐서 병렬 처리가 모두 활성화되면 라이브러리는 먼저 텐서 병렬 처리를 적용하고 이 차원에 모델을 샤딩합니다. 각 텐서 병렬 랭크의 경우 데이터 병렬 처리가 sharded_data_parallel_degree에 따라 적용됩니다.

예를 들어, 텐서 병렬 각도 GPUs 4(4의 그룹 형성GPUs), 샤딩된 데이터 병렬 각도 4로 32를 설정하여 복제 정도 2로 끝나고 싶다고 가정해 보겠습니다. 할당은 텐서 병렬도를 기반으로 다음과 같이 (0,1,2,3), , (4,5,6,7), , (8,9,10,11), (12,13,14,15)(16,17,18,19), (20,21,22,23), (24,25,26,27), 8개의 GPU 그룹을 생성합니다(28,29,30,31). 즉, 4는 하나의 텐서 병렬 그룹을 GPUs 형성합니다. 이 경우 텐서 병렬 그룹의 0순위GPUs에 대해 감소된 데이터 병렬 그룹은 입니다(0,4,8,12,16,20,24,28). 축소된 데이터 병렬 그룹은 샤딩된 데이터 병렬 수준 4를 기반으로 샤딩되어 데이터 병렬화를 위한 복제 그룹 2개를 생성합니다.는 하나의 샤딩 그룹을 GPUs (0,4,8,12) 형성하며,이 그룹은 0번째 텐서 병렬 순위에 대한 모든 파라미터의 전체 사본을 집합적으로 보관하고 다른 이러한 그룹을 GPUs (16,20,24,28) 형성합니다. 다른 텐서 병렬 랭크에도 유사한 샤딩 및 복제 그룹이 있습니다.

그림 1: Tensor 병렬 처리 그룹.

그림 1: (노드, 샤딩된 데이터 병렬도, 텐서 병렬도) = (4, 4, 4)에 대한 Tensor 병렬화 그룹. 여기서 각 사각형은 인덱스GPU가 0~31인를 나타냅니다. 텐서 병렬 처리를에서 로 그룹화TPG0하는 GPUs 형식입니다TPG7. 복제 그룹은 ({TPG0, TPG4}, {TPG1, TPG5}, {TPG2, TPG6} 및 {TPG3, TPG7})입니다. 각 복제 그룹 페어는 동일한 색상을 공유하지만 다르게 채워집니다.

그림 2: 샤딩된 데이터 병렬 처리 그룹.

그림 2: (노드, 샤딩된 데이터 병렬 정도, 텐서 병렬 정도) = (4, 4, 4)에 대한 샤딩된 데이터 병렬 처리 그룹. 여기서 각 사각형은 인덱스GPU가 0~31인를 나타냅니다. GPUs 형식은에서 SDPG0로 데이터 병렬 처리 그룹을 샤딩했습니다SDPG7. 복제 그룹은 ({SDPG0, SDPG4}, {SDPG1, SDPG5}, {SDPG2, SDPG6} 및 {SDPG3, SDPG7})입니다. 각 복제 그룹 페어는 동일한 색상을 공유하지만 다르게 채워집니다.

텐서 병렬 처리를 사용하여 샤딩된 데이터 병렬 처리를 활성화하는 방법

텐서 병렬 처리와 함께 샤딩된 데이터 병렬 처리를 사용하려면 추정기 클래스의 객체를 생성하는 distribution 동안에 대한 구성tensor_parallel_degree에서 sharded_data_parallel_degree 및를 SageMaker PyTorch 모두 설정해야 합니다.

또한 prescaled_batch를 활성화해야 합니다. 즉, 각 텐서 병렬 그룹은 자체 데이터 배치를 GPU 읽는 대신 선택한 배치 크기의 결합된 배치를 집합적으로 읽습니다. 사실상 데이터 세트를의 수와 동일한 부분GPUs(또는 데이터 병렬 크기, smp.dp_size())으로 나누는 대신의 수를 로 GPUs 나눈 부분tensor_parallel_degree(감소된 데이터 병렬 크기, 라고도 함)으로 나눕니다smp.rdp_size(). 사전 조정된 배치에 대한 자세한 내용은 SageMaker Python SDK 설명서사전 조정된 배치를 참조하세요. AI 예제 SageMaker GitHub 리포지토리의 GPT-2에 train_gpt_simple.py 대한 예제 훈련 스크립트도 참조하세요.

다음 코드 조각은 PyTorch 에서 앞서 언급한 시나리오를 기반으로 추정기 객체를 생성하는 예를 보여줍니다예시 2.

mpi_options = "-verbose --mca orte_base_help_aggregate 0 " smp_parameters = { "ddp": True, "fp16": True, "prescaled_batch": True, "sharded_data_parallel_degree": 4, "tensor_parallel_degree": 4 } pytorch_estimator = PyTorch( entry_point="your_training_script.py", role=role, instance_type="ml.p4d.24xlarge", volume_size=200, instance_count=4, sagemaker_session=sagemaker_session, py_version="py3", framework_version="1.13.1", distribution={ "smdistributed": { "modelparallel": { "enabled": True, "parameters": smp_parameters, } }, "mpi": { "enabled": True, "processes_per_host": 8, "custom_mpi_options": mpi_options, }, }, source_dir="source_directory_of_your_code", output_path=s3_output_location )

샤딩된 데이터 병렬 처리 사용에 대한 팁과 고려 사항

SageMaker 모델 병렬 처리 라이브러리의 샤딩된 데이터 병렬 처리를 사용할 때는 다음을 고려하세요.

  • 샤딩된 데이터 병렬 처리는 FP16 훈련과 호환됩니다. FP16 훈련을 실행하려면 FP16 모델 병렬 처리를 사용한 훈련 섹션을 참조하세요.

  • 샤딩된 데이터 병렬 처리는 텐서 병렬 처리와 호환됩니다. 텐서 병렬 처리와 함께 샤딩된 데이터 병렬 처리를 사용할 때 고려해야 할 사항은 다음과 같습니다.

    • 텐서 병렬 처리와 함께 샤딩된 데이터 병렬 처리를 사용하는 경우 임베딩 레이어도 텐서 병렬 그룹 전체에 자동으로 분산됩니다. 즉, distribute_embedding 파라미터는 자동으로 True로 설정됩니다. 텐서 병렬 처리에 대한 자세한 내용은 텐서 병렬 처리을 참조하세요.

    • 텐서 병렬 처리를 사용하는 샤딩된 데이터 병렬 처리는 현재 NCCL 집합체를 분산 훈련 전략의 백엔드로 사용합니다.

    자세한 내용은 텐서 병렬 처리를 사용한 샤딩된 데이터 병렬 처리 섹션을 참조하세요.

  • 샤딩된 데이터 병렬 처리는 현재 파이프라인 병렬 처리 또는 옵티마이저 상태 샤딩과 호환되지 않습니다. 샤딩된 데이터 병렬 처리를 활성화하려면 옵티마이저 상태 샤딩을 끄고 파이프라인 병렬도를 1로 설정합니다.

  • 활성화 체크포인트활성화 오프로딩 기능은 샤딩된 데이터 병렬 처리와 호환됩니다.

  • 그라디언트 누적과 함께 샤딩된 데이터 병렬 처리를 사용하려면 모델을 smdistributed.modelparallel.torch.DistributedModel 모듈로 래핑하는 동안 backward_passes_per_step 인수를 누적 단계 수로 설정합니다. 이렇게 하면 모델 복제 그룹(샤딩 그룹 )전반의 그라디언트 AllReduce 연산이 그라디언트 누적 경계에서 이루어지도록 할 수 있습니다.

  • 라이브러리의 체크포인트 APIs, smp.save_checkpoint 및를 사용하여 샤딩된 데이터 병렬 처리로 훈련된 모델을 체크포인트할 수 있습니다smp.resume_from_checkpoint. 자세한 내용은 분산 PyTorch 모델 체크포인트 지정( SageMaker 모델 병렬 처리 라이브러리 v1.10.0 이상) 단원을 참조하십시오.

  • delayed_parameter_initialization 구성 파라미터 동작은 샤딩된 데이터 병렬 처리에서 변경됩니다. 이 두 기능을 동시에 켜면 모델 생성 시 파라미터 초기화를 지연시키는 대신 샤딩 방식으로 파라미터를 즉시 초기화하므로 각 랭크가 파라미터의 샤드를 초기화하고 저장합니다.

  • 샤딩된 데이터 병렬 처리가 활성화되면 optimizer.step() 호출이 실행될 때 라이브러리가 내부적으로 그라디언트 클리핑을 수행합니다. 와 같은 그라데이션 클리핑APIs에는 유틸리티를 사용할 필요가 없습니다torch.nn.utils.clip_grad_norm_(). 그라데이션 클리핑의 임계값을 조정하려면 샤딩된 데이터 병렬 처리를 훈련 작업에 적용하는 방법 섹션에 표시된 대로 SageMaker PyTorch 추정기를 구성할 때 sdp_gradient_clipping 배포 파라미터 구성의 파라미터를 통해 임계값을 설정할 수 있습니다.

프라이버시사이트 이용 약관쿠키 기본 설정
© 2025, Amazon Web Services, Inc. 또는 계열사. All rights reserved.