Многопоточность 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 потребуется исследовать большое количество узлов. В этом случае параллельные потоки могут иметь значение. Но в некоторых случаях это также может привести к снижению производительности (см. Ссылку).

Другие вопросы по тегам