Проблема распараллеливания XGBoost в macOS High Sierra - PullRequest
0 голосов
/ 08 ноября 2018

Я использую среду Anaconda в MacOS High Sierra и не могу запустить XGBoost с 8-поточным потоком, даже если для параметра nthread установлено значение 8.

Код Python такой. Когда я запускаю его, я наблюдаю за выполнением, глядя на htop . Существует только один процесс, который составляет 100%.

clf = xgb.XGBClassifier(
     **xgb_params,
     n_estimators=1000,
     nthread=8
)

Тогда я искал в интернете и нашел эту ссылку. Некоторые ссылаются на это, и я последовал за ним.

https://www.ibm.com/developerworks/community/blogs/jfp/entry/Installing_XGBoost_on_Mac_OSX?lang=en

➜  ~ brew install gcc --without-multilib
Warning: gcc 8.2.0 is already installed and up-to-date
To reinstall 8.2.0, run `brew reinstall gcc`

После просмотра этой информации я добавил следующие строки в свой конфигурационный файл xgboost

export CC = gcc-8
export CXX = g++-8

Когда сборка будет завершена. Я попробовал еще раз, и ничего не изменилось.

Итак, я продолжал искать решение. Я нашел эту страницу.

https://clang -omp.github.io /

Затем я запустил следующую строку.

brew install llvm

И я попытался сделать пример на этом сайте. Я создал файл с именем hello.c и поместил в него следующий код.

#include <omp.h>
#include <stdio.h>
int main() {
#pragma omp parallel
  printf("Hello from thread %d, nthreads %d\n", omp_get_thread_num(), 
  omp_get_num_threads());
}

Затем я попытался скомпилировать его, как упоминалось.

clang -fopenmp hello.c -o hello

Это сработало! Я также попробовал gcc-8 следующим образом.

gcc-8 -fopenmp hello.c -o hello

Это тоже сработало. Итак, это вывод, когда я запускаю . / Hello

➜  ~ ./hello 
Hello from thread 4, nthreads 8
Hello from thread 7, nthreads 8
Hello from thread 2, nthreads 8
Hello from thread 1, nthreads 8
Hello from thread 6, nthreads 8
Hello from thread 3, nthreads 8
Hello from thread 0, nthreads 8
Hello from thread 5, nthreads 8

Итак, я добавил gcc-8 в конфигурационный файл xgboost, и gcc-8 может работать параллельно с параметром -fopenmp, как вы можете видеть. Однако XGBoost не работает параллельно, хотя я скомпилировал его с этим параметром и установил для параметра nthread значение 8.

Есть ли идея, что я могу попробовать больше?

Редактировать 1 : я пробовал более сложный код, чтобы гарантировать работу пареллализации. Я пытался этот код . Выход показывает 8 потоков работы. Я также вижу это, набрав htop .

➜  ~ clang -fopenmp OpenMP.c -o OpenMP
➜  ~ ./OpenMP 
---- Serial
---- Serial done in 37.058571 seconds.
---- Parallel
---- Parallel done in 9.674641 seconds.
---- Check
Passed

Редактировать 2 : Я установил gcc-7 и проделал тот же процесс. Это тоже не сработало.

...