모델 병렬 문제 해결 - 아마존 SageMaker

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

모델 병렬 문제 해결

오류가 발생한 경우, 다음 목록을 사용하여 훈련 작업의 문제를 해결하고자 시도할 수 있습니다. 문제가 지속되면 AWS 지원에 문의하세요.

SageMaker 모델 병렬화 라이브러리와 함께 SageMaker 디버거를 사용할 때 고려할 사항

SageMaker 모델 병렬화 라이브러리에는 디버거를 사용할 수 없습니다. SageMaker 디버거는 모든 SageMaker TensorFlow 작업과 PyTorch 교육 작업에 기본적으로 활성화되어 있으며 다음과 같은 오류가 표시될 수 있습니다.

FileNotFoundError: [Errno 2] No such file or directory: '/opt/ml/checkpoints/metadata.json.sagemaker-uploading

이 문제를 해결하려면 다음 예제와 같이 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": {"modelparallel": { "enabled": True }}}, checkpoint_s3_uri=checkpoint_s3_bucket, checkpoint_local_path="/opt/ml/checkpoints", debugger_hook_config=False )

체크포인트 저장

대형 모델의 체크포인트를 저장할 때 다음 오류가 발생할 수 있습니다. SageMaker

InternalServerError: We encountered an internal error. Please try again

이는 교육 중에 Amazon S3에 로컬 체크포인트를 업로드할 때 발생하는 SageMaker 제한 때문에 발생할 수 있습니다. 체크포인트를 비활성화하려면 다음 예제를 사용하여 체크포인트를 명시적으로 업로드하십시오. SageMaker

위 오류가 발생하는 경우 호출과 함께 사용하지 마십시오. checkpoint_s3_uri SageMaker estimator 대형 모델의 체크포인트를 저장할 때는 체크포인트를 사용자 지정 디렉터리에 저장한 후, 이를 local_path 인수로 헬퍼 함수에 전달하는 것이 좋습니다.

import os def aws_s3_sync(source, destination): """aws s3 sync in quiet mode and time profile""" import time, subprocess cmd = ["aws", "s3", "sync", "--quiet", source, destination] print(f"Syncing files from {source} to {destination}") start_time = time.time() p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) p.wait() end_time = time.time() print("Time Taken to Sync: ", (end_time-start_time)) return def sync_local_checkpoints_to_s3(local_path="/opt/ml/checkpoints", s3_uri=os.path.dirname(os.path.dirname(os.getenv('SM_MODULE_DIR', '')))+'/checkpoints'): """ sample function to sync checkpoints from local path to s3 """ import boto3 #check if local path exists if not os.path.exists(local_path): raise RuntimeError("Provided local path {local_path} does not exist. Please check") #check if s3 bucket exists s3 = boto3.resource('s3') if not s3_uri.startswith("s3://"): raise ValueError(f"Provided s3 uri {s3_uri} is not valid.") s3_bucket = s3_uri.replace('s3://','').split('/')[0] print(f"S3 Bucket: {s3_bucket}") try: s3.meta.client.head_bucket(Bucket=s3_bucket) except Exception as e: raise e aws_s3_sync(local_path, s3_uri) return def sync_s3_checkpoints_to_local(local_path="/opt/ml/checkpoints", s3_uri=os.path.dirname(os.path.dirname(os.getenv('SM_MODULE_DIR', '')))+'/checkpoints'): """ sample function to sync checkpoints from s3 to local path """ import boto3 #try to create local path if it does not exist if not os.path.exists(local_path): print(f"Provided local path {local_path} does not exist. Creating...") try: os.makedirs(local_path) except Exception as e: raise RuntimeError(f"Failed to create {local_path}") #check if s3 bucket exists s3 = boto3.resource('s3') if not s3_uri.startswith("s3://"): raise ValueError(f"Provided s3 uri {s3_uri} is not valid.") s3_bucket = s3_uri.replace('s3://','').split('/')[0] print(f"S3 Bucket: {s3_bucket}") try: s3.meta.client.head_bucket(Bucket=s3_bucket) except Exception as e: raise e aws_s3_sync(s3_uri, local_path) return

