이기종 클러스터를 사용한 훈련 - 아마존 SageMaker

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

이기종 클러스터를 사용한 훈련

Training의 SageMaker 이기종 클러스터 기능을 사용하면 여러 유형의 ML 인스턴스로 학습 작업을 실행하여 다양한 ML 교육 작업 및 목적에 맞게 리소스를 확장하고 활용도를 높일 수 있습니다. 예를 들어, GPU 인스턴스가 있는 클러스터에서의 교육 작업에서 CPU 집중적인 작업으로 인해 GPU 사용률이 낮고 CPU 병목 문제가 발생하는 경우, 이기종 클러스터를 사용하면 비용 효율적인 CPU 인스턴스 그룹을 추가하여 CPU 집약적인 작업의 부담을 줄이고 이러한 병목 문제를 해결하고 GPU 활용도를 높일 수 있습니다.

참고

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

참고

이 기능은 SageMaker PyTorchTensorFlow프레임워크 추정기 클래스를 통해 사용할 수 있습니다. 지원되는 프레임워크는 PyTorch v1.10 이상 및 v2.6 이상입니다. TensorFlow

이기종 클러스터를 구성하는 방법

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

SageMaker Python 사용하기 SDK

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

  1. 훈련 작업에 사용할 이기종 클러스터의 인스턴스 그룹을 구성하려면 sagemaker.instance_group.InstanceGroup 클래스를 사용하세요 각 인스턴스 그룹의 사용자 지정 이름, 인스턴스 유형, 각 인스턴스 그룹의 인스턴스 수를 지정할 수 있습니다. 자세한 내용은 sagemaker.instance_group을 참조하십시오. InstanceGroupSageMakerPython SDK 설명서에서.

    참고

    사용 가능한 인스턴스 유형과 이기종 클러스터에서 구성할 수 있는 최대 인스턴스 그룹 수에 대한 자세한 내용은 참조를 참조하십시오. InstanceGroupAPI

    다음 코드 예제는 다음 다이어그램과 같이 이름이 지정된 두 개의 instance_group_1 인스턴스와 이름이 지정된 하나의 인스턴스로 구성된 두 개의 ml.c5.18xlarge CPU ml.p3dn.24xlarge GPU 인스턴스 그룹을 설정하는 방법을 보여줍니다. instance_group_2

    Training SageMaker Job에서 데이터를 할당하는 방법에 대한 개념적 예입니다.

    위 다이어그램은 데이터 사전 처리와 같은 사전 교육 프로세스를 인스턴스 그룹에 할당하고 사전 처리된 데이터를 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 )
  2. 인스턴스 그룹 객체를 사용하여 훈련 입력 채널을 설정하고 sagemaker.inputs의 인수를 통해 채널에 인스턴스 그룹을 할당합니다. instance_group_names TrainingInput클래스. 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의 인수에 대한 자세한 내용은 다음 링크를 참조하세요.

  3. 다음 코드 예제와 같이 instance_groups 인수를 사용하여 SageMaker 추정기를 구성합니다. instance_groups 인수는 InstanceGroup 객체 목록을 받아들입니다.

    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_typeinstance_count 인수 쌍과 SageMaker 추정기 클래스의 instance_groups 인수는 상호 배타적입니다. 동종 클러스터 훈련의 경우 instance_typeinstance_count 인수 페어를 사용하세요. 이기종 클러스터 훈련의 경우 instance_groups를 사용하세요.

    참고

    사용 가능한 프레임워크 컨테이너, 프레임워크 버전, Python 버전의 전체 목록을 찾으려면 AWS Deep Learning Container GitHub 저장소의 SageMaker 프레임워크 컨테이너를 참조하십시오.

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

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

로우레벨 사용 SageMaker APIs

OR를 사용하고 저수준을 사용하여 이기종 클러스터로 교육 작업 요청을 제출하려는 경우 다음 참조를 SageMaker APIs 참조하십시오. AWS Command Line Interface AWS SDK for Python (Boto3) API

이기종 클러스터를 사용한 분산 훈련

SageMaker Estimator 클래스의 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 데이터 병렬 라이브러리 사용

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 데이터 병렬 라이브러리를 사용할 때는 인스턴스 그룹이 라이브러리가 지원하는 인스턴스 유형으로 구성되어 있는지 확인하십시오.

SageMaker 데이터 병렬 라이브러리에 대한 자세한 내용은 SageMaker 데이터 병렬 훈련을 참조하십시오.

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

PyTorch
from sagemaker.pytorch import PyTorch estimator = PyTorch( ... instance_groups=[instance_group_1, instance_group_2], distribution={ "smdistributed": { "modelparallel": { "enabled":True, "parameters": { ... # SageMaker 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 model parallel parameters } } }, "instance_groups": [instance_group_2] } )

SageMaker 모델 병렬 라이브러리에 대한 자세한 내용은 SageMaker 모델 병렬 훈련을 참조하십시오.

훈련 스크립트를 수정하여 인스턴스 그룹을 할당하세요.

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

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

교육 작업의 초기화 단계에서 인스턴스 그룹 정보를 쿼리합니다. SageMaker

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

다음과 같은 방법으로 인스턴스 그룹 정보를 검색할 수 있습니다.

(권장) 교육 툴킷으로 인스턴스 그룹 정보 읽기 SageMaker

SageMaker 교육 툴킷 라이브러리가 제공하는 환경 Python 모듈을 사용하십시오. 툴킷 라이브러리는 TensorFlow 및 PyTorch 의 SageMaker 프레임워크 컨테이너에 사전 설치되어 있으므로 사전 빌드된 컨테이너를 사용할 때 추가 설치 단계가 필요하지 않습니다. 교육 스크립트의 코드 변경 횟수를 줄이면서 SageMaker 환경 변수를 검색하려면 이 방법을 사용하는 것이 좋습니다.

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— 추정기 클래스의 distribution 파라미터에 할당된 인스턴스 그룹 목록을 반환합니다. SageMaker

  • env.distribution_hosts— SageMaker 추정기 클래스의 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))

고려 사항

이기종 클러스터 기능을 사용할 경우 다음 항목을 고려합니다.

  • 모든 인스턴스 그룹은 동일한 도커 이미지와 훈련 스크립트를 공유합니다. 따라서 어떤 인스턴스 그룹에 속하는지 감지하고 그에 따라 실행을 분기하도록 훈련 스크립트를 수정해야 합니다.

  • 로컬 모드에서는 이기종 클러스터 기능이 지원되지 않습니다. SageMaker

  • 이기종 클러스터 교육 작업의 Amazon CloudWatch 로그 스트림은 인스턴스 그룹별로 그룹화되지 않습니다. 로그를 통해 어떤 노드가 어떤 그룹에 속하는지 파악해야 합니다.

  • 이기종 클러스터 기능은 및 프레임워크 추정기 클래스를 통해 사용할 수 있습니다. SageMaker PyTorchTensorFlow 지원되는 프레임워크는 PyTorch v1.10 이상 및 v2.6 이상입니다. TensorFlow 사용 가능한 프레임워크 컨테이너, 프레임워크 버전, Python 버전의 전체 목록을 찾으려면 AWS Deep Learning Container GitHub 저장소의 SageMaker 프레임워크 컨테이너를 참조하십시오.

  • 분산 훈련 전략은 한 인스턴스 그룹에만 적용할 수 있습니다.

예제, 블로그, 사례 연구

다음 블로그에서는 SageMaker 이기종 클러스터 교육 사용에 대한 사례 연구를 설명합니다.