

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

# 모델 병렬 문제 해결
<a name="distributed-troubleshooting-model-parallel"></a>

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

**Topics**
+ [SageMaker 모델 병렬 처리 라이브러리와 SageMaker Debugger의 동시 사용에 관한 고려 사항](#distributed-ts-model-parallel-debugger)
+ [체크포인트 저장](#distributed-ts-model-parallel-checkpoints)
+ [모델 병렬 및 TensorFlow를 이용한 수렴](#distributed-ts-model-parallel-tf-convergence)
+ [분산 훈련 작업의 지연 또는 충돌](#distributed-ts-model-parallel-training-issues)
+ [PyTorch 훈련 작업 관련 NCCL 오류 수신](#distributed-ts-model-parallel-nccl-error)
+ [PyTorch 훈련 작업 관련 `RecursionError` 수신](#distributed-ts-model-parallel-super-forward-not-supported)

## SageMaker 모델 병렬 처리 라이브러리와 SageMaker Debugger의 동시 사용에 관한 고려 사항
<a name="distributed-ts-model-parallel-debugger"></a>

SageMaker Debugger는 SageMaker 모델 병렬 처리 라이브러리에 사용할 수 없습니다. Debugger는 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
)
```

## 체크포인트 저장
<a name="distributed-ts-model-parallel-checkpoints"></a>

SageMaker AI에 대규모 모델의 체크포인트를 저장할 경우 다음 오류가 발생할 수 있습니다.

```
InternalServerError: We encountered an internal error. Please try again
```

이 오류는 훈련 중 로컬 체크포인트를 Amazon S3에 업로드하는 동안 SageMaker AI의 제한 사항으로 인해 발생할 수 있습니다. SageMaker AI의 체크포인트를 사용 해제하려면 다음 예시를 사용하여 체크포인트를 명확하게 업로드합니다.

이전에 나타났던 오류가 발생한 경우에는 `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를 이용한 수렴
<a name="distributed-ts-model-parallel-tf-convergence"></a>

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

## 분산 훈련 작업의 지연 또는 충돌
<a name="distributed-ts-model-parallel-training-issues"></a>

훈련 작업 중 지연, 충돌 또는 무응답 문제가 발생할 경우, 다음 문제 해결 항목을 읽고 문제의 원인을 파악하세요. 추가 지원이 필요하다면 [AWS 지원](https://aws.amazon.com/premiumsupport)을 통해 SageMaker 분산 훈련 팀에 문의하세요.
+  **NCCL 초기화 단계에서 분산 훈련 작업이 지연**될 경우 다음 사항을 검토하세요.
  + 사용자 지정 VPC 및 해당 VPC의 서브넷과 함께 EFA 활성 인스턴스(`ml.p4d` 인스턴스 또는 `ml.p3dn` 인스턴스) 중 하나를 사용할 경우, 사용할 보안 그룹이 동일한 SG를 시작점 또는 종착점으로 삼는 모든 포트에 인바운드 및 아웃바운드 형태로 연결되어 있는지 확인하세요. 모든 IP에 대한 아웃바운드 연결 또한 대개 별도의 규칙(인터넷 액세스 관련)으로 필요합니다. EFA 통신 관련 인바운드 및 아웃바운드 규칙을 추가하는 방법에 대한 지침은 [초기화 도중 SageMaker AI 분산 훈련 작업이 지연되는 현상](distributed-troubleshooting-data-parallel.md#distributed-ts-data-parallel-efa-sg)을(를) 참조하세요.
+ 전체 모델의 **체크포인트를 지정할 때 분산 훈련 작업이 지연**될 경우, 이는 해당 모델 또는 최적화 프로그램에 대한 `state_dict()` 호출이 `rdp_rank()==0`(텐서 병렬 처리를 사용할 경우) 또는 `dp_rank()==0`(파이프라인 병렬 처리만 사용할 경우)을(를) 갖춘 모든 순위에서 수행되지 않았기 때문일 수 있습니다. 저장할 체크포인트를 구성하려면 이들 순위로 통신을 해야 합니다. 체크포인트 부분 최적화 프로그램 `shard_optimizer_state`이(가) 활성화되어 있을 때에도 이와 유사한 지연 문제가 발생할 수 있습니다.

  모델 병렬 처리를 이용하여 모델의 체크포인트를 지정하는 방법에 대한 자세한 내용은 [저장 및 로드에 관한 일반 지침](https://sagemaker.readthedocs.io/en/v2.199.0/api/training/smp_versions/latest/smd_model_parallel_pytorch.html#general-instruction-for-saving-and-loading) 및 [분산 PyTorch 모델 체크포인트 지정(v1.6.0과 v1.9.0 사이의 SageMaker 모델 병렬 처리 라이브러리 전용)](distributed-model-parallel-checkpointing-and-finetuning.md#model-parallel-extended-features-pytorch-saving-loading-checkpoints)을(를) 참조하세요.
+ **CUDA 메모리 부족 오류**로 인해 훈련 작업에서 충돌이 일어날 경우, GPU 클러스터의 모델에 맞게 분산 훈련 구성을 조정해야 합니다. 자세한 내용 및 모범 사례는 [지정된 모델에 적합한 구성 설정](model-parallel-best-practices.md#model-parallel-best-practices-configuration)을(를) 참조하세요.
+ **수정 불가능한 [ECC 오류](https://docs.nvidia.com/deploy/a100-gpu-mem-error-mgmt/index.html)**로 인해 훈련 작업에서 충돌이 일어난다면 이 클러스터의 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](https://aws.amazon.com/fsx/lustre/)에 보관하는 것이 좋습니다.
  + 훈련 모델의 파라미터가 100억 개를 초과하는 경우에는 체크포인트 지정에 FSx for Lustre를 사용하는 것이 좋습니다.
  + 파일 시스템을 생성한 후에는 그 상태가 **사용 가능**으로 바뀔 때까지 기다렸다가, 해당 파일 시스템을 이용하여 훈련 작업을 시작해야 합니다.

## PyTorch 훈련 작업 관련 NCCL 오류 수신
<a name="distributed-ts-model-parallel-nccl-error"></a>

다음 오류가 발생했다면 프로세스에서 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`을(를) 줄이면 이 문제를 해결할 수 있습니다. 자동 파티셔닝으로 인해 파티셔닝이 균형 잡힌 상태로 이루어지지 않으면 수동 파티셔닝을 고려해야 할 수도 있습니다. 자세한 내용은 [노드 간 파이프라인 병렬성](model-parallel-best-practices.md#model-parallel-best-practices-configuration-pipeline-across-nodes) 섹션을 참조하세요.

## PyTorch 훈련 작업 관련 `RecursionError` 수신
<a name="distributed-ts-model-parallel-super-forward-not-supported"></a>

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

```
RecursionError: maximum recursion depth exceeded
```

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