Многопоточность PuLP CBC не работает с COIN_CMD - PullRequest
0 голосов
/ 17 февраля 2019

Я использую PuLP с Python для некоторой оптимизации, и, поскольку мои данные настолько велики, я решил попробовать многопоточность, так как моя проблема довольно велика, т.е. выбрал

Однако при тестировании с небольшим подмножествомглавная проблема (10k вместо 1M человек), я не могу получить многопоточность, чтобы фактически использовать несколько потоков.

Я следовал инструкциям для построения решателя из источника с использованием флага ../configure --enable-cbc-parallel , как описано на сайте Coin-OR ;все работало отлично и все тесты пройдены.Я проверил конфигурационный журнал CBC в build/Cbc/config.log, и в нем есть сообщение configure:30105: Cbc multithreading enabled в строке 845, поэтому он определенно включен для работы.

Система:

  • Mac OS X10.14.3
  • i7-4870HQ четырехъядерный
  • Python 3.6.7 с Anaconda
  • проблема возникает как в 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 Ответ

0 голосов
/ 18 февраля 2019

Смотрит всю работу, выполненную во время предварительной обработки.Параллельные потоки включаются только во время фазы ветвления и привязки после предварительной обработки.Попробуйте модель или набор данных, в котором CBC должен выполнить реальное ветвление.Т.е. где количество узлов значимо.Для большинства более крупных моделей MIP CBC потребуется исследовать большое количество узлов.В этом случае параллельные потоки могут иметь значение.Но в некоторых случаях это также может привести к снижению производительности (см. ссылка ).

...