データ並列って何?
データ並列は、分散訓練の中でも最も直感的な方法です。やり方はシンプル。完全なモデルのコピーを各GPUに置き、訓練データを細かく分けて、各カードが自分のバッチを処理します。計算後、各カードの勾配を合計して平均し、その平均勾配で全コピーが一緒にパラメータを更新します。どう動くのか
モデルを複製し、データを分割どのカードのモデルもまったく同じ。違いは「食べる」データだけです。
勾配を同期
各カードが勾配を出したら、通信で合計して平均し、全カードが同じ「統一された答え」を受け取ってから、それぞれローカルのモデルを更新します。
実質的に大きなバッチと同じ
4枚のカードが32件ずつ処理すれば、128件を一度に処理したのと同じ効果。バッチサイズが大きくなります。
何が良いのか
実装が簡単モデル構造はほぼそのまま。訓練を速くするための最初の一手です。
拡張しやすい
カードを足せば速くなります。GPUの枚数もバッチサイズも自由が利きます。
限界はどこか
モデルが収まる必要がある前提は、各カードが完全なモデルを載せられること。大きすぎるモデルにはデータ並列は使えず、モデル並列が必要です。
通信がボトルネック
カードが増えるほど勾配同期の通信量も増え、同期が遅いと全体が遅くなります。
バッチサイズは無限に増やせない
大きすぎるバッチは収束を悪くするため、学習率などの調整で補う必要があります。
いつ使うのか
モデルが小さく1枚に収まり、データが多くてもっと速く訓練したいとき、データ並列は一番手軽な選択肢です。多くの大規模訓練システムでは「土台」として使われ、その上にモデル並列やパイプライン並列を重ねます。まとめ:データ並列とは「同じモデルを何枚も複製し、それぞれ別のデータを処理して、勾配で答え合わせをしてから更新する」方式です。
コメント