헬퍼 함수 사용:

#base_s3_uri - user input s3 uri or save to model directory (default) #curr_host - to save checkpoints of current host #iteration - current step/epoch during which checkpoint is saved # save checkpoints on every node using local_rank if smp.local_rank() == 0: base_s3_uri = os.path.dirname(os.path.dirname(os.getenv('SM_MODULE_DIR', ''))) curr_host = os.environ['SM_CURRENT_HOST'] full_s3_uri = f'{base_s3_uri}/checkpoints/{curr_host}/{iteration}' sync_local_checkpoints_to_s3(local_path=checkpoint_dir, s3_uri=full_s3_uri)

모델 병렬을 사용한 수렴 및 TensorFlow

모델 병렬 처리 TensorFlow 라이브러리와 함께 SageMaker 다중 노드 훈련을 사용하는 경우 학습 입력 파일의 순서가 노드마다 다를 수 있으므로 손실이 예상대로 수렴되지 않을 수 있습니다. 이로 인해 동일한 모델 병렬 그룹의 서로 다른 순위가 여러 개의 입력 파일에 적용되어 불일치가 발생할 수 있습니다. 이를 방지하려면 입력 파일을 데이터셋으로 변환하기 전에 모든 순위에서 동일한 순서로 정렬해야 합니다. TensorFlow 이를 달성할 방법은 훈련 스크립트에서 입력 파일 이름을 정렬하는 것입니다.

분산 훈련 작업의 지연 또는 충돌

