분산 학습 전략의 숨겨진 비밀 메모리와 통신량 예측하기
📝 원문 정보
- Title: Placement Semantics for Distributed Deep Learning A Systematic Framework for Analyzing Parallelism Strategies- ArXiv ID: 2601.02311
- 발행일: 2026-01-05
- 저자: Deep Pankajbhai Mehta
📝 초록
(이 논문은 분산 딥러닝에서 이론과 실무 간의 격차를 다룹니다. 700억 개의 파라미터를 가진 모델을 훈련시키는 데 필요한 메모리는 약 1,120GB로, 현재 GPU가 갖는 80GB 용량을 크게 초과합니다. 이를 해결하기 위해 데이터 병렬화, ZeRO/Fully Sharded Data Parallel (FSDP), 텐서 병렬화, 파이프라인 병렬화 및 전문병렬화와 같은 병렬화 전략들이 사용됩니다. 논문은 이러한 병렬화 전략의 구현을 통해 메모리와 통신 비용을 파악하고 이를 시스템적으로 분석하는 프레임워크를 제시합니다.)💡 논문 해설
1. **체계적인 배치 세미어틱스**: 이 논문은 병렬화 전략의 구현에 따른 메모리와 통신 비용을 시스템적으로 분석하기 위한 체계적인 프레임워크를 제시합니다. 이를 통해 각 상태(파라미터, 옵티마이저 상태, 그래디언트, 활성화)가 어떻게 배치되는지 정의하고, 메모리와 통신 비용을 계산할 수 있습니다.-
비용 파악: 병렬화 전략에 따른 메모리와 통신 비용을 파악하는 데 사용되는 규칙들을 제시합니다. 예를 들어 ZeRO Stage 3는 메모리를 140GB로 줄이지만, 통신 비용은 1.5배 증가한다는 것을 분석할 수 있습니다.
-
합성 계산: 병렬화 전략을 결합하여 새로운 시스템을 만들 수 있는 합성 계산 방법을 제공합니다. 이를 통해 복잡한 병렬화 전략의 효과를 예측하고 최적화할 수 있습니다.
📄 논문 발췌 (ArXiv Source)
우리는 분산 딥러닝에서 이론과 실무 간의 격차를 다룹니다. 700억 개의 파라미터를 가진 모델을 훈련시키는 데 필요한 메모리는 약 1,120GB로, 현재 GPU가 갖는 80GB 용량을 크게 초과합니다. 실무자들은 데이터 병렬화 (DP), ZeRO/Fully Sharded Data Parallel (FSDP), 텐서 병렬화 (TP), 파이프라인 병렬화 (PP) 및 전문병렬화와 같은 병렬화 전략을 사용하여 이 상태를 여러 장치에 분산시킵니다.
각 전략은 구현을 통해 설명됩니다: 통신 작업, 데이터 구조 레이아웃, 실행 시간 최적화. 이러한 구현 중심의 접근 방식으로 다음 기본적인 질문들을 답변하기가 어렵습니다:
-
ZeRO Stage 2와 Stage 3는 정확히 어떤 점에서 다릅니까?
-
새로운 구성에 대해 각 장치가 사용하는 메모리는 얼마나 될까요?
-
텐서 병렬화와 파이프라인 병렬화를 안전하게 결합할 수 있는 시점은 언제입니까?
-
분산 학습을 단일 장치 결과와 일치시키기 위해 어느 성질들이 필요합니까?
우리의 프레임워크는 이러한 질문에 정확히 답변합니다. 예를 들어, 우리는 ZeRO Stage 2와 Stage 3가 정확히 하나의 배치 선택 (파라미터: 복제 vs. 셰이딩-위드-게더)에서 다름을 보여줍니다. 이 차이점만으로도 단일 장치당 메모리를 1,120GB에서 140GB로 줄이는 $`8\times`$의 감소와 통신 비용이 $`1.5\times`$ 증가한다는 것을 유도할 수 있습니다. 이러한 예측은 원래 ZeRO 논문과 정확히 일치합니다.
우리의 기여
우리는 배치 세미어틱스라는 체계적인 프레임워크를 도입하여 이러한 질문에 답변합니다. 이 프레임워크는 다음 세 가지 아이디어 위에서 구성됩니다:
훈련 상태가 기본 단위입니다. 우리는 모든 훈련 구성이 관리하는 네 가지 상태를 식별합니다: 파라미터 $`\Theta`$, 옵티마이저 상태 $`\Omega`$, 그래디언트 $`G`$ 및 활성화 $`A`$. 이들은 분산 학습의 기본적인 객체들입니다.
배치는 사양입니다. 각 상태에 대해, 그 배치를 정의합니다: 어떤 장치들이 어떤 부분을 가지고 있는지. 우리는 세밀한 의미를 갖는 다섯 가지 배치 모드를 형식화합니다: 복제 ($`R`$), 셰이딩($`S`$), 셰이딩 위드 게더($`S^*`$), 물리화($`M`$) 및 오프로드($`O`$). 이 다섯 가지 모드는 셰이딩의 두 가지 변형에서 비롯됩니다: 각 장치가 단순히 그 로컬 셰이드만을 사용하는 순수한 셰이딩과, 셰이드들이 일시적으로 재조립되어 계산에 사용되는 셰이딩 위드 게더. 이 차이는 ZeRO Stage 2 (그래디언트의 순수 셰이딩)와 Stage 3 (파라미터의 셰이딩 위드 게더)를 구분하는 데 중요합니다.
비용은 배치로부터 유도됩니다. 주어진 배치 사양으로부터 메모리와 통신 비용을 형식화된 규칙을 통해 유도할 수 있습니다. 이는 우리의 핵심 기술 결과입니다: 리소스 예측에 필요한 구현 세부사항이 없습니다.
무엇이 새로운가?
이전 연구는 특정 시스템들을 설명하지만, 우리는 시스템 간의 추론을 가능하게 하는 체계적인 토대를 제공합니다:
-
정확한 모드 정의를 갖춘 체계적인 배치 세미어틱스 (섹션 3)
-
사양으로부터 메모리와 통신 비용을 유도하는 규칙 (섹션 4)
-
필요성과 충분성을 증명한 정확성 조건 (섹션 5)
-
전략들을 결합하기 위한 합성 계산 (섹션 6)
이전 연구는 시스템을 설명하지만, 우리는 그들이 인스턴스인 체계적인 프레임워크를 제공합니다. 이 관계는 계산 복잡도 이론과 특정 알고리즘 사이의 유사점과 같습니다: 복잡도 이론은 모든 알고리즘을 분석하기 위한 도구를 제공하며, 알고리즘 논문은 특정 해결책을 설명합니다.
검증. 우리는 ZeRO 논문에서 발표된 결과와 우리의 프레임워크를 검증합니다. 우리의 유도 규칙은 원래 저자들이 보고한 것과 동일한 메모리 감소($`8\times`$) 및 통신 오버헤드($`1.5\times`$)를 예측하여 배치 사양이 실제 시스템 행동을 포착한다는 것을 확인합니다 (섹션 7).
배경
우리는 표기법을 설정하고 훈련 중 메모리를 소비하는 요소들을 검토합니다. 우리는 표준 용어를 사용합니다: FP16과 FP32는 각각 16비트와 32비트 부동 소수점 형식을 나타냅니다; SGD는 확률적 경사 하강법을 의미하며, NVMe는 비휘발성 메모리 익스프레스 저장 장치를 나타냅니다.
| 상태 | 개수 | 정밀도 | 메모리 |
|---|---|---|---|
| 파라미터 $`\Theta`$ | $`P`$ | FP16 | 140 GB |
| 마스터 가중치 | $`P`$ | FP32 | 280 GB |
| 옵티마이저 $`\Omega`$ (Adam $`m`$, $`v`$) | $`2P`$ | FP32 | 560 GB |
| 그래디언트 $`G`$ | $`P`$ | FP16 | 140 GB |
| 모델 상태 총합 | 1,120 GB |
70B 파라미터 모델을 Adam 옵티마이저와 혼합 정밀도 훈련으로 훈련시키는 데 필요한 메모리 요구 사항. ZeRO 논문의 계산에 따르면 마스터 가중치를 포함합니다. 유도 목적으로, 우리는 마스터 가중치를 옵티마이저 상태와 함께 그룹화하여 $`|\Omega| = 12P`$ 바이트 총합을 제공합니다.
훈련 상태
훈련 단계는 데이터 배치를 사용하여 파라미터 $`\Theta_t`$를 $`\Theta_{t+1}`$로 변환합니다. 이를 위해 네 개의 상태 텐서를 유지해야 합니다.
파라미터 $`\Theta \in \mathbb{R}^P`$는 모델 가중치입니다. 레이어 수 $`L`$와 숨겨진 차원 $`H`$가 있는 트랜스포머의 경우, 파라미터 개수는 대략적으로 $`P \approx 12LH^2`$ 입니다.[^1] 각 주의력 레이어는 쿼리, 키, 값, 출력 프로젝션으로 구성되어 $`4H^2`$ 파라미터를 기여하고 각 피드 포워드 레이어는 두 개의 행렬을 통해 $`8H^2`$ 파라미터를 기여합니다.
옵티마이저 상태 $`\Omega`$는 옵티마이저가 유지하는 보조 값을 포함합니다. Adam은 첫 번째 모멘트 $`m \in \mathbb{R}^P`$와 두 번째 모멘트 $`v \in \mathbb{R}^P$를 저장하여 $`|\Omega| = 2P`$. 이들은 수치 안정성을 위해 FP32로 저장됩니다.
그래디언트 $`G \in \mathbb{R}^P`$는 역전파 동안 계산된 도함수 $`\nabla_\Theta \mathcal{L}`$입니다.
활성화 $`A`$는 앞쪽 패스에서 얻은 중간 값들로, 그래디언트 계산을 위해 필요합니다. 그 크기는 배치 크기 $`B`$, 시퀀스 길이 $`S`$ 및 아키텍처 세부 사항에 따라 달라집니다.
메모리 회계
표 1은 ZeRO 논문의 혼합 정밀도 계산에 따른 구체적인 메모리 요구 사항을 보여줍니다. 핵심 관찰은 옵티마이저 상태가 주도한다는 것입니다. Adam은 $`2P`$ 값들을 FP32로 저장하고, 이는 $`8P`$ 바이트와 비교하여 FP16 파라미터의 $`2P`$ 바이트보다 큽니다. 혼합 정밀도 훈련 안정성을 위해 필요한 FP32 마스터 가중치를 포함하면 총합은 16바이트가 됩니다.
비고 1 (메모리 회계 관례). 본 논문에서는 ZeRO 논문의 1개 파라미터당 16바이트 규칙을 따릅니다: 2바이트(FP16 파라미터) + 2바이트(FP16 그래디언트) + 4바이트(FP32 마스터 가중치) + 8바이트(FP32 옵티마이저 상태). 우리가 $`|\Theta|`$, $`|\Omega|`$, $`|G|`$를 쓸 때, 바이트 단위의 메모리 발자국을 의미합니다. 구체적으로: $`|\Theta| = 2P`$ 바이트, $`|G| = 2P`$ 바이트, 그리고 $`|\Omega| = 12P`$ 바이트 (마스터 가중치 + Adam 상태).
통신 기본 요소
분산 학습은 집합적 통신 작업을 사용합니다. 우리는 표준 비용 모델을 사용합니다. 장치 수 $`N`$, 텐서 크기 $`|T|`$에 대해:
All-Reduce는 모든 장치에서 $`T`$를 집계(합산)하고 결과를 모든 장치에 분배합니다. 링 알고리즘을 사용하면 각 장치가 $`2 \cdot \frac{N-1}{N} \cdot |T|`$ 바이트를 보내고 받습니다.
Reduce-Scatter는 $`T`$를 집계하고 불연속 셰이드들을 분배합니다. 장치 $`i`$는 합산의 셰이드 $`i`$를 받습니다. 비용: 각 장치당 $`\frac{N-1}{N} \cdot |T|`$ 바이트.
All-Gather는 셰이드들을 수집하고 완전한 텐서를 모든 장치에 분배합니다. 비용: 각 장치당 $`\frac{N-1}{N} \cdot |T|`$ 바이트.
배치 세미어틱스
현재 체계적인 프레임워크를 제시하겠습니다. 먼저 직관을 제공한 후 정확한 정의를 제공합니다.
직관
$`N = 8`$ 장치에서 훈련하는 경우, 파라미터 $`\Theta`$에 대한 선택 사항은 다음과 같습니다:
-
모든 장치가 전체 복사본을 저장(데이터 병렬화)
-
각 장치가 $`1/8`$의 파라미터를 저장(ZeRO Stage 3)
-
어떤 장치도 파라미터를 지속적으로 보관하지 않고 필요할 때마다 수집(FSDP와 적극적인 셰이딩).
각 선택은 다른 메모리 및 통신 의미를 갖습니다. 이러한 선택을 배치 모드로 정식화합니다.
배치 모드
정의 1 (배치 모드). $`X`$는 크기 $`|X|`$를 가진 상태 텐서가 $`N`$ 장치에 분산되어 있습니다. 각 장치 $`i`$는 배치 모드 $`\pi`$가 지정한 $`X`$의 어떤 부분을 지속적으로 저장합니다. 다섯 가지 모드를 정의합니다:
*복제 ($`R`$): 모든 장치가 전체 텐서를 저장.
\begin{equation}
\pi_R(X, i) = X \quad \text{for all } i \in \{0, \ldots, N-1\}
\end{equation}
```*
***셰이딩 ($`S`$):** 텐서는 $`N`$ 개의 연속 셰이드로 분할됩니다. 장치 $`i`$는 셰이드 $`i`$를 저장합니다.
``` math
\begin{equation}
\pi_S(X, i) = X\left[\frac{i \cdot |X|}{N} : \frac{(i+1) \cdot |X|}{N}\right]
\end{equation}
```*
***셰이딩 위드 게더 ($`S^*`$):** $`S`$와 동일하지만 사용 전에 전체 텐서를 All-Gather를 통해 재구성하고, 사용 후에는 비로컬 부분을 삭제합니다. 이는 ZeRO-3/FSDP 파라미터 처리를 캡처합니다.
``` math
\begin{equation}
\pi_{S^*}(X, i) = X\left[\frac{i \cdot |X|}{N} : \frac{(i+1) \cdot |X|}{N}\right] \text{ (지속적인)}, \quad X \text{ (사용 중 일시적)}
\end{equation}
```*
***물리화 ($`M`$):** 어떤 장치도 $`X`$를 지속적으로 저장하지 않습니다. $`X`$가 필요할 때마다 다른 상태에서 재구성하고 사용한 후 삭제합니다. 이는 활성화와 같은 중간 값을 적용합니다.
``` math
\begin{equation}
\pi_M(X, i) = \emptyset \quad \text{(지속적인 저장)}
\end{equation}
```*
***오프로드 ($`O`$):** 텐서는 CPU 메모리 또는 NVMe에 저장되어 있으며 필요할 때 GPU로 전송됩니다.
``` math
\begin{equation}
\pi_O(X, i) = \emptyset \quad \text{(GPU 메모리)}
\end{equation}
```*
</div>
<div class="example">
**예 1** (데이터 병렬화). *데이터 병렬화(DP)에서 모든 모델 상태는 복제됩니다: $`\pi_\Theta = R`$, $`\pi_\Omega = R`$, $`\pi_G = R`$. 각 장치가 전체 파라미터, 전체 옵티마이저 상태 및 전체 그래디언트를 보유합니다. 로컬 그래디언트 계산 후 All-Reduce를 통해 그래디언트를 장치 간 동기화합니다.*
</div>
<div class="example">
**예 2** (ZeRO Stage 3). *ZeRO Stage 3는 모든 것을 셰이딩합니다: $`\pi_\Theta = S^*`$, $`\pi_\Omega = S`$, $`\pi_G = S`$. 파라미터는 장치들 사이에 분산되어 있으며, 각 레이어의 계산 전에는 전체 파라미터를 All-Gather로 재구성하고 사용 후 삭제합니다. 옵티마이저 상태와 그래디언트는 계속 셰이딩됩니다.*
</div>
<div id="tab:placements">
| 전략 | $`\pi_\Theta`$ | $`\pi_\Omega`$ | $`\pi_G`$ | $`\pi_A`$ |
|:---|:--:|:--:|:--:|:--:|
| 데이터 병렬화 (DP) | $`R`$ | $`R`$ | $`R`$ | $`R`$ |
| ZeRO Stage 1 | $`R`$ | $`S`$ | $`R`$ | $`R`$ |
| ZeRO Stage 2 | $`R`$ | $`S`$ | $`S`$ | $`R`$ |
| ZeRO Stage 3 / FSDP | $`S^*`$ | $`S`$ | $`S`$ | $`R`$ |
| ZeRO-오프로드 | $`O`$ | $`O`$ | $`S`$ | $`R`$ |
| 텐서 병렬화 (TP, 레이어 내) | $`S`$ | $`S`$ | $`S`$ | $`S`$ |
| 파이프라인 병렬화 (PP, 레이어 간) | $`S`$ | $`S`$ | $`S`$ | $`R`$ |
공통적인 병렬화 전략에 대한 배치 사양. 텐서 및 파이프라인 병렬화의 경우, 배치는 각 레이어 또는 스테이지별로 적용됩니다. $`S^*`$은 ZeRO-3/FSDP에서 사용되는 계산 전 셰이딩 위드 게더를 나타냅니다. DP = 데이터 병렬화, TP = 텐서 병렬화, PP = 파이프라인 병렬화.
</div>
<figure id="fig:modes" data-latex-placement="t">
<figcaption>다섯 가지 배치 모드. 위: 각 장치의 GPU 메모리 비용 (<span class="math inline"><em>s</em></span> = 텐서 크기, <span
class="math inline"><em>N</em></span> = 장치 수). 아래: 공통적인 전략에서 사용 예. <span
class="math inline"><em>S</em><sup>*</sup></span> (셰이딩 위드 게더)는 ZeRO-3/FSDP의 핵심 혁신입니다: 파라미터는 저장을 위해 셰이딩되지만, 계산을 위해 일시적으로 재조립됩니다.</figcaption>
</figure>
## 배치 사양
<div class="definition">
**정의 2** (배치 사양). *배치 사양은 튜플 $`\Pi = (\pi_\Theta, \pi_\Omega, \pi_G, \pi_A)`$입니다. 여기서 각각의 $`\pi_X \in \{R, S, S^*, M, O\}`$는 상태 $`X`$에 대한 배치 모드를 지정합니다.*
</div>
병렬화 전략은 그 배치 사양으로 완전히 결정됩니다. 표 <a href="#tab:placements" data-reference-type="ref"
data-reference="tab:placements">2</a>는 알려진 전략들의 사양을 보여주며, 도표 <a href="#fig:modes" data-reference-type="ref"
data-reference="fig:modes">1</a>은 다섯 가지 모드와 그 메모리 비용을 설명합니다.
<div class="remark">
**비고 2.** *물리화 모드 ($`M`$)는 표 <a href="#tab:placements" data-reference-type="ref"
data-reference="tab:placements">2</a>에 나타나지 않습니다. 이는 공통적인 전략들이 모든 상태를 지속적으로 보관하기 때문입니다. 그러나 $`M`$은 활성화 체크포인팅을 모델링하는 데 사용할 수 있습니다. 여기서 활성화는 저장 대신 재계산됩니다.*
</div>
# 유도 규칙
현재 우리의 주요 기술적 기여를 제시합니다: 배치 사양으로부터 메모리와 통신 비용을 유도하는 규칙들입니다.
## 준비사항
<div id="def:sunit" class="definition">
**정의 3** (재구성 단위). *$`s_{\text{unit}}`$는 셰이딩 위드 게더 작업 중에 독립적으로 재구성될 수 있는 가장 작은 단위 크기를 나타냅니다. 트랜스포머 모델의 경우 이는 일반적으로 하나의 레이어를 나타냅니다: $`s_{\text{unit}} = 12H^2 \cdot \text{bytes\_per\_param}`$ 표준 트랜스포머 레이어의 숨겨진 차원 $`H`$. $`s_{\text{unit}}`$의 선택은 메모리와 통신 세분화를 교환하는 구현 결정입니다.*
</div>
## 메모리 유도
<div id="thm:memory" class="theorem">
**정리 1** (배치로부터 메모리). *$`\Pi = (\pi_\Theta, \pi_\Omega, \pi_G, \pi_A)`$는 $`N`$ 장치에 대한 배치 사양입니다. 각 장치의 GPU 메모리는 다음과 같습니다:
``` math
\begin{equation}
M(\Pi) = \mu(\pi_\Theta, |\Theta|) + \mu(\pi_\Omega, |\Omega|) + \mu(\pi_G, |G|) + \mu(\pi_A, |A|)
\end{equation}
여기서 $`\mu : \{R, S, S^*, M, O\} \times \mathbb{R}^+ \to \mathbb{R}^+`$는 다음과 같이 정의됩니다:
\begin{align}
\mu(R, s) &= s \\
\mu(S, s) &= s/N \\
\mu(S^*, s) &= s/N + s_{\text{unit}} \\
\mu(M, s) &= s_{\text{unit}} \\
\mu(O, s) &= 0
\end{align}
여기서 $`s_{\text{unit}}`$는 정의 3에서 정의됩니다.*
증명. 우리는 정의 1로부터 각 케이스를 증명합니다.
케이스 $`R`$: 방정식 (1)에 따르면, $`\pi_R(X, i) = X`$입니다. 모든 장치가 전체 텐서를 보관하므로 각 장치의 메모리는 $`|X| = s`$입니다.
케이스 $`S`$: 방정식 (2)에 따르면, 장치 $`i`$는 $`X[i|X|/N : (i+1)|X|/N]`$를 보관하며 이 크기는 $`|X|/N = s/N`$입니다.
*케이스 $`S^ # Limit to 15k chars for stability