用語集 · コンピューティング
オールリデュース
別名:All-reduce、allreduce、gradient averaging、learner process、learners、勾配平均、学習プロセス、Allreduce
複数のプロセスがそれぞれ自分の数値を足し合わせ、全員が同じ合計を受け取る処理。ネットワークの複製どうしを同期させるのに使います。
ネットワークを複数のプロセスで同時に学習させるとき、各プロセスは自分の担当分のデータについて勾配(すべての重みをどちらへ少し動かすかを示す方向。勾配降下法を参照)を計算します。重みを更新する前に、これらの勾配をまとめなければなりません。そうすることで、ネットワークのどの複製もまったく同じ更新を行い、同一の状態を保てます。
オールリデュースがこれを担います。各プロセスが自分の配列を差し出し、配列が合計(または平均)され、その結果を全プロセスが受け取ります。
これはタダではありません。どのプロセスも一番遅いプロセスを待たなければならず、配列はミニバッチのたびにプロセス間でコピーされます。作業をより多くのプロセスに分ければ1つあたりの担当分は小さくなりますが、オールリデュースの大きさは変わりません。そのため、ある点を超えると、プロセスを増やすほど学習は速くなるどころか遅くなります。
このプロジェクトでは
CPU のトレーナーは、各ミニバッチを数個の学習プロセス(それぞれが複数のスレッドを持つ)に分け、それらの勾配をオールリデュースします(レンタルGPUで学習する やそれ以前の記事でこの分け方を調整しました)。2人のファイターと視覚 では、96 vCPU のマシンで学習プロセスを2つから3つに増やすと、勾配計算の時間は1イテレーションあたり 1.27 秒から 1.00 秒に減りましたが、オールリデュースは 0.23 秒から 0.38 秒に増えました。それでもイテレーションは9%速くなりました。bfloat16 の学習プロセスでは、3つ目のプロセスを足しても何も得られませんでした。そのオールリデュースが節約分を食いつぶしたのです。