凸最適化のためのcvxopt パッケージの問題に遭遇しましたが、ドキュメントには記載されていませんでした。何が原因で、それを回避する最善の方法を誰かが知っているのだろうか.
問題はimport cvxopt
、インスタンスを利用する Python プログラムでmultiprocessing.Process
、プロセスを並列に実行できなくなることです。それらは自動的に同期されるようです。cvxopt
これは、関数がプログラムで実際に使用されているかどうかに関係なく発生することに注意してください。パッケージをインポートするだけで、この効果が発生します。
例:
# import cvxopt
from multiprocessing import Queue, Process
def compute(queue):
"""
Pick integers from a queue and perform some useless
calculations on them just to keep the CPU busy.
"""
total = 0
while True:
item = queue.get()
if item is None:
break
for i in range(item):
total += i
if __name__ == '__main__':
queue = Queue()
procs = []
for i in range(4):
proc = Process(target = compute,
args = (queue,))
proc.start()
procs.append(proc)
for i in range(100000):
queue.put(i)
for proc in procs:
queue.put(None)
for proc in procs:
proc.join()
上記のスクリプトは、メイン プログラムと並行して実行される 4 つのプロセスを開始します。4 つのコアを持つマシンでは、4 つのプロセスがあり、それぞれが 100% の CPU を使用していました。
ただし、開始時にステートメントのコメントを外すとimport cvxopt
、各プロセスは、他のプロセスと同期しているかのように、CPU の 25% しか占有しなくなります。
説明と回避策の両方に興味があります。私が見落としたドキュメントに明らかな説明がある場合は、お詫び申し上げます。
問題の再現方法の詳細
これを実行している環境は、Linux 3.5.0 (Ubuntu 12.10 ディストリビューション) と Python 3.2.3 です。これは、cvxopt をインストールした方法です。
matplotlib 1.2.1 をインストールします (多くの cvxopt サンプル スクリプトで使用されている pylab が含まれているため、これを行いました。これが実際の要件であるかどうかはわかりません)。この tar.gz パッケージを使用し
sudo python3 setup.py install
てインストールしました。BLASとATLASを搭載
sudo apt-get install libblas-dev libblas3 libatlas-base-dev libatlas3-base libblas-test libopenblas-base libopenblas-dev
上記はおそらく必要以上ですが、それで問題が発生した場合は驚くでしょう。
こことからtar.gz パッケージを使用して、cvxopt 1.1.6 をインストールしました
sudo python3 ./setup.py install
。