用語集 · コンピューティング
共有メモリ
別名:Shared memory、multiprocessing.shared_memory、パイプ、pipes、プロセス間通信、inter-process communication、IPC
複数のプロセスが直接読み書きできるメモリ領域です。データをコピーせずにプロセス間で受け渡せます。
多くのプロセッサを使うプログラムは、ふつう多数の別々のプロセスとして動きます。それぞれが自分のメモリを持ち、デフォルトでは他のプロセスのメモリは見えません。プロセス間でデータを受け渡すよくある方法はパイプです。一方のプロセスがデータをバイト列に詰め(シリアライズ、Python では「pickle」)、書き込み、もう一方がそれを読んで展開します。シンプルで安全ですが、すべてのバイトがコピーされ、詰めたり展開したりするのにプロセッサの時間がかかります。
共有メモリでは、オペレーティングシステムが1つのメモリ領域を複数のプロセスに同時に割り当てます。あるプロセスがそこに配列を書き込み、他のプロセスはコピーせずに、その場にある同じ配列を読みます。コストは調整のほうに移ります。他のプロセスがまだ書き込んでいる最中のデータを読んではいけません。よくあるパターンはダブルバッファリングです。領域のコピーを2つ用意し、一方を埋めている間にもう一方を読み、毎回入れ替えます。
Python では、標準ライブラリの multiprocessing.shared_memory がこうした領域を提供し、NumPy や PyTorch の配列をその上に直接載せられます。
このプロジェクトでは
学習では、ファイターをシミュレーションする多数のワーカープロセスと、ネットワークを更新する少数の学習器プロセスが動きます。10月20日までは、各反復でネットワークの重み(約 2 MB)を168個のワーカーそれぞれにパイプで送り、168個の経験のバッチを送り返してもらっていて、それを1つのコアが詰め、展開し、結合していました。192-vCPU のマシンでは、その1コアがボトルネックになりました。重みと経験をダブルバッファの共有メモリに置くと、学習は1時間あたり 44 M ステップから 50 M ステップになり、その日の他の変更と合わせて約 70 M ステップになりました(ブロックを参照)。