テクニカルガイド
勾配の累積
勾配累積を使用すると、重みを更新する前にいくつかの小さなミニバッチにわたる勾配を合計することで、限られた GPU メモリ上で大きなバッチ サイズをシミュレートできます。
このガイドを聴くAIによるナレーション · ~2 min
概要
これは、メモリがボトルネックになっている場合に大規模なモデルをトレーニングするための標準的な回避策です。
ディープダイブ
通常、トレーニング ステップは 1 つのバッチを処理し、勾配を計算し、パラメーターをすぐに更新します。勾配累積では、より小さいマイクロバッチで複数の前方および後方パスを実行し、それらの勾配をパラメーター バッファーに加算し、N 個のマイクロバッチの後でのみオプティマイザー ステップを呼び出します (勾配をゼロにします)。ピーク メモリには 1 つのマイクロバッチのアクティベーションしか保持されませんが、有効なバッチ サイズはマイクロバッチ サイズの N 倍になります。これは、多くのトレーニング レシピが統計を安定させるために大規模なバッチを前提としているため、また、大規模なトランスフォーマーのようなモデルは単一のデバイスに完全なターゲット バッチを適合させることができないため、重要です。問題点: バッチ正規化統計はマイクロバッチごとに計算されるため、層ノルムまたはグループノルムは累積とより適切に組み合わせることができ、有効学習率を適切に保つために損失を正しくスケールする必要があります。
現実世界の実装
8 個または 16 個を超えるマイクロバッチを蓄積して、効果的な数百のバッチに達することで、単一のコンシューマ GPU 上で大規模な言語モデルを微調整します。
2 つのバッチでも適合する高解像度のビジョンまたはセグメンテーション モデルをトレーニングする場合、レシピには 32 の有効なバッチが必要です。
Hugging Face Trainer と PyTorch Lightning は、限られた VRAM セットアップで日常的に使用される gradient_accumulation_steps 設定を公開します。
蓄積を通じて有効なバッチ サイズを一致させることにより、論文の大バッチ結果をより小型のハードウェアで再現します。
勾配累積の未来
モデルのサイズが単一デバイスのメモリを上回るため、勾配累積は引き続きデフォルトのレバーとなります。 DeepSpeed や FSDP などのフレームワークで、混合精度、アクティベーション チェックポイント、ZeRO シャーディング、パイプライン並列処理との組み合わせが増えています。メモリ バジェットに合わせてライブラリが累積ステップを自動調整する、より緊密な自動化が期待されます。また、コンシューマ GPU を含む小規模なハードウェアで大規模なモデルを微調整することの重要性が継続し、他の方法では不可能なトレーニングが可能になります。
実践する
なぜそれが重要なのか
- 費用と予算. アーキテクチャの決定により、パフォーマンスと運用コストが何年にもわたって推進されます。
- より明確な判決. 技術教育は、チームが最新のスタックだけでなく、適切なスタックを選択するのに役立ちます。
- 品質管理. より良いエンジニアリングの選択により、本番環境での信頼性に関するインシデントが減少します。
気をつけてください
- 1 つのベンチマークを最適化すると、より広範なシステムの弱点が隠れる可能性があります。
- インフラストラクチャとメンテナンスのコストは過小評価されがちです。
- システムが複雑になるにつれて、セキュリティと可観測性のギャップが拡大する可能性があります。
次のステップ
- 実装前にレイテンシ、品質、コストの目標を定義します。
- 現実的な負荷とデータ条件でのベンチマーク。
- エラー、ドリフト、ユーザーへの影響を計測器で監視します。
- スケーリングの前に、ロールバックとインシデント対応のパスを準備します。
探検を続けましょう
よくある質問
勾配累積とは何ですか?
勾配累積を使用すると、重みを更新する前にいくつかの小さなミニバッチにわたる勾配を合計することで、限られた GPU メモリ上で大きなバッチ サイズをシミュレートできます。これは、メモリがボトルネックになっている場合に大規模なモデルをトレーニングするための標準的な回避策です。
勾配累積によって主に何ができるようになりますか?
更新する前に複数のマイクロバッチにわたる勾配を合計することで、すべてを一度にメモリに保持することなく、大きなバッチを模倣します。
With an accumulation factor N, when should optimizer.step() and zero_grad() occur?
Accumulate gradients across N micro-batches, call optimizer.step() once for the effective batch, then clear gradients before the next window; begin training with cleared buffers.
どの正規化層が勾配累積とよりきれいに組み合わされますか?
バッチノルムはマイクロバッチごとに統計を計算するため、レイヤーまたはグループノルムは小さなマイクロバッチの不一致を回避します。
Why may four micro-batches with BatchNorm behave differently from one physical batch of the same total size?
Batch-dependent forward computations break exact equivalence.