私は Python で PuLP を使用して最適化を行っています。データが非常に大きいため、問題が非常に大きいため、マルチスレッドを試すことにしました。
ただし、主な問題の小さなサブセット (100 万人ではなく 10k 人) を対象としたテストでは、マルチスレッドで実際に複数のスレッドを使用することはできません。
Coin-OR Web サイトで説明されているように、フラグを使用してソースからソルバーをビルドするための指示に従いました。すべてがうまく機能し、すべてのテストに合格しました。CBC 構成のログインを確認したところ、845 行にメッセージが表示されているため、確実に機能するようになっています。../configure --enable-cbc-parallel
build/Cbc/config.log
configure:30105: Cbc multithreading enabled
システム:
- Mac OS X 10.14.3
- i7-4870HQ クアッドコア
- Python 3.6.7 とアナコンダ
- 問題はJupyterとコマンドラインからのPythonインタープリターでの実行の両方で発生します
ここの例のようなコード:
start = time.time()
solver = solvers.COIN_CMD(~/Cbc-2.9/build/Cbc/src/cbc',threads=8,msg=1,fracGap = 0.01)
prob.solve(solver)
print('time to solve:',time.time()-start,'seconds')
>> time to solve: 24.815305948257446 seconds
マルチスレッド ソルバーを指定した場合も、デフォルトのソルバーを使用した場合も、その時間はほぼ同じでした。
実行時の CBC メッセージには、次の行がありました。
threads was changed from 0 to 8
また、次の行:
Cbc0012I Integer solution of -25507 found by DiveCoefficient after 0 iterations and 0 nodes (18.04 seconds)
Cbc0030I Thread 0 used 0 times, waiting to start 0.291008, 0 cpu time, 0 locks, 0 locked, 0 waiting for locks
Cbc0030I Thread 1 used 0 times, waiting to start 0.24997687, 0 cpu time, 0 locks, 0 locked, 0 waiting for locks
Cbc0030I Thread 2 used 0 times, waiting to start 0.21034408, 0 cpu time, 0 locks, 0 locked, 0 waiting for locks
Cbc0030I Thread 3 used 0 times, waiting to start 0.17122722, 0 cpu time, 0 locks, 0 locked, 0 waiting for locks
Cbc0030I Thread 4 used 0 times, waiting to start 0.13530493, 0 cpu time, 0 locks, 0 locked, 0 waiting for locks
Cbc0030I Thread 5 used 0 times, waiting to start 0.098966837, 0 cpu time, 0 locks, 0 locked, 0 waiting for locks
Cbc0030I Thread 6 used 0 times, waiting to start 0.062871933, 0 cpu time, 0 locks, 0 locked, 0 waiting for locks
Cbc0030I Thread 7 used 0 times, waiting to start 0.028151035, 0 cpu time, 0 locks, 0 locked, 0 waiting for locks
Cbc0030I Main thread 0 waiting for threads, 1 locks, 0.00077700615 locked, 9.5367432e-07 waiting for locks
Cbc0001I Search completed - best objective -25507, took 0 iterations and 0 nodes (18.29 seconds)
これは、すべてのスレッドが作成されたが使用されていないことを意味しますか?
私が考えたが解決方法がわからない解決策の 1 つ: ソルバーへのパスが間違っている可能性があります。つまり、COIN_CMD ソルバーを別の場所に向けるべきではありませ.../cbc
ん。私はそれについて何も見つけていません。
それで、私は何を間違っていますか?スレッドの使用方法に関する他のドキュメントは見つかりませんでした。うまくいけば、これは簡単な解決策を持つばかげた質問です。ご協力いただきありがとうございます。