훈련 작업 중 지연, 충돌 또는 무응답 문제가 발생할 경우, 다음 문제 해결 항목을 읽고 문제의 원인을 파악하세요. 추가 지원이 필요한 경우 Support를 통해 SageMaker 분산된 교육 팀에AWS 문의하세요.

  • NCCL 초기화 단계에서 분산 훈련 작업이 지연될 경우 다음 사항을 검토하세요.

    • 사용자 지정 VPC 및 해당 VPC의 서브넷과 함께 EFA 활성 인스턴스(ml.p4d 인스턴스 또는 ml.p3dn 인스턴스) 중 하나를 사용할 경우, 사용할 보안 그룹이 동일한 SG를 시작점 또는 종착점으로 삼는 모든 포트에 인바운드 및 아웃바운드 형태로 연결되어 있는지 확인하세요. 모든 IP에 대한 아웃바운드 연결 또한 대개 별도의 규칙(인터넷 액세스 관련)으로 필요합니다. EFA 통신 관련 인바운드 및 아웃바운드 규칙을 추가하는 방법에 대한 지침은 SageMaker 초기화 중 분산 교육 작업 중단을(를) 참조하세요.

  • 전체 모델의 체크포인트를 지정할 때 분산 훈련 작업이 지연될 경우, 이는 해당 모델 또는 최적화 프로그램에 대한 state_dict() 호출이 rdp_rank()==0(텐서 병렬 처리를 사용할 경우) 또는 dp_rank()==0(파이프라인 병렬 처리만 사용할 경우)을(를) 갖춘 모든 순위에서 수행되지 않았기 때문일 수 있습니다. 저장할 체크포인트를 구성하려면 이들 순위로 통신을 해야 합니다. 체크포인트 부분 최적화 프로그램 shard_optimizer_state이(가) 활성화되어 있을 때에도 이와 유사한 지연 문제가 발생할 수 있습니다.

    모델 병렬 처리를 이용하여 모델의 체크포인트를 지정하는 방법에 대한 자세한 내용은 저장 및 로드에 관한 일반 지침분산 PyTorch 모델 체크포인트 (v1.6.0과 v1.9.0 사이의 모델 병렬 처리 SageMaker 라이브러리용)을(를) 참조하세요.

  • CUDA 메모리 부족 오류로 인해 훈련 작업에서 충돌이 일어날 경우, GPU 클러스터의 모델에 맞게 분산 훈련 구성을 조정해야 합니다. 자세한 내용 및 모범 사례는 지정된 모델에 적합한 구성 설정을(를) 참조하세요.

  • 수정 불가능한 ECC 오류로 인해 훈련 작업에서 충돌이 일어난다면 이 클러스터의 GPU 중 하나가 고장났다는 뜻입니다. 기술 지원이 필요한 경우 작업 ARN을 AWS 팀과 공유하고, 가능하면 체크포인트에서 훈련 작업을 다시 시작하세요.

  • 드문 경우이긴 하지만, 이전에는 작동했으나 GPU 메모리 한도에 가까워진 작업 구성이 추후 CUDA 메모리 부족 오류로 인해 다른 클러스터에서 실패할 수도 있습니다. 이는 ECC 오류로 인해 일부 GPU의 가용 메모리가 평소보다 적어졌기 때문일 수 있습니다.

  • 해당 노드의 일부 GPU만을 사용하는 다중 노드 작업을 실행할 경우 네트워크 제한 시간 충돌이 발생할 수 있습니다. 이 문제를 해결하려면 processes_per_host 파라미터가 각 인스턴스의 GPU 수로 설정되어 있는지 확인하여 노드의 모든 GPU를 사용하세요. 그 예로 이것은 ml.p3.16xlarge 인스턴스, ml.p3dn.24xlarge 인스턴스 및 ml.p4d.24xlarge 인스턴스에 맞는 processes_per_host=8입니다.

  • 데이터 다운로드 단계에서 교육 작업에 시간이 오래 걸리는 경우 SageMaker Estimator 수업에 checkpoint_s3_uri 제공한 Amazon S3 경로가 현재 교육 작업에 고유한지 확인하십시오. 동시에 실행되는 여러 훈련 작업에서 이 경로를 재사용할 경우, 이 모든 체크포인트가 동일한 Amazon S3 경로에 업로드 및 다운로드되므로 체크포인트 로드 시간이 크게 늘어날 수 있습니다.

  • 대규모 데이터 및 모델을 처리할 때는 FSx for Lustre를 사용하세요.

    • 데이터 세트가 대규모여서 가져오는 데 시간이 오래 걸린다면 데이터 세트를 FSx for Lustre에 보관하는 것이 좋습니다.

    • 훈련 모델의 파라미터가 100억 개를 초과하는 경우에는 체크포인트 지정에 FSx for Lustre를 사용하는 것이 좋습니다.

    • 파일 시스템을 생성한 후에는 그 상태가 사용 가능으로 바뀔 때까지 기다렸다가, 해당 파일 시스템을 이용하여 훈련 작업을 시작해야 합니다.

교육 작업에 대한 NCCL 오류 수신 PyTorch

다음 오류가 발생했다면 프로세스에서 GPU 메모리가 부족해졌기 때문일 수 있습니다.

NCCL error in: ../torch/lib/c10d/ProcessGroupNCCL.cpp:825, unhandled system error, NCCL version 2.7.8 ncclSystemError: System call (socket, malloc, munmap, etc) failed.

배치 크기 또는 active_microbatches을(를) 줄이면 이 문제를 해결할 수 있습니다. 자동 파티셔닝으로 인해 파티셔닝이 균형 잡힌 상태로 이루어지지 않으면 수동 파티셔닝을 고려해야 할 수도 있습니다. 자세한 설명은 노드 간 파이프라인 병렬성 섹션을 참조하세요.

PyTorch 교육 RecursionError Job에 대한 접수

이 라이브러리는 모듈의 전달 호출 내부에서 이뤄지는 super.forward() 호출을 지원하지 않습니다. super.forward()을(를) 사용하면 다음 오류 메시지가 표시될 수 있습니다.

RecursionError: maximum recursion depth exceeded

오류를 수정하려면 super.forward()을(를) 호출하는 대신 super()._orig_forward()을(를) 호출해야 합니다.