なぜ必要?
「VRAM 8 GB しかないからバッチサイズ 2 で学習 → 収束が遅い」─ こんな悩みを一発で解決するのが Gradient Accumulation(勾配累積) です。ミニバッチを数回に分けて順次 GPU に流し、勾配だけをメモリ内に貯めてからまとめて重みを更新します。論理バッチサイズは大きいまま、実メモリ使用量はそのままというお得技です。
私はGPUはNVIDIA Geforce GTX 1650を使用していてvramが4GBしかないのでバッチサイズは小さくしかできないのかと悩んでいましたが、この悩みも解決できそう。
実装はたった 6 行
pythonコピーする編集するacc_steps = 4 # 例:実バッチ8×4=論理32
optimizer.zero_grad()
for step, (x, y) in enumerate(loader):
loss = model(x).cross_entropy(y) / acc_steps
loss.backward() # 勾配を分割して加算
if (step + 1) % acc_steps == 0:
optimizer.step() # ここで一括更新
optimizer.zero_grad()
- 割り算で勾配を平均化しスケールを保つ
acc_steps
を増やせば「実メモリ×n 倍」のバッチが再現可
便利ポイント
- 高速収束:BatchNorm や AdamW が十分な統計量を得られる
- OSS と相性抜群:PyTorch Lightning/HF Trainer なら
gradient_accumulation_steps
を設定するだけ - マルチ GPU にも拡張可:DataParallel と併用すれば “小×多” 構成でも巨大モデルが学べる
落とし穴と対策
症状 | 対処 |
---|---|
学習が不安定 | acc_steps を大きくし過ぎ → 8 以下推奨 |
学習が遅い | I/O 待ち → pin_memory=True でデータ転送高速化 |
精度劣化 | Scheduler.step() を 更新タイミングに合わせる |
まとめ
Gradient Accumulation は コード数行で導入できる“仮想バッチ拡大”テクニック。GPU メモリに悩む個人開発者でも、大規模モデルを本格学習できるようになります。まずは acc_steps=4
で試し、学習曲線をチェックしてみましょう。