PyTorch DDP, Accelerate 및 Transformers Trainer를 활용한 분산 학습

Hugging Face는 PyTorch에서 분산 학습을 구현하기 위한 세 단계의 추상화 레벨을 상세히 제시합니다. 네이티브 Distributed Data Parallelism(DDP)에서 Accelerate 라이브러리, 최종적으로 Transformers Trainer API까지 순차적으로 진행함으로써, 개발자는 학습 루프에 대한 세밀한 제어와 분산 설정의 고수준 자동화 사이에서 선택할 수 있습니다.

네이티브 PyTorch 분산 데이터 병렬 처리 (DDP)

PyTorch DDP는 여러 GPU에 걸쳐 학습을 가능하게 합니다. 이는 단일 머신 내의 멀티‑GPU 환경이든, 여러 머신에 걸친 멀티‑노드 환경이든 동일하게 동작합니다. 모델을 각 GPU에 복제하고 loss.backward() 호출 시 모든 복제본의 그래디언트를 평균 내어 장치 간 가중치 일관성을 유지합니다.

네이티브 DDP를 구현하려면 여러 수동 설정 단계가 필요합니다:

  • Process Group Setup: 개발자는 setupcleanup 함수를 정의하여 프로세스 그룹을 초기화하고 해제해야 하며, 통신을 위해 MASTER_ADDRMASTER_PORT를 지정해야 합니다.
  • Model Wrapping: 모델을 DistributedDataParallel (DDP) 모듈로 감싸야 하며, 이 감싼 모델을 기반으로 옵티마이저를 선언해야 그래디언트가 올바르게 계산됩니다.
  • Execution: 스크립트는 일반적으로 torchrun 명령줄 모듈을 사용해 실행되며, 노드 수와 노드당 프로세스 수를 지정합니다.

🤗 Accelerate로 분산 학습 간소화

Accelerate는 pytorch.distributed 위에 얇은 래퍼를 제공하여, 동일한 코드를 단일 GPU, 다중 GPU, 혹은 TPU 환경에서 최소한의 변경만으로 실행할 수 있게 합니다. 수동 프로세스 그룹 설정이 필요 없으며, 장치 배치를 자동화합니다.

기술적 개선

Accelerate는 Accelerator 클래스를 도입하여 모델, 옵티마이저, 데이터 로더의 분산을 단일 호출 accelerator.prepare() 로 처리합니다. 이는 수동 .to(rank) 호출 및 DDP 래핑을 대체합니다.

또한 Accelerate는 커스텀 샘플러를 통해 메모리 효율성을 높입니다. 여러 장치에 전체 데이터 로더 복사본을 만들지 않고, 원본 데이터셋의 전체 복사본은 메모리에 하나만 존재하도록 하며, 데이터를 각 노드에 할당된 부분집합으로 나눕니다. 이 방식은 매우 큰 데이터셋을 학습할 때 메모리 폭증을 방지합니다.

노트북 통합

Jupyter Notebook에서 작업하는 사용자를 위해 Accelerate는 notebook_launcher 유틸리티를 제공합니다. 이를 통해 학습 함수를 전달하고 사용할 프로세스 수를 지정함으로써, 노트북 내에서 바로 다중 GPU 학습을 시작할 수 있습니다.

🤗 Trainer를 통한 고수준 추상화

Transformers Trainer API는 가장 높은 수준의 추상화를 제공하여, 분산 학습과 관련된 거의 모든 보일러플레이트 코드를 제거합니다. 사용자는 명시적인 학습 루프를 작성할 필요 없이, 내부에서 자동으로 분산 로직을 처리합니다.

Trainer를 사용하려면 개발자는 TrainingArguments 를 정의해 하이퍼파라미터를 관리하고, 필요에 따라 Trainer 를 서브클래싱하여 커스텀 compute_loss 함수를 구현합니다. 이후 Trainer 가 분산 시스템 전반에 걸친 학습 및 평가 과정을 자동으로 관리합니다. Accelerate 예시와 마찬가지로, Trainer 역시 notebook_launcher 와 통합되어 인터랙티브 환경에서 빠른 실험이 가능합니다.

Sources