

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

# 이기종 클러스터에서 훈련 작업 실행
<a name="train-heterogeneous-cluster"></a>

SageMaker Training의 이기종 클러스터 기능을 사용하면 여러 유형의 ML 인스턴스로 훈련 작업을 실행하여 다양한 ML 훈련 작업 및 목적에 맞게 리소스 규모 조정 및 활용도를 높일 수 있습니다. 예를 들어 GPU 인스턴스가 있는 클러스터에서 훈련 작업을 수행할 때 CPU 사용률이 낮고 CPU 병목 문제가 발생하는 경우, 이기종 클러스터를 사용하면 비용 효율적인 CPU 인스턴스 그룹을 추가하여 CPU 사용량이 많은 작업의 부담을 줄이고 이러한 병목 문제를 해결하고 GPU 활용도를 높일 수 있습니다.

**참고**  
이 기능은 SageMaker Python SDK v2.98.0 이상에서 사용할 수 있습니다.

**참고**  
이 기능은 SageMaker AI [PyTorch](https://sagemaker.readthedocs.io/en/stable/frameworks/pytorch/sagemaker.pytorch.html)와 [TensorFlow](https://sagemaker.readthedocs.io/en/stable/frameworks/tensorflow/sagemaker.tensorflow.html#tensorflow-estimator) 프레임워크 예측기 클래스를 통해 사용할 수 있습니다. 지원되는 프레임워크는 파이토치 v1.10 이상 및 텐서플로 v2.6 이상입니다.

[Amazon SageMaker AI 이기종 클러스터를 사용하여 모델 훈련의 가격 대비 성능 개선](https://aws.amazon.com/blogs/machine-learning/improve-price-performance-of-your-model-training-using-amazon-sagemaker-heterogeneous-clusters/) 블로그도 참조하세요.

**Topics**
+ [Amazon SageMaker AI에서 이기종 클러스터를 사용하여 훈련 작업 구성](train-heterogeneous-cluster-configure.md)
+ [Amazon SageMaker AI의 이기종 클러스터에서 분산 훈련 실행](train-heterogeneous-cluster-configure-distributed.md)
+ [훈련 스크립트를 수정하여 인스턴스 그룹을 할당하세요.](train-heterogeneous-cluster-modify-training-script.md)

# Amazon SageMaker AI에서 이기종 클러스터를 사용하여 훈련 작업 구성
<a name="train-heterogeneous-cluster-configure"></a>

이 섹션에서는 여러 인스턴스 유형으로 구성된 이기종 클러스터를 사용하여 훈련 작업을 실행하는 방법에 대한 지침을 제공합니다.

시작하기 전에 다음 사항에 유의하세요.
+ 모든 인스턴스 그룹은 동일한 도커 이미지와 훈련 스크립트를 공유합니다. 따라서 어떤 인스턴스 그룹에 속하는지 감지하고 그에 따라 실행을 분기하도록 훈련 스크립트를 수정해야 합니다.
+ 이기종 클러스터 기능은 SageMaker AI 로컬 모드에서 지원되지 않습니다.
+ 이기종 클러스터 훈련 작업의 Amazon CloudWatch 로그 스트림은 인스턴스 그룹별로 그룹화되지 않습니다. 로그를 통해 어떤 노드가 어떤 그룹에 속하는지 파악해야 합니다.

**Topics**
+ [옵션 1: SageMaker Python SDK 사용하기](#train-heterogeneous-cluster-configure-pysdk)
+ [옵션 2: 하위 수준 SageMaker API 사용](#train-heterogeneous-cluster-configure-api)

## 옵션 1: SageMaker Python SDK 사용하기
<a name="train-heterogeneous-cluster-configure-pysdk"></a>

SageMaker Python SDK를 사용하여 이기종 클러스터의 인스턴스 그룹을 구성하는 방법에 대한 지침을 따르세요.

1. 훈련 작업에 사용할 이기종 클러스터의 인스턴스 그룹을 구성하려면 `sagemaker.instance_group.InstanceGroup` 클래스를 사용하세요 각 인스턴스 그룹의 사용자 지정 이름, 인스턴스 유형, 각 인스턴스 그룹의 인스턴스 수를 지정할 수 있습니다. 자세한 내용은 *SageMaker AI Python SDK 설명서*의 [sagemaker.instance\$1group.InstanceGroup](https://sagemaker.readthedocs.io/en/stable/api/utility/instance_group.html)을 참조하세요.
**참고**  
사용 가능한 인스턴스 유형 및 이기종 클러스터에서 구성할 수 있는 최대 인스턴스 그룹 수에 대한 자세한 내용은 [InstanceGroup](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_InstanceGroup.html) API 참조를 참조하세요.

   다음 코드 예제는 다음 다이어그램과 같이 `instance_group_2`라는 두 개의 `ml.c5.18xlarge` CPU 전용 `instance_group_1` 인스턴스와 이름이 지정된 하나의 `ml.p3dn.24xlarge` GPU 인스턴스로 구성된 두 개의 인스턴스 그룹을 설정하는 방법을 보여줍니다.  
![\[SageMaker 훈련 작업에서 데이터를 할당할 수 있는 방법의 개념적 예제입니다.\]](http://docs.aws.amazon.com/ko_kr/sagemaker/latest/dg/images/HCTraining.png)

   앞의 다이어그램은 데이터 사전 처리와 같은 사전 훈련 프로세스를 CPU 인스턴스 그룹에 할당하고 사전 처리된 데이터를 GPU 인스턴스 그룹에 스트리밍하는 방법의 개념적 예를 보여줍니다.

   ```
   from sagemaker.instance_group import InstanceGroup
   
   instance_group_1 = InstanceGroup(
       "instance_group_1", "ml.c5.18xlarge", 2
   )
   instance_group_2 = InstanceGroup(
       "instance_group_2", "ml.p3dn.24xlarge", 1
   )
   ```

1. [인스턴스 그룹 객체를 사용하여 훈련 입력 채널을 설정하고 SageMaker.inputs.TrainingInput 클래스의 `instance_group_names` 인수를 통해 채널에 인스턴스 그룹을 할당합니다.](https://sagemaker.readthedocs.io/en/stable/api/utility/inputs.html) `instance_group_names` 인수는 인스턴스 그룹 이름의 문자열 목록을 수락합니다.

   다음 예제는 두 개의 훈련 입력 채널을 설정하고 이전 단계의 예제에서 만든 인스턴스 그룹을 할당하는 방법을 보여줍니다. 또한 인스턴스 그룹의 `s3_data` 인수에 대한 Amazon S3 버킷 경로를 지정하여 사용 목적에 맞게 데이터를 처리할 수 있습니다.

   ```
   from sagemaker.inputs import TrainingInput
   
   training_input_channel_1 = TrainingInput(
       s3_data_type='S3Prefix', # Available Options: S3Prefix | ManifestFile | AugmentedManifestFile
       s3_data='s3://your-training-data-storage/folder1',
       distribution='FullyReplicated', # Available Options: FullyReplicated | ShardedByS3Key 
       input_mode='File', # Available Options: File | Pipe | FastFile
       instance_groups=["instance_group_1"]
   )
   
   training_input_channel_2 = TrainingInput(
       s3_data_type='S3Prefix',
       s3_data='s3://your-training-data-storage/folder2',
       distribution='FullyReplicated',
       input_mode='File',
       instance_groups=["instance_group_2"]
   )
   ```

   `TrainingInput`의 인수에 대한 자세한 내용은 다음 링크를 참조하세요.
   + *SageMaker Python SDK 문서*의 [sagemaker.inputs.TrainingInput](https://sagemaker.readthedocs.io/en/stable/api/utility/inputs.html) 클래스
   + *SageMaker AI API 참조*의 [S3DataSource](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_S3DataSource.html) API

1. 다음 코드 예시와 같이 `instance_groups` 인수를 사용하여 SageMaker AI 예측기를 구성합니다. `instance_groups` 인수는 `InstanceGroup` 객체 목록을 받아들입니다.
**참고**  
이기종 클러스터 기능은 SageMaker AI [PyTorch](https://sagemaker.readthedocs.io/en/stable/frameworks/pytorch/sagemaker.pytorch.html)와 [TensorFlow](https://sagemaker.readthedocs.io/en/stable/frameworks/tensorflow/sagemaker.tensorflow.html#tensorflow-estimator) 프레임워크 예측기 클래스를 통해 사용할 수 있습니다. 지원되는 프레임워크는 파이토치 v1.10 이상 및 텐서플로 v2.6 이상입니다. 사용 가능한 프레임워크 컨테이너, 프레임워크 버전 및 Python 버전의 전체 목록을 찾으려면 AWS 딥 러닝 [컨테이너 GitHub 리포지토리의 SageMaker AI 프레임워크](https://github.com/aws/deep-learning-containers/blob/master/available_images.md#sagemaker-framework-containers-sm-support-only) 컨테이너를 참조하세요. GitHub 

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

   ```
   from sagemaker.pytorch import PyTorch
   
   estimator = PyTorch(
       ...
       entry_point='my-training-script.py',
       framework_version='x.y.z',    # 1.10.0 or later
       py_version='pyxy',            
       job_name='my-training-job-with-heterogeneous-cluster',
       instance_groups=[instance_group_1, instance_group_2]
   )
   ```

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

   ```
   from sagemaker.tensorflow import TensorFlow
   
   estimator = TensorFlow(
       ...
       entry_point='my-training-script.py',
       framework_version='x.y.z', # 2.6.0 or later
       py_version='pyxy',
       job_name='my-training-job-with-heterogeneous-cluster',
       instance_groups=[instance_group_1, instance_group_2]
   )
   ```

------
**참고**  
`instance_type` 및 `instance_count` 인수 페어와 SageMaker AI 예측기 클래스의 `instance_groups` 인수는 상호 배타적입니다. 동종 클러스터 훈련의 경우 `instance_type` 및 `instance_count` 인수 페어를 사용하세요. 이기종 클러스터 훈련의 경우 `instance_groups`를 사용하세요.
**참고**  
사용 가능한 프레임워크 컨테이너, 프레임워크 버전 및 Python 버전의 전체 목록을 찾으려면 AWS 딥 러닝 [컨테이너 GitHub 리포지토리의 SageMaker AI 프레임워크](https://github.com/aws/deep-learning-containers/blob/master/available_images.md#sagemaker-framework-containers-sm-support-only) 컨테이너를 참조하세요. GitHub 

1. 인스턴스 그룹으로 구성된 훈련 입력 채널로 `estimator.fit` 메서드를 구성하고 훈련 작업을 시작하세요

   ```
   estimator.fit(
       inputs={
           'training': training_input_channel_1, 
           'dummy-input-channel': training_input_channel_2
       }
   )
   ```

## 옵션 2: 하위 수준 SageMaker API 사용
<a name="train-heterogeneous-cluster-configure-api"></a>

 AWS Command Line Interface 또는를 사용하고 이기종 클러스터로 훈련 작업 요청을 제출하기 위해 하위 수준 SageMaker APIs를 사용 AWS SDK for Python (Boto3) 하려는 경우 다음 API 참조를 참조하세요.
+ [CreateTrainingJob](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTrainingJob.html)
+ [ResourceConfig ](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_ResourceConfig.html)
+ [InstanceGroup](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_InstanceGroup.html)
+ [S3DataSource](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_S3DataSource.html)

# Amazon SageMaker AI의 이기종 클러스터에서 분산 훈련 실행
<a name="train-heterogeneous-cluster-configure-distributed"></a>

SageMaker AI 예측기 클래스의 `distribution` 인수를 통해 분산 훈련을 실행할 특정 인스턴스 그룹을 할당할 수 있습니다. 예를 들어 다음과 같은 두 인스턴스 그룹이 있고 그 중 하나에서 다중 GPU 훈련을 실행하려고 한다고 가정해 보겠습니다.

```
from sagemaker.instance_group import InstanceGroup

instance_group_1 = InstanceGroup("instance_group_1", "ml.c5.18xlarge", 1)
instance_group_2 = InstanceGroup("instance_group_2", "ml.p3dn.24xlarge", 2)
```

인스턴스 그룹 중 하나에 대해 분산 훈련 구성을 설정할 수 있습니다. 예를 들어, 다음 코드 예제는 분산 훈련 구성에 두 개의 `ml.p3dn.24xlarge` 인스턴스를 사용하여 `training_group_2`를 할당하는 방법을 보여줍니다.

**참고**  
현재는 이기종 클러스터의 인스턴스 그룹 하나만 배포 구성에 지정할 수 있습니다.

**MPI 사용 시**

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

```
from sagemaker.pytorch import PyTorch

estimator = PyTorch(
    ...
    instance_groups=[instance_group_1, instance_group_2],
    distribution={
        "mpi": {
            "enabled": True, "processes_per_host": 8
        },
        "instance_groups": [instance_group_2]
    }
)
```

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

```
from sagemaker.tensorflow import TensorFlow

estimator = TensorFlow(
    ...
    instance_groups=[instance_group_1, instance_group_2],
    distribution={
        "mpi": {
            "enabled": True, "processes_per_host": 8
        },
        "instance_groups": [instance_group_2]
    }
)
```

------

**SageMaker AI 데이터 병렬 라이브러리 사용**

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

```
from sagemaker.pytorch import PyTorch

estimator = PyTorch(
    ...
    instance_groups=[instance_group_1, instance_group_2],
    distribution={
        "smdistributed": {
            "dataparallel": {
                "enabled": True
            }
        }, 
        "instance_groups": [instance_group_2]
    }
)
```

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

```
from sagemaker.tensorflow import TensorFlow

estimator = TensorFlow(
    ...
    instance_groups=[instance_group_1, instance_group_2],
    distribution={
        "smdistributed": {
            "dataparallel": {
                "enabled": True
            }
        }, 
        "instance_groups": [instance_group_2]
    }
)
```

------

**참고**  
SageMaker AI 데이터 병렬 라이브러리를 사용하는 경우 인스턴스 그룹이 [라이브러리에서 지원하는 인스턴스 유형](https://docs.aws.amazon.com/sagemaker/latest/dg/distributed-data-parallel-support.html#distributed-data-parallel-supported-instance-types)으로 구성되어 있는지 확인하세요.

SageMaker AI 데이터 병렬 라이브러리에 대한 자세한 내용은 [SageMaker AI 데이터 병렬 훈련](https://docs.aws.amazon.com/sagemaker/latest/dg/data-parallel.html)을 참조하세요.

**SageMaker AI 모델 병렬 라이브러리 사용**

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

```
from sagemaker.pytorch import PyTorch

estimator = PyTorch(
    ...
    instance_groups=[instance_group_1, instance_group_2],
    distribution={
        "smdistributed": {
            "modelparallel": {
                "enabled":True,
                "parameters": {
                    ...   # SageMaker AI model parallel parameters
                } 
            }
        }, 
        "instance_groups": [instance_group_2]
    }
)
```

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

```
from sagemaker.tensorflow import TensorFlow

estimator = TensorFlow(
    ...
    instance_groups=[instance_group_1, instance_group_2],
    distribution={
        "smdistributed": {
            "modelparallel": {
                "enabled":True,
                "parameters": {
                    ...   # SageMaker AI model parallel parameters
                } 
            }
        }, 
        "instance_groups": [instance_group_2]
    }
)
```

------

SageMaker AI 모델 병렬 라이브러리에 대한 자세한 내용은 [SageMaker AI 모델 병렬 훈련](https://docs.aws.amazon.com/sagemaker/latest/dg/model-parallel.html)을 참조하세요.

# 훈련 스크립트를 수정하여 인스턴스 그룹을 할당하세요.
<a name="train-heterogeneous-cluster-modify-training-script"></a>

이전 섹션의 이기종 클러스터 구성을 사용하여 훈련 작업을 위한 SageMaker 훈련 환경 및 인스턴스를 준비했습니다. 인스턴스 그룹을 특정 훈련 및 데이터 처리 작업에 추가로 할당하려면 다음 단계는 훈련 스크립트를 수정하는 것입니다. 기본적으로 훈련 작업에서는 인스턴스 크기에 관계없이 모든 노드에 대한 훈련 스크립트 복제본을 만들기만 하므로 성능이 저하될 수 있습니다.

예를 들어 SageMaker AI 예측기의 `entry_point` 인수에 심층 신경망 훈련 스크립트를 전달하는 동안 이기종 클러스터에서 CPU 인스턴스와 GPU 인스턴스를 혼합하면 `entry_point` 스크립트가 각 인스턴스에 복제됩니다. 즉, 적절한 작업 할당이 없으면 CPU 인스턴스가 전체 스크립트를 실행하고 GPU 인스턴스에서의 분산 훈련을 위해 설계된 훈련 작업도 시작합니다. 따라서 CPU 인스턴스에서 오프로드하고 실행하려는 특정 처리 함수를 변경해야 합니다. SageMaker AI 환경 변수를 사용하여 이기종 클러스터의 정보를 검색하고 그에 따라 특정 프로세스를 실행하도록 할 수 있습니다.

훈련 작업이 시작되면 훈련 스크립트는 이기종 클러스터 구성을 포함하는 SageMaker 훈련 환경 정보를 읽습니다. 구성에는 현재 인스턴스 그룹, 각 그룹의 현재 호스트, 현재 호스트가 상주하는 그룹 등의 정보가 포함됩니다.

SageMaker AI 훈련 작업의 초기화 단계에서 다음 방법으로 인스턴스 그룹 정보를 쿼리할 수 있습니다.

**(권장) SageMaker 훈련 툴킷으로 인스턴스 그룹 정보 읽기**

[SageMaker 훈련](https://github.com/aws/sagemaker-training-toolkit) 툴킷 라이브러리가 제공하는 환경 Python 모듈을 사용하세요 툴킷 라이브러리는 TensorFlow 및 PyTorch용 [SageMaker 프레임워크 컨테이너](https://github.com/aws/deep-learning-containers/blob/master/available_images.md#sagemaker-framework-containers-sm-support-only)에 사전 설치되어 있으므로 사전 빌드된 컨테이너를 사용할 때 추가 설치 단계가 필요하지 않습니다. 훈련 스크립트의 코드 변경 횟수를 줄이면서 SageMaker AI 환경 변수를 검색하는 데 권장되는 방법입니다.

```
from sagemaker_training import environment

env = environment.Environment()
```

일반 SageMaker 훈련 및 이기종 클러스터와 관련된 환경 변수:
+ `env.is_hetero` - 이기종 클러스터의 구성 여부에 관계없이 Boolean 결과를 반환합니다.
+ `env.current_host` - 현재 호스트를 반환합니다.
+ `env.current_instance_type` - 현재 호스트의 인스턴스 유형을 반환합니다.
+ `env.current_instance_group` - 현재 인스턴스 그룹 이름을 반환합니다.
+ `env.current_instance_group_hosts` - 현재 인스턴스 그룹의 호스트 목록을 반환합니다.
+ `env.instance_groups` - 훈련에 사용된 인스턴스 그룹 이름 목록을 반환합니다.
+ `env.instance_groups_dict` - 훈련 작업의 전체 이기종 클러스터 구성을 반환합니다.
+ `env.distribution_instance_groups` - SageMaker AI 예측기 클래스의 `distribution` 파라미터에 할당된 인스턴스 그룹 목록을 반환합니다.
+ `env.distribution_hosts` - SageMaker AI 예측기 클래스의 `distribution` 파라미터에 할당된 인스턴스 그룹에 속하는 호스트 목록을 반환합니다.

예를 들어, 두 인스턴스 그룹으로 구성된 이기종 클러스터의 다음 예를 생각해 보세요.

```
from sagemaker.instance_group import InstanceGroup

instance_group_1 = InstanceGroup(
    "instance_group_1", "ml.c5.18xlarge", 1)
instance_group_2 = InstanceGroup(
    "instance_group_2", "ml.p3dn.24xlarge", 2)
```

예시 이기종 `env.instance_groups_dict` 클러스터의 출력은 다음과 유사해야 합니다.

```
{
    "instance_group_1": {
        "hosts": [
            "algo-2"
        ],
        "instance_group_name": "instance_group_1",
        "instance_type": "ml.c5.18xlarge"
    },
    "instance_group_2": {
        "hosts": [
            "algo-3",
            "algo-1"
        ],
        "instance_group_name": "instance_group_2",
        "instance_type": "ml.p3dn.24xlarge"
    }
}
```

**(선택 사항) 리소스 구성 JSON 파일에서 인스턴스 그룹 정보 읽기**

환경 변수를 JSON 형식으로 검색하려는 경우 리소스 구성 JSON 파일을 직접 사용할 수 있습니다. SageMaker 훈련 인스턴스의 JSON 파일은 기본적으로 `/opt/ml/input/config/resourceconfig.json`에 있습니다.

```
file_path = '/opt/ml/input/config/resourceconfig.json'
config = read_file_as_json(file_path)
print(json.dumps(config, indent=4, sort_keys=True))
```