以下は、[[H100]] クラスタ上で [[NeMo]]を用いて [[GPT-3]] を事前学習する際に、**モデルに関するメモリ量**(=「パラメータ」「勾配」「オプティマイザ状態」)を見積もる手順と式です。前提として、NeMo 既定の「分散オプティマイザ(Distributed Optimizer)」と半精度計算(BF16 など)を想定します。これは **半精度で順逆伝播を行いつつ、オプティマイザの主記憶(master parameters)とオプティマイザ状態は FP32** で保持し、**データ並列(DP)でこれら高精度の状態をシャーディング** する方式です。([NVIDIA Docs][1])
---
# 記号と前提
* $N$:モデル総パラメータ数(例:GPT-3 175B なら $N\approx 1.75\times10^{11}$)
* $b_{\mathrm{hp}}$:半精度のバイト数(BF16/FP16 → 2 bytes)
* $b_{32}=4$:FP32 のバイト数
* 並列度
* データ並列:$d$
* テンソル並列:$t$(各レイヤの重みを分割)
* パイプライン並列:$p$(レイヤをステージに分割)
* NeMo の **Distributed Optimizer**:
* **半精度の「モデル本体の重み」は各 DP rank が自前で保持(=非シャード)**
* **FP32 の master parameters とオプティマイザ状態は DP で均等シャード(=1/ $d$)**
* **勾配は reduce-scatter で DP にシャード(=1/ $d$)**
という挙動(ZeRO-2 相当の性質)です。([NVIDIA Docs][2])
> なお、パラメータは主として **テンソル並列 $t$** によって 1/$t$ に分割され、**パイプライン並列 $p$** はモデルを段(レイヤ群)に分けるため、各 GPU が担当するレイヤ分だけを保持します。GPT 系のように各段のパラメータがほぼ均等なら、1 段あたりの総パラメータは $N/p$ と近似できます(厳密には埋め込み層・最終層をどの段に載せるかで微調整)。
---
# 1) パラメータ(weights)
**目的:** 各 GPU が保持する「順伝播・逆伝播で用いる半精度パラメータ」のメモリ。
* NeMo 既定では、半精度パラメータは **DP で複製**、**TP で分割** され、担当ステージ分のみ **PP で分割** されます。
* よって、**1 GPU あたりのパラメータ容量**は
$
\boxed{
\mathrm{Mem}_{\text{params}} \;\approx\; \frac{N}{p}\cdot\frac{1}{t}\cdot b_{\mathrm{hp}}
}
$
(例:BF16 なら $b_{\mathrm{hp}}=2$)
> 補足:NeMo/Megatron では、**FP32 の master parameters** を最適化計算のために保持しますが、**これは DP で 1/$d$ にシャード** され、後述の「オプティマイザ状態」に含めて見積もるのが実務的です。([NVIDIA Docs][1])
---
# 2) 勾配(gradients)
**目的:** 逆伝播で得られる勾配の保持量。NeMo の分散オプティマイザでは **勾配は reduce-scatter により DP でシャード** されます(“main gradients” は FP32)。実装上のバッファ構成に依存する微差はありますが、理論見積りとしては次で十分です。([NVIDIA Docs][2])
* **1 GPU あたりの勾配容量(理論)**:
$
\boxed{
\mathrm{Mem}_{\text{grads}} \;\approx\; \frac{N}{p}\cdot\frac{1}{t}\cdot\frac{1}{d}\cdot b_{32}
}
$
> 備考:BF16 を使っても “main gradients” は FP32 で保持するのが一般的で、その前提が Megatron-Core ドキュメントにも明記されています。([NVIDIA Docs][2], [GitHub][3])
---
# 3) オプティマイザ状態(optimizer states)
**目的:** Adam/AdamW などのモーメント($m,v$)や **FP32 master parameters** のメモリ。NeMo の分散オプティマイザでは、**master parameters とオプティマイザ状態を DP で均等シャード** します。([NVIDIA Docs][4])
* **Adam 系(一般的)**:各パラメータにつき
* FP32 master parameter:$b_{32}$
* 1st moment $m$:$b_{32}$
* 2nd moment $v$:$b_{32}$
合計 **$3\times b_{32}=12$ bytes/param** を **DP サイズ $d$** でシャーディング
* **1 GPU あたりのオプティマイザ状態容量**:
$
\boxed{
\mathrm{Mem}_{\text{opt}} \;\approx\; \frac{N}{p}\cdot\frac{1}{t}\cdot\frac{1}{d}\cdot (3\,b_{32})
}
$
> ここでの $3\,b_{32}$ は **master param(1×)+ モーメント(2×)** の合計です。NeMo の解説や Megatron-Core の API ガイドも、この「型の組合せごとの理論バイト/パラメータ」を前提に議論しています。([NVIDIA Docs][2], [PyPI][5])
---
# まとめ:GPU あたりの「モデル関連メモリ」近似
最終的に、**1 GPU あたりのモデル関連メモリ(weights + grads + optimizer states)** は
$
\mathrm{Mem}_{\text{model}} \;\approx\;
\underbrace{\frac{N}{p\,t}\, b_{\mathrm{hp}}}_{\text{半精度パラメータ}}
\;+\;
\underbrace{\frac{N}{p\,t\,d}\, b_{32}}_{\text{勾配(FP32, DP シャード)}}
\;+\;
\underbrace{\frac{N}{p\,t\,d}\, (3\,b_{32})}_{\text{FP32 master + Adam の }m,v}
$
$
=\; \frac{N}{p\,t}\Bigl(
b_{\mathrm{hp}} \;+\; \frac{4}{d}\;+\;\frac{12}{d}
\Bigr)
\;=\;
\boxed{
\frac{N}{p\,t}\Bigl(
b_{\mathrm{hp}} \;+\; \frac{16}{d}
\Bigr)
}
\quad\text{(BF16/FP16: }b_{\mathrm{hp}}=2\text{)}
$
> つまり **TP($t$)と PP($p$)で線形に減り、DP を大きくすると FP32 系(勾配・master・モーメント)の負担が 1/$d$ で薄まる** 構造です。NeMo 既定の分散オプティマイザを使う限り、**半精度パラメータだけは DP で複製** される点に注意してください。([NVIDIA Docs][4])
---
## 実務での注意点
* **FSDP を使う場合**(NeMo も GPT 系で対応):**パラメータ・勾配・オプティマイザ状態のすべてを DP でシャーディング**し得るため、上式の **weights 項にも 1/$d$** が効きます(オフロードも可)。当式は **NeMo 既定の分散オプティマイザ(=weights は DP 非シャード)** 用なので、FSDP 時は weights にも 1/$d$ を掛ける版に置き換えてください。([NVIDIA Docs][6])
* **微差/上振れ要因**:通信ワークスペース、勾配バッファの一時ピーク、レイヤごとの PP 不均等、埋め込み層の偏りなど。
* **型の変種**:最近は FP8/Float8 の線形層などもありますが、**オプティマイザの master/モーメントは依然 FP32 が基本**という設計が多く、上の近似が有効です。([NVIDIA Docs][2])
---
## 使い方の例(手順)
1. モデルの $N$(総パラメータ数)を算出。
2. 並列設定($p,t,d$)と dtype(BF16 なら $b_{\mathrm{hp}}=2$)を決める。
3. 上の式で **GPU あたりの weights/grads/opt** をそれぞれ計算し、合算する。
4. これに **アクティベーションや通信ワークスペース** を別途上乗せして、GPU 実メモリ(H100 80GB/94GB)に収まるか確認。*(本問範囲外ですが必須の最終チェック)*
---
必要でしたら、あなたの想定する **$N, p, t, d$** を教えていただければ、上式に代入して **H100/80GB で足りるかの概算表**をその場でお出しします。
[1]: https://docs.nvidia.com/nemo-framework/user-guide/latest/nemotoolkit/features/mixed_precision.html?utm_source=chatgpt.com "Mixed Precision Training — NVIDIA NeMo Framework User Guide"
[2]: https://docs.nvidia.com/megatron-core/developer-guide/latest/api-guide/dist_optimizer.html?utm_source=chatgpt.com "Distributed Optimizer - NVIDIA Docs"
[3]: https://github.com/NVIDIA/Megatron-LM/discussions/1186?utm_source=chatgpt.com "[QUESTION] bf16 Parameters and fp32 Gradients #1186 - GitHub"
[4]: https://docs.nvidia.com/nemo-framework/user-guide/latest/performance/performance-guide.html?utm_source=chatgpt.com "Performance Tuning Guide — NVIDIA NeMo Framework User ..."
[5]: https://pypi.org/project/megatron-core/?utm_source=chatgpt.com "megatron-core · PyPI"
[6]: https://docs.nvidia.com/nemo-framework/user-guide/24.07/llms/gpt/fsdp.html?utm_source=chatgpt.com "Fully Sharded Data Parallel (FSDP) — NVIDIA NeMo ..."