Собираем XGBoost под OS X

от автора

XGBoost — С++ библиотека, реализующая методы градиентного бустинга, которую все чаще можно встретить в описаниях алгоритмов-победителей на Kaggle. Для использования из R или Python есть соответствующие обвязки, но саму библиотеку необходимо собрать из исходников. Запустив make, я увидел массу ошибок, сообщающих о ненайденных хидерах и неподдерживаемом OpenMP. Ну, не впервой.

План следующий:

  1. Скачать XCode
  2. Установить command line tools
  3. Собрать Clang c поддержкой OpenMP
  4. Собрать Intel OpenMP библиотеку
  5. Прописать путь к OpenMP библиотеке и соответствующим хидерам
  6. Собрать XGBoost
  7. Установить обвязку для Python
  8. Покорять топы лидербордов на Kaggle

1. Скачать XCode
XCode можно совершенно бесплатно скачать из App Store. После установки, набрав в командной строке терминала gcc -v, мы должны увидеть на экране примерно следующее:

Configured with: --prefix=/Applications/Xcode.app/Contents/Developer//usr --with-gxx-include-dir=/usr/include/c++/4.2.1 Apple LLVM version 6.1.0 (clang-602.0.53) (based on LLVM 3.6.0svn) Target: x86_64-apple-darwin14.3.0 Thread model: posix 

2. Установить command line tools
Если пропустить этот шаг, компилятор не сможет найти стандартные библиотеки C и C++. В терминале необходимо запустить

xcode-select --install 

и следовать инструкциям.

3. Собрать Clang c поддержкой OpenMP
Эта версия компилятора поддерживает OpenMP-инструкции для распараллеливания и разрабатывается сотрудниками Intel. Можно надеяться, что в один прекрасный день эта ветка вольется обратно в транк, и OpenMP будет доступно в оригинальном Clang из коробки. Судя по всему, некоторое время назад можно было установить clang-omp с помощью brew, но это счастливое время прошло. Итак, собираем компилятор:

mkdir clang-omp && cd clang-omp git clone https://github.com/clang-omp/llvm git clone https://github.com/clang-omp/compiler-rt llvm/projects/compiler-rt git clone -b clang-omp https://github.com/clang-omp/clang llvm/tools/clang mkdir build && cd build cmake ../llvm -DCMAKE_BUILD_TYPE=Release make -j 4 

Если ядер на машине больше 4, имеет смысл поправить цифру в последней команде.

4. Собрать Intel OpenMP библиотеку
Библиотека для поддержки OpenMP так же собирается из исходников. Скачиваем, распаковываем, собираем:

mkdir build && cd build cmake .. make -j 4 

5. Прописать путь к OpenMP библиотеке и соответствующим хидерам
Чтобы компилятор и линкер при сборке XGBoost смогли найти необходимые им компоненты, нужно прописать к ним пути. Для этого необходимо добавить в ~/.bash_profile следующие строки:

export C_INCLUDE_PATH=PATH_TO_LIBOMP/libomp/exports/common/include/:$C_INCLUDE_PATH export CPLUS_INCLUDE_PATH=PATH_TO_LIBOMP/libomp/exports/common/include/:$CPLUS_INCLUDE_PATH export LIBRARY_PATH=PATH_TO_LIBOMP/libomp/exports/mac_32e/lib/:$LIBRARY_PATH export DYLD_LIBRARY_PATH=PATH_TO_LIBOMP/libomp/exports/mac_32e/lib/:$LD_LIBRARY_PATH 

Как можно догадаться, PATH_TO_LIBOMP — путь к папке, где лежит библиотека. Чтобы изменения вступили в силу, необходимо выполнить команду

source ~/.bash_profile 

Необходимо убедиться, что все работает корректно. Для этого создадим программу-сэмпл

#include <omp.h> #include <stdio.h> #include <iostream>  int main(int argc, char** argv) {     std::cout << "Hello!" << std::endl;     #pragma omp parallel     printf("Hello from thread %d, nthreads %d\n", omp_get_thread_num(), omp_get_num_threads());     return 0; }  

и попытаемся ее скомпилировать:

PATH_TO_CLANGOMP/clang-omp/build/bin/clang++ sample.cpp -o sample -fopenmp 

Если все хорошо, запустив программу, мы увидим на экране сообщения из нескольких тредов.

6. Собрать XGBoost
Мы почти у цели. В папке xgboost лежит Makefile, первые строчки которого необходимо отредактировать следующим образом:

export CC  = PATH_TO_CLANGOMP/clang-omp/build/bin/clang export CXX = PATH_TO_CLANGOMP/clang-omp/build/bin/clang++ export MPICXX = mpicxx export LDFLAGS= -pthread -lm  export CFLAGS = -Wall -O3 -msse2 -Wno-unknown-pragmas -funroll-loops -fopenmp 

Собираем:

make -j 4 

Победа.

7. Установить обвязку для Python

cd wrapper python setup.py install 

Убедиться, что обвязка XGBoost работает должным образом, можно с помощью демо-скриптов, лежащих в xgboost/demo.

8. Покорять топы лидербордов на Kaggle
Внезапно отключилось электричество, и эта самая важная часть, к сожалению, была утрачена и будет освещена в дальнейшем.

ссылка на оригинал статьи https://habrahabr.ru/post/277189/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *