学習時VRAM見積もり

CUDA out of memory が出る前に、どこがメモリを食っているかを内訳で見る。Transformer系の学習が対象。

内訳GB割合

足りないときの手

計算の前提(クリックで展開)

重み・勾配・オプティマイザ状態はパラメータ数から直接求めています。混合精度のフル微調整+AdamWは、重みfp16が2、勾配fp16が2、fp32マスタ重みが4、Adamの1次・2次モーメントが各4で、合計16バイト/パラメータになります。8bitオプティマイザはモーメントを各1バイトとして10バイト、SGDはモーメントを持たないぶん軽くなります。

アクティベーションは Korthikanti ほか (2022) の式を使い、1層あたり s·b·h·(34 + 5·a·s/h) バイトとしています。FlashAttentionを有効にすると、系列長の2乗で効いてくる 5·a·s/h の項が消えます。勾配チェックポイントを入れた場合は層の境界だけを保持する 2·s·b·h に落とし、再計算のピークとして1層ぶんを加算しています。

そのうえでCUDAコンテキストなどの固定オーバーヘッドを1.0GB、断片化を合計の5%として足しています。実測とは環境によってずれます。特にGQA(Grouped Query Attention)のモデルではKV側が小さくなるため、この式は多めに出ます。余裕を見る方向の誤差なので、上限の目安として使ってください。

LoRAのパラメータ数は 層数 × 2箇所 × 2行列 × 隠れ次元 × rank で数え、ベースモデルは凍結(勾配もオプティマイザ状態も持たない)として計算しています。QLoRAはベースを4bitとして0.5バイト/パラメータで見ています。