バッチ分割(Batch Splitting)とは
Batch Splitting
1回の学習ステップで扱うバッチをデバイスのメモリに収まる小さな単位へ分割し、順次または並列に処理する手法
概要
バッチ分割は、学習に使う1つのバッチをそのまま一括で処理するとGPUメモリに収まらない場合、より小さな単位へ分けて扱う手法の総称。分割したサブバッチを複数デバイスに配って同時に処理すればデータ並列となり、逆に1デバイス上で順番に処理して勾配を蓄積してから1回だけパラメータを更新すれば勾配累積(Gradient Accumulation)になる。パイプライン並列ではさらに細かく分割したマイクロバッチとして各ステージに流し込まれる。 いずれの場合も、元のバッチサイズを保ったまま計算を小分けにすることで、メモリ制約下でも大きな実効バッチサイズでの学習を可能にする点が共通する。
利点
欠点
- 順次処理する場合(勾配累積)は分割数に応じて学習時間が増加する
- 分割方法によってはデバイス間の通信オーバーヘッドが増える