Многопоточность PuLP CBC не работает с COIN_CMD
Я использую PuLP с Python для некоторой оптимизации, и поскольку мои данные настолько велики, я решил попробовать многопоточность, так как моя проблема довольно велика, т.е.
Однако при тестировании с небольшим подмножеством основной проблемы (10 тыс. Вместо 1 млн. Человек) я не могу получить многопоточность, чтобы фактически использовать несколько потоков.
Я следовал инструкциям по созданию решателя из источника, используя ../configure --enable-cbc-parallel
пометить, как описано на сайте Coin-OR; все работало отлично и все тесты пройдены. Я проверил конфигурационный журнал CBC в build/Cbc/config.log
и у него есть сообщение configure:30105: Cbc multithreading enabled
в строке 845, так что он определенно включен для работы.
система:
- 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)
что означает, что все темы были созданы, но не использованы?
Одно решение, о котором я подумал, но не знаю, как его решить: возможно, мой путь к решателю неверен, то есть решатель COIN_CMD не должен быть направлен на .../cbc
но к чему-то еще. Я ничего не нашел по этому поводу.
Так что я делаю не так? Я не мог найти другую документацию о том, как использовать темы. Надеюсь, это глупый вопрос с простым решением. Спасибо за вашу помощь.
1 ответ
Похоже, вся работа была сделана во время предварительной обработки. Параллельные потоки включаются только во время фазы ветвления и привязки после предварительной обработки. Попробуйте модель или набор данных, в котором CBC должен выполнить реальное ветвление. Т.е. где количество узлов значимо. Для большинства более крупных моделей MIP CBC потребуется исследовать большое количество узлов. В этом случае параллельные потоки могут иметь значение. Но в некоторых случаях это также может привести к снижению производительности (см. Ссылку).