기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
1단계: SageMaker의 분산 모델 병렬 라이브러리를 사용하여 자체 훈련 스크립트 수정
이 섹션에서는 Amazon SageMaker AI 모델 병렬 처리 라이브러리의 핵심 기능을 사용하도록 훈련 스크립트를 사용자 지정하는 방법을 알아봅니다. 라이브러리 고유의 API 함수 및 파라미터를 사용하려면 SageMaker Python SDK 설명서의 SageMaker 모델 병렬 라이브러리 API
이 섹션에 제공된 훈련 스크립트 예제는 단순화되었으며 라이브러리를 사용하기 위해 수행해야 하는 필수 변경 사항을 강조하도록 설계되었습니다. SageMaker 모델 병렬화 라이브러리와 함께 TensorFlow 또는 PyTorch 훈련 스크립트를 사용하는 방법을 보여주는 실행 가능한 엔드-투-엔드 노트북 예제는 Amazon SageMaker AI 모델 병렬 처리 라이브러리 v2 예제을/를 참조하세요.
SageMaker 모델 병렬화 라이브러리를 사용하여 훈련 스크립트 모델을 분할합니다
훈련 스크립트를 수정하여 모델 분할을 설정하는 방법에는 자동 분할 또는 수동 분할이라는 두 가지 방법이 있습니다.
자동 모델 분할
SageMaker의 모델 병렬화 라이브러리를 사용하면 자동 모델 파티션이라고도 하는 자동 모델 분할을 활용할 수 있습니다. 라이브러리는 메모리 균형을 유지하고 디바이스 간 통신을 최소화하며 성능을 최적화하는 파티셔닝 알고리즘을 사용합니다. 속도 또는 메모리를 최적화하도록 자동 파티셔닝 알고리즘을 구성할 수 있습니다.
또는 수동 모델 분할을 사용할 수 있습니다. 모델 아키텍처에 익숙하고 모델을 효율적으로 분할하는 방법을 잘 아는 경우가 아니라면 자동 모델 분할을 사용하는 것이 좋습니다.
작동 방법
자동 파티셔닝은 smp.step
로 데코레이트된 함수를 처음 호출하는 첫 번째 훈련 단계에서 발생합니다. 이 호출 중에 라이브러리는 GPU 메모리 제한을 피하기 위해 먼저 CPU RAM에 대한 모델 버전을 구성한 다음 모델 그래프를 분석하고 파티셔닝을 결정합니다. 이 결정에 따라 각 모델 파티션을 GPU에 로드한 다음 첫 번째 단계만 실행합니다. 이러한 분석 및 파티셔닝 단계 때문에 첫 번째 훈련 단계는 더 오래 걸릴 수 있습니다.
두 프레임워크 중 하나에서 라이브러리는 AWS 인프라에 최적화된 자체 백엔드를 통해 디바이스 간의 통신을 관리합니다.
자동 파티션 디자인은 프레임워크의 특성에 맞게 조정되며 라이브러리는 각 프레임워크에서 보다 자연스러운 상세한 수준에서 파티셔닝을 수행합니다. 예를 들어 TensorFlow에서는 각 특정 작업을 서로 다른 디바이스에 할당할 수 있지만 PyTorch에서는 할당이 모듈 수준에서 수행되며 각 모듈은 여러 작업으로 구성됩니다. 다음 섹션에서는 각 프레임워크의 설계 세부 사항을 검토합니다.
첫 번째 훈련 단계에서 모델 병렬화 라이브러리는 모델 그래프를 구성하고 텐서 및 파라미터 형태를 결정하기 위한 추적 단계를 내부적으로 실행합니다. 이 추적 단계가 끝나면 라이브러리는 트리를 생성합니다. 트리는 모델에 중첩된 nn.Module
객체뿐만 아니라 추적에서 수집한 추가 데이터(예: 저장된 nn.Parameters
의 량, 각 nn.Module
의 실행 시간)로 구성됩니다.
그런 다음 라이브러리는 근본부터 이 트리를 탐색하여 각 nn.Module
을 디바이스에 할당하는 파티션 알고리즘을 실행합니다. 이 알고리즘은 컴퓨팅 부하(모듈 실행 시간으로 측정)와 메모리 사용(총 저장된 nn.Parameter
크기 및 활성화로 측정)의 균형을 맞춥니다. 여러 개의 nn.Modules
이 동일한 nn.Parameter
을 공유하는 경우 동일한 파라미터를 여러 버전으로 유지하지 않도록 이러한 모듈이 동일한 디바이스에 배치됩니다. 파티셔닝 결정이 내려지면 할당된 모듈과 가중치가 해당 디바이스에 로드됩니다.
PyTorch 훈련 스크립트에 smp.step
데코레이터를 등록하는 방법에 대한 지침은 PyTorch를 사용한 자동 분할을/를 참조하세요.
모델 병렬화 라이브러리는 훈련 가능한 변수의 크기와 그래프 구조를 분석하고 내부적으로 그래프 분할 알고리즘을 사용합니다. 이 알고리즘은 디바이스 간에 필요한 통신량을 최소화하기 위해 각 작업에 디바이스를 할당하는데, 여기에는 두 가지 제약이 따릅니다.
-
각 디바이스에 저장된 변수의 수 균형 조정
-
각 디바이스에서 실행되는 작업 수의 균형 조정
(Python SDK의 모델 병렬화 파라미터에서) optimize
를 위한 speed
를 지정하면 라이브러리는 각 디바이스의 연산과 tf.Variable
객체 수의 균형을 맞추려고 합니다. 그렇지 않으면 tf.Variables
의 전체 크기의 균형을 맞추려고 합니다.
파티셔닝 결정이 내려지면 라이브러리는 각 디바이스에서 실행해야 하는 서브그래프를 직렬화된 형태로 만들어 각 디바이스로 가져옵니다. 파티셔닝 중에 라이브러리는 동일한 tf.Variable
을 사용하는 작업과 동일한 Keras 계층에 속하는 작업을 동일한 디바이스에 배치합니다. 또한 TensorFlow에서 부과하는 코로케이션 제약도 고려합니다. 즉, 예를 들어 tf.Variable
을 공유하는 두 개의 Keras 계층이 있는 경우 이러한 계층에 속하는 모든 작업이 단일 디바이스에 배치됩니다.
PyTorch 훈련 스크립트에 smp.step
데코레이터를 등록하는 방법에 대한 지침은 TensorFlow를 사용한 자동 분할을/를 참조하세요.
프레임워크 간 자동 모델 분할 비교
TensorFlow에서 기본 계산 단위는 tf.Operation
이고, TensorFlow는 모델을 tf.Operation
의 DAG(유방향 비순환 그래프)로 나타내므로 모델 병렬화 라이브러리는 이 DAG를 파티션하여 각 노드가 하나의 기기로 이동하도록 합니다. 결정적으로, tf.Operation
객체에는 사용자 지정 가능한 속성이 충분히 풍부하며, 모든 모델이 해당 객체의 그래프로 구성된다는 점에서 보편적입니다.
반면에 PyTorch는 충분히 풍부하고 보편적인 동등한 작업 개념을 가지고 있지 않습니다. 이러한 특성을 가진 PyTorch의 계산 단위 중 가장 가까운 단위는 훨씬 더 높은 세분성 수준에 있는 nn.Module
입니다. 이것이 바로 PyTorch에서 라이브러리가 이 수준에서 파티셔닝을 수행하는 이유입니다.
수동 모델 분할
디바이스 간에 모델을 분할하는 방법을 수동으로 지정하려면 smp.partition
컨텍스트 관리자를 사용하세요. 수동 파티셔닝을 위한 컨텍스트 매니저를 설정하는 자세한 방법은 다음 페이지를 참조하세요.
수정 후 이 옵션을 사용하려면 2단계에서 SageMaker Python SDK의 프레임워크 추정기 클래스에서 auto_partition
을 False
로 지정하고 default_partition
을 정의해야 합니다. smp.partition
컨텍스트 관리자를 통해 파티션에 명시적으로 배치되지 않은 모든 작업은 default_partition
에서 실행됩니다. 이 경우 자동 분할 로직이 우회되고 각 작업은 사양에 따라 배치됩니다. 결과 그래프 구조를 기반으로 모델 병렬화 라이브러리는 파이프라인 실행 일정을 자동으로 생성합니다.