1. **定義:**
* モデルの計算(主に浮動小数点演算)において、**ハードウェアが持つ理論上のピーク演算性能に対して、実際に達成された演算性能の割合** を示す指標です。
* **FLOPs (Floating-point Operations Per Second)** は、1秒あたりに実行できる浮動小数点演算の回数です。LLMの学習では主に `matmul` (行列積) 演算が計算量の大部分を占めます。
* MFUは、GPUなどの計算リソースをどれだけ効率的に「計算」のために使えているかを示します。
2. **計算方法:**
* 一般的には以下の式で計算されます。
```
MFU (%) = (達成された FLOPs / 理論上のピーク FLOPs) * 100
```
または、ステップ時間を使って以下のように計算することも多いです。
```
達成された TFLOPS = (1ステップあたりのモデル計算FLOPs) / ステップ時間 / 10^12
MFU (%) = (達成された TFLOPS / ハードウェアの理論ピーク TFLOPS) * 100
```
* **1ステップあたりのモデル計算FLOPs:**
* これはモデルアーキテクチャ、バッチサイズ、シーケンス長から理論的に計算されます。
* Transformerモデルの場合、主な計算量はAttention層とFFN層の `matmul` にあり、パラメータ数 `N` 、バッチサイズ `B` 、シーケンス長 `S` を用いて概算できます。
* フォワードパスとバックワードパス(勾配計算)の両方を考慮する必要があります。一般的に、バックワードパスはフォワードパスの約2倍の計算量とされます。したがって、モデルのフォワードパスのFLOPsを `F` とすると、1ステップのモデル計算FLOPsは `B * S * (F_{fwd} + F_{bwd}) ≈ B * S * 3 * F_{fwd}` と近似されることがあります。より正確には、 `F_{fwd}` と `F_{bwd}` をモデル構造から精密に計算します。よく使われる近似式として、パラメータ数を `N` として `6 * N * B * S` や `8 * N * B * S` などがあります(係数はモデル構造や計算方法の仮定に依存)。
* 論文 [PaLM](https://arxiv.org/abs/2204.02311) や [Megatron-LM](https://arxiv.org/abs/1909.08053) などで詳細な計算方法が議論されています。
* **ハードウェアの理論ピーク TFLOPS:**
* 使用しているGPU(例: NVIDIA A100, H100)のデータシートに記載されている、特定の数値精度(例: FP16 Tensor Core, BF16 Tensor Core)における理論上の最大演算性能(TFLOPS = 10^12 FLOPs/sec)。
* 分散学習の場合は、使用している全GPUの理論ピークTFLOPSの合計値を使います。
3. **意味・重要性:**
* **計算効率の指標:** GPUなどの高価な計算リソースを、モデルの学習計算のためにどれだけ有効活用できているかを示します。
* **ボトルネックの特定:** MFUが低い場合、計算以外の要因(メモリ帯域律速、通信律速、ソフトウェアオーバーヘッドなど)がボトルネックになっている可能性を示唆します。
* **ソフトウェアスタックの評価:** 使用しているフレームワーク(PyTorch, TensorFlow)、ライブラリ(Megatron-LM, DeepSpeed)、カーネル実装などの効率性を評価するのに役立ちます。
4. **影響要因:**
* **カーネル実装の効率:** 特に `matmul` などの主要演算カーネルが、ハードウェア(例: Tensor Core)を最大限活用できるように最適化されているか。
* **メモリ帯域幅:** 計算に必要なデータをGPUメモリから計算ユニットへ、または計算結果をメモリへ書き戻す速度が十分か。メモリ律速の場合、計算ユニットがデータ待ちでアイドル状態になり、MFUが低下します。
* **通信オーバーヘッド:** 分散学習におけるノード間の通信(勾配同期など)が計算時間を妨げている場合、MFUが低下します(特に計算と通信のオーバーラップが不十分な場合)。
* **バッチサイズとシーケンス長:** これらが小さすぎると、GPUの計算ユニットを飽和させられず、MFUが低くなる傾向があります(Arithmetic Intensityが低い状態)。
* **数値精度:** FP32よりもFP16やBF16の方が理論ピーク性能が高いため、同じ達成FLOPsでもMFUの計算上の分母が変わります。また、混合精度計算の実装効率も影響します。
* **モデルアーキテクチャ:** 計算量に対するメモリアクセス量の比率(Arithmetic Intensity)が低いモデル構造は、MFUが上がりにくい傾向があります。
5. **HFU (Hardware FLOPs Utilization) との違い:**
* 文脈によりますが、MFUは特に「モデルの学習計算に使われたFLOPs」に焦点を当てる場合に使われます。
* HFUは、より広く「ハードウェア全体で達成されたFLOPs」(モデル計算以外のオーバーヘッドも含む可能性)として使われることがあります。
* 実用上は、MFUとHFUはほぼ同義で、**ハードウェアの理論ピーク性能に対する実効性能の割合** として使われることが多いです。重要なのは、どの理論ピーク性能(例:FP16 Tensor Core)を基準にしているかを明確にすることです。
6. **目標値:**
* 最新のGPU(A100, H100など)と最適化されたソフトウェアスタックを用いたLLM学習では、**MFU 50%以上** が一つの目安とされることが多いです。非常に高度に最適化されたシステムでは、60%や70%を超えることも報告されています。
* ただし、モデルサイズ、バッチサイズ、ハードウェア、並列化戦略などによって達成可能なMFUは大きく異なります。
7. **利点と欠点:**
* **利点:**
* 計算リソースの利用効率を直接的に評価できる。
* ボトルネックが計算にあるのか、それ以外(メモリ、通信など)にあるのかを判断する手がかりになる。
* ソフトウェアや実装の最適化度合いを測るのに有効。
* **欠点:**
* **計算が複雑:** 1ステップあたりのモデル計算FLOPsを正確に見積もるのが難しい場合がある。モデル構造やフレームワークの実装に依存する。
* **MFUが高くてもTPSが低い場合がある:** 例えば、非常に小さいバッチサイズでMFUが高くても、ステップ時間が長くなり、結果的にTPSは低くなる可能性がある。
* **通信性能を直接反映しない:** MFUは主に計算効率を見る指標であり、通信が非常に非効率でも計算部分だけ見るとMFUが高い、という状況もあり得る(ただし、通常は通信待ちで計算が止まるとMFUも下がる)。
---
[Nemo Megatron (DGXC Benchmarking) \| NVIDIA NGC](https://catalog.ngc.nvidia.com/orgs/nvidia/teams/dgxc-benchmarking/resources/nemo-megatron-dgxc-benchmarking)
> MFU = (global batch size) * (model flops) / (training step time) / (number of GPUs) / (peak GPU FLOPS)
The peak theoretical throughput for H100 FP8 is 1979 TFLOPS and for H100 BF16 is 989 TFLOPS.
```
model flops = (sequence length) * ((attention flops) + (mlp flops) + (embedding flops))
model flops breakdown:
attention flops = (24 * (number of layers) * (hidden size)^2) + (12 * (number of layers) * (hidden size) * (sequence length))
mlp flops = 48 * (number of layers) * (hidden size)^2
embedding flops = 6 * (vocab size) * (hidden size)
GPT 3 175b calculation:
sequence length = 2048
attention flops = 24 * 96 * 12288^2 + 12 * 96 * 12288 * 4096 = 376,883,380,224
mlp flops = 48 * 96 * 12288^2 = 695,784,701,952
embedding flops = 6 * 51200 * 12288 = 3,774,873,600
model flops = 2048 * (376,883,380,224 + 695,784,701,952 + 3,774,873,600) = 2.20E+15
```