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

共有メモリ

別名: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 ステップになりました(ブロックを参照)。

関連用語

この用語が出てくる記事

← すべての用語