왜 분산 학습이 필요한가?
딥러닝 모델의 크기와 학습 데이터의 양이 증가하면서, 단일 GPU로는 학습 시간이 수일에서 수주까지 걸릴 수 있습니다. 분산 학습(Distributed Training) 은 여러 GPU 또는 여러 노드에 학습을 분산하여 학습 시간을 크게 단축 합니다.💡 비유: 1,000페이지 책을 번역할 때, 한 명이 하면 100일 걸리지만, 10명이 나누어 하면 10일이면 됩니다. 분산 학습도 마찬가지로, 데이터와 연산을 여러 GPU에 나누어 병렬로 처리합니다.
분산 학습 전략
| 전략 | 설명 | 적합한 상황 |
|---|---|---|
| Data Parallelism | 같은 모델을 여러 GPU에 복제하고, 데이터를 분할하여 학습합니다 | 대부분의 경우 (모델이 단일 GPU에 들어갈 때) |
| Model Parallelism | 모델 자체를 여러 GPU에 나누어 저장합니다 | 모델이 단일 GPU 메모리보다 클 때 |
| Pipeline Parallelism | 모델 레이어를 파이프라인으로 분할합니다 | 매우 큰 모델 (수십 B 파라미터 이상) |
TorchDistributor 사용법
TorchDistributor 는 Databricks ML Runtime에서 PyTorch 분산 학습을 쉽게 실행할 수 있게 해주는 도구입니다. Spark 클러스터의 GPU를 자동으로 감지하고, 분산 학습 환경을 설정합니다.기본 사용법
TorchDistributor 주요 파라미터
| 파라미터 | 설명 | 기본값 |
|---|---|---|
num_processes | 분산 학습에 사용할 총 프로세스(GPU) 수입니다 | (필수) |
local_mode | True: 단일 노드 내 멀티 GPU, False: 멀티 노드 | True |
use_gpu | GPU 사용 여부입니다 | True |
local_mode 설정 가이드
| 설정 | 동작 | 적합한 상황 |
|---|---|---|
local_mode=True | Driver 노드의 GPU만 사용합니다 | 단일 노드에 여러 GPU가 있을 때 |
local_mode=False | Worker 노드의 GPU를 모두 사용합니다 | 여러 노드에 걸쳐 분산할 때 |
DeepSpeed 연동
DeepSpeed 는 Microsoft가 개발한 분산 학습 최적화 라이브러리로, 대규모 모델 학습 시 메모리 효율을 크게 개선합니다.DeepSpeed ZeRO 단계
| 단계 | 분산 대상 | 메모리 절감 | 설명 |
|---|---|---|---|
| ZeRO-1 | Optimizer States | ~4x | 옵티마이저 상태만 분산합니다 |
| ZeRO-2 | + Gradients | ~8x | 그래디언트도 분산합니다 |
| ZeRO-3 | + Parameters | ~Nx | 모델 파라미터까지 분산합니다 |
DeepSpeed 설정 파일 (ds_config.json)
TorchDistributor + DeepSpeed
Horovod
Horovod 는 Uber가 개발한 분산 학습 프레임워크로, MPI 기반의 올-리듀스(All-Reduce) 알고리즘을 사용합니다.💡 TorchDistributor vs Horovod: 새로운 프로젝트에서는 TorchDistributor(PyTorch DDP 기반)를 권장합니다. Horovod는 기존 Horovod 코드를 Databricks로 마이그레이션할 때 유용합니다.
멀티 GPU / 멀티 노드 설정
클러스터 설정 예시
분산 학습 규모별 가이드
| 모델 크기 | 권장 구성 | 분산 전략 |
|---|---|---|
| 소형 (~1B params) | 단일 노드, 1~4 GPU | Data Parallelism (DDP) |
| 중형 (1B~7B) | 1 | DDP + Mixed Precision |
| 대형 (7B~70B) | 4 | DeepSpeed ZeRO-3 |
| 초대형 (70B+) | 8+ 노드, 64+ GPU | DeepSpeed ZeRO-3 + Offloading |
MLflow 연동
분산 학습에서도 MLflow를 활용하여 실험을 추적할 수 있습니다.현업 사례: 분산 학습을 시작했는데 단일 GPU보다 느린 이유
“GPU 4개면 4배 빠르겠지?” — 현업에서 가장 흔한 오해입니다. 분산 학습이 오히려 느려지는 사례를 구체적으로 살펴보겠습니다.사례: 이미지 분류 모델 학습
왜 이런 일이 벌어지는가 — 분산 학습의 오버헤드
분산이 항상 빠르지 않은 경우
| 상황 | 이유 | 권장 |
|---|---|---|
| 모델이 작을 때(<100M params) | 연산 시간 < 통신 시간 | 단일 GPU 사용 |
| 데이터가 적을 때(<10GB) | GPU가 놀게 됨 (데이터 부족) | 단일 GPU 사용 |
| 배치 크기를 키울 수 없을 때 | 큰 배치에서 학습 불안정 | 단일 GPU + gradient accumulation |
| 노드 간 네트워크가 느릴 때 | All-Reduce 병목 | 단일 노드 멀티 GPU (NVLink) |
| I/O 바운드 학습 | 데이터 로딩이 병목 | 데이터 파이프라인 최적화 먼저 |
분산 학습이 꼭 필요한 경우 — 모델 크기 기준
💡 현업에서는 이렇게 합니다: 분산 학습이 의미 있으려면 연산 시간이 통신 시간을 압도 해야 합니다. 이것은 모델이 크거나 데이터가 많을 때 성립합니다.
| 모델 크기 | 데이터 규모 | 분산 필요? | 이유 |
|---|---|---|---|
| <100M params | <10GB | 아니오 | 단일 GPU에서 1시간 이내 완료 |
| 100M~1B params | 10~100GB | 선택적 | 학습 시간이 4시간+ 이면 분산 고려 |
| 1B~7B params | 100GB+ | 예 (Data Parallel) | 단일 GPU에서 수일~수주 소요 |
| 7B+ params | 관계없음 | 예 (필수) | 단일 GPU 메모리에 모델이 안 들어감 |
| 70B+ params | 관계없음 | 예 (Model + Pipeline) | DeepSpeed ZeRO-3 또는 FSDP 필수 |
분산 학습 성능을 최대화하는 실전 팁
⚠️ 현업에서는 이렇게 합니다: 분산 학습을 시작하기 전에 반드시 단일 GPU에서 프로파일링 을 합니다.torch.profiler로 연산 시간, 데이터 로딩 시간, 유휴 시간을 측정하세요. 데이터 로딩이 병목이면 GPU를 더 추가해도 의미가 없습니다. 먼저num_workers를 늘리고pin_memory=True를 설정하세요.
💡 비용 최적화 팁: Spot/Preemptible 인스턴스를 사용하면 GPU 비용을 60~70% 절약할 수 있습니다. 단, 30분~1시간마다 체크포인트를 저장 해야 합니다. Spot 인스턴스가 회수되면 마지막 체크포인트부터 재시작합니다. 체크포인트 없이 12시간 학습하다가 11시간째에 회수되면 11시간의 GPU 비용이 증발합니다.
정리
| 핵심 개념 | 설명 |
|---|---|
| TorchDistributor | Databricks에서 PyTorch 분산 학습을 간편하게 실행하는 도구입니다 |
| Data Parallelism | 모델을 복제하고 데이터를 분할하여 병렬 학습하는 가장 일반적인 전략입니다 |
| DeepSpeed | ZeRO 최적화로 대규모 모델의 메모리 효율을 크게 개선합니다 |
| Horovod | MPI 기반 All-Reduce 분산 학습 프레임워크입니다 |
| local_mode | 단일 노드(True) vs 멀티 노드(False) 분산을 제어합니다 |