GPU使用率の数字に騙されていませんか?
LLM(大規模言語モデル)のトレーニングや推論を行う際、多くのエンジニアがnvidia-smiを見ています。「GPU使用率」で性能を判断するのです。しかし、この数字は実際の計算効率をほとんど反映していません。
実際に、メモリの読み書きだけのプログラムでも100%を示します。つまり「GPUが忙しい」ことと「GPUが効率的に計算している」ことはまったく別の話なのです。
MFU(モデルFLOPS使用率)という指標
そのため、この問題に対処するため、GoogleがPaLM論文で提案したのがMFU(Model FLOPS Utilization)です。MFUは実測と理論値の比率です。GPUの浮動小数点演算の効率を示します。
一般的なLLMトレーニングでは、MFUは35〜45%程度が標準的な範囲とされています。しかし、GPU使用率が100%でもMFUは20%程度のケースがあります。つまり、GPUの潜在能力の5分の1しか活用できていないわけです。
GPUアーキテクチャを理解する
なぜこんなギャップが生まれるのか。それを理解するにはGPUの構造を知る必要があります。NVIDIAのGPUはSMという処理ユニットを搭載しています。たとえば、H100には144個のSMがあります。各SMが多数のCUDAコアを管理します。
GPU使用率はSMの稼働時間の割合を示すだけです。つまり、各SMがどれだけ効率的に計算しているか、メモリアクセスで待機している時間がどれだけあるかは含まれません。これがGPU使用率とMFUの乖離の正体です。
Trainy AIの最適化事例
GPUクラスター管理を専門とするTrainy AIは、ある企業のLLMトレーニング効率改善に取り組みました。実施した最適化は以下の通りです。
データローダーの調整や混合精度トレーニングを実施しました。さらに、fusedオプティマイザの導入も行いました。その結果、これらを適用した結果、GPU使用率は100%、電力消費も大きくなり、一見すると最適化に成功したように見えました。
しかしMFUを計算してみると、期待値を大きく下回っていました。GPU使用率だけを見ていたら、この問題には気づけなかったでしょう。
SM効率を高めるためのポイント
MFUを改善するには、メモリ帯域幅のボトルネックを特定することが出発点になります。LLMトレーニングでは、重みの読み込みや勾配の書き込みでメモリアクセスが頻発するため、計算よりもデータ転送がボトルネックになりがちです。
2025年現在、FlashAttentionのようなメモリ効率の良いアルゴリズムや、カーネルフュージョンによる不要なメモリアクセスの削減が標準的なアプローチになっています。また、H100やH200のHBM3/HBM3eメモリは帯域幅が大幅に向上しており、ハードウェア側からもこの課題に対応しています。
MFU活用のまとめ
LLMの開発や運用に関わるなら(プロンプトキャッシングによるコスト最適化も重要です)、GPU使用率ではなくMFUを見る習慣をつけましょう。GPU使用率100%は「忙しい」ことを示すだけで、「効率的に計算している」こととは限りません。SM効率を理解し、MFUを定期的に計測することが、本当の意味でGPUリソースを最大限に活かす第一歩です。
