Я использую среду 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 и проделал тот же процесс. Это тоже не сработало.