DeepSpeed를 사용한 대규모 모델 학습 가속

Hugging Face는 DeepSpeed의 Zero Redundancy Optimizer (ZeRO)를 accelerate 라이브러리에 통합하여, GPU 간 메모리 중복을 줄임으로써 대규모 모델을 보다 효율적으로 학습할 수 있게 했습니다. 이 통합을 통해 개발자는 메모리 부족(OOM) 오류를 피하고, 큰 코드 변경 없이 배치 크기를 늘릴 수 있습니다.

ZeRO 데이터 병렬 처리 이해

ZeRO(Zero Redundancy Optimizer)는 데이터 병렬 처리 중 메모리 사용량을 최적화하기 위해 학습 상태를 사용 가능한 GPU에 걸쳐 샤딩합니다. 프레임워크는 모델 학습의 메모리 발자국을 줄이기 위해 여러 단계로 동작합니다:

  • Stage 1: 옵티마이저 상태를 데이터 병렬 워커/GPU에 걸쳐 샤딩합니다.
  • Stage 2: 옵티마이저 상태와 그래디언트를 워커/GPU에 걸쳐 샤딩합니다.
  • Stage 3: 옵티마이저 상태, 그래디언트, 모델 파라미터를 워커/GPU에 걸쳐 샤딩합니다.
  • Optimizer Offload: Stage 2를 확장하여 그래디언트와 옵티마이저 상태를 CPU 또는 디스크로 오프로드합니다.
  • Param Offload: Stage 3을 확장하여 모델 파라미터를 CPU 또는 디스크로 오프로드합니다.

Accelerate를 통한 코드 없는 통합

사용자는 accelerate config 명령과 Accelerate DeepSpeed 플러그인을 사용하여 훈련 코드를 수정하지 않고 DeepSpeed ZeRO Stage-2를 활용할 수 있습니다.

두 개의 24GB NVIDIA Titan RTX GPU를 사용해 DeBERTa-v2-xlarge-mnli 모델(9억 파라미터)을 파인튜닝한 벤치마크에서 DeepSpeed ZeRO Stage-2는 Distributed Data Parallel(DDP)보다 크게 우수한 성능을 보였습니다:

방법 최대 배치 크기 에포크당 학습 시간 (초) 에포크당 평가 시간 (초) F1 점수 정확도
DDP 8 103.57 2.04 0.931 0.904
DeepSpeed ZeRO Stage 2 40 28.98 1.79 0.936 0.912

DeepSpeed는 DDP에 비해 최대 배치 크기 5배 증가전체 훈련 시간 약 3.5배 가속을 가능하게 했으며, 성능 지표는 감소하지 않았습니다.

DeepSpeed 설정 파일을 활용한 고급 구성

보다 세밀한 제어를 위해 사용자는 accelerate config를 통해 DeepSpeed 설정 JSON 파일을 제공할 수 있습니다. 설정 파일이 옵티마이저와 스케줄러를 정의할 경우, 사용자는 표준 PyTorch 옵티마이저와 스케줄러를 accelerate.utils.DummyOptimaccelerate.utils.DummyScheduler로 교체하여 최소한의 코드 수정만 하면 됩니다.

MuDoConv 데이터셋에서 BlenderBot-400M-distill 모델에 이 방식을 적용한 테스트 결과, DeepSpeed ZeRO Stage-2는 DDP의 100에 비해 최대 배치 크기 200을 허용했습니다. 이는 훈련 속도 1.44배 가속평가 속도 1.23배 가속을 가져왔습니다.

CPU/디스크 오프로드를 활용한 초대형 모델 학습

CPU 오프로드를 적용한 DeepSpeed ZeRO Stage-3은 배치 크기 1조차도 GPU 메모리에 들어가지 않는 모델의 학습을 가능하게 합니다.

단일 24GB NVIDIA Titan RTX GPU로 GPT-XL 모델(15억 파라미터)을 학습하는 테스트에서 DDP는 즉시 OOM 오류를 발생시켰습니다. 반면, 옵티마이저 상태, 그래디언트 및 파라미터를 CPU에 오프로드한 DeepSpeed ZeRO Stage-3은 배치 크기 16으로 학습을 성공적으로 수행했으며, 에포크당 6608.35초가 소요되었습니다:

방법 최대 배치 크기 에포크당 학습 시간 (초) 비고
DDP - - OOM 오류
DeepSpeed ZeRO Stage 3 16 6608.35 -

Sources