用語集 · コンピューティング

オールリデュース

別名:All-reduce、allreduce、gradient averaging、learner process、learners、勾配平均、学習プロセス、Allreduce

複数のプロセスがそれぞれ自分の数値を足し合わせ、全員が同じ合計を受け取る処理。ネットワークの複製どうしを同期させるのに使います。

ネットワークを複数のプロセスで同時に学習させるとき、各プロセスは自分の担当分のデータについて勾配(すべての重みをどちらへ少し動かすかを示す方向。勾配降下法を参照)を計算します。重みを更新する前に、これらの勾配をまとめなければなりません。そうすることで、ネットワークのどの複製もまったく同じ更新を行い、同一の状態を保てます。

オールリデュースがこれを担います。各プロセスが自分の配列を差し出し、配列が合計(または平均)され、その結果を全プロセスが受け取ります。

g=1N∑k=1Ngkg = \frac{1}{N} \sum_{k=1}^{N} g_k

これはタダではありません。どのプロセスも一番遅いプロセスを待たなければならず、配列はミニバッチのたびにプロセス間でコピーされます。作業をより多くのプロセスに分ければ1つあたりの担当分は小さくなりますが、オールリデュースの大きさは変わりません。そのため、ある点を超えると、プロセスを増やすほど学習は速くなるどころか遅くなります。

このプロジェクトでは

CPU のトレーナーは、各ミニバッチを数個の学習プロセス(それぞれが複数のスレッドを持つ)に分け、それらの勾配をオールリデュースします(レンタルGPUで学習する やそれ以前の記事でこの分け方を調整しました)。2人のファイターと視覚 では、96 vCPU のマシンで学習プロセスを2つから3つに増やすと、勾配計算の時間は1イテレーションあたり 1.27 秒から 1.00 秒に減りましたが、オールリデュースは 0.23 秒から 0.38 秒に増えました。それでもイテレーションは9%速くなりました。bfloat16 の学習プロセスでは、3つ目のプロセスを足しても何も得られませんでした。そのオールリデュースが節約分を食いつぶしたのです。

関連用語

この用語が出てくる記事

← すべての用語