Xgboost: Лучшая установка XGBoost на Mac OSX?

Созданный на 17 мая 2019  ·  28Комментарии  ·  Источник: dmlc/xgboost

Проблема

В настоящее время в MacOS процесс установки пакета python выглядит следующим образом.

$ brew install gcc<strong i="7">@5</strong>
$ export CC=/path/to/gcc-5; export CXX=/path/to/g++-5; pip install xgboost

Вопрос

Что я хотел бы узнать от более опытного участника, так это есть ли какие-либо планы по упрощению этого процесса установки? Вышеупомянутое неприемлемо для системы автоматической установки любого пакета, зависящего от xgboost. Что потребуется, чтобы сделать xgboost совместимым с clang от Apple.

1.0.0 Blocking

Самый полезный комментарий

Формула была принята Homebrew, поэтому пользователи Mac теперь могут:

brew install xgboost

Все 28 Комментарий

Clang от Apple не поддерживает OpenMP из коробки, поэтому нужен Homebrew GCC. Так что нет, XGBoost не будет совместим с clang от Apple.

Я думаю, мы можем упростить процесс, распространяя бинарные диски для Mac OSX. Бинарные колеса будут содержать предварительно созданную libxgboost.dylib, так что пользователю не потребуется компилятор. (Вот почему пользователям Windows не нужно устанавливать Visual Studio для использования XGBoost.)

Однако я боюсь, что сопровождающие (включая меня) в настоящее время не знакомы с компоновкой бинарных файлов для Mac OSX, т.е. с тем, как создавать бинарные файлы, которые были бы широко совместимы между несколькими версиями OSX. Есть ли у вас какие-либо предложения здесь?

На данный момент вам следует рассмотреть возможность использования conda-forge для автоматизации установки XGBoost на Mac OSX.

@hcho3 спасибо за быстрый ответ! Conda, безусловно, является вариантом, но было бы намного проще использовать pip. Я посмотрю, как будет выглядеть бинарная упаковка на macos. Я также не знаком с бинарной упаковкой, поэтому любой другой, кто имеет опыт в этой области, будет очень признателен.

У меня были некоторые трудности с этой проблемой, поскольку dylib, созданный стандартным процессом компиляции, имеет жесткую зависимость от библиотек доморощенного gcc. Если у кого-то есть способ изменить эту зависимость после компиляции (или сделать ее универсальной для версий gcc), это было бы здорово, но я не думаю, что macOS поставляется с libgomp (который обеспечивает поддержку OpenMP), поэтому нам может понадобиться упаковать это как ну, что усложняет жизнь.

@Craigacp @hcho3 Можем ли мы рассмотреть это, пока не будет найден обходной путь cmakelists. https://github.com/netket/netket/issues/225#issuecomment-502714445 . Я не очень хорошо знаком с внутренностями xgboost, насколько критичен OpenMP для производительности библиотеки.

Это также казалось многообещающим, но мне не удалось заставить его работать: https://stackoverflow.com/questions/46414660/macos-cmake-and-openmp.

@adithyabsk @Craigacp OpenMP очень важен для производительности XGBoost, поскольку мы хотим использовать все доступные ядра многоядерных процессоров, обычно доступных в системах пользователей. Без OpenMP вы сможете использовать только одно ядро ​​процессора.

ИМХО, pip не предназначен для обработки таких внешних зависимостей, как libomp. С другой стороны, conda так же легко справляется с зависимостями, отличными от Python. Смотрите этот пост: https://jakevdp.github.io/blog/2016/08/25/conda-myths-and-misconceptions/

Как Microsoft/LightGBM решает проблему: они просят пользователей запустить brew install libomp . Я не уверен, что это проще, чем установка GCC или Conda, так как вам нужно будет сначала установить Homebrew.

@ hcho3 решение brew install libomp может быть лучше, поскольку оно может быть предоставлено в сценариях предварительной установки, тогда как в настоящее время необходимо отделить xgboost в конвейерах CI, чтобы указать соответствующие версии gcc и g++. Определенно, согласен с вами в том, что касается conda, и это может оказаться единственным решением, но я просто хотел изучить другие варианты, чтобы увидеть, возможно ли что-то еще.

Извините за глупый вопрос, но требуется ли OpenMP во время выполнения? Например, можем ли мы скомпилировать dmlc-core и xgboost с установленным OpenMP, а затем объединить этот файл в колесо, чтобы не было необходимости в компиляции во время установки с помощью такого инструмента, как audit_wheel ?

https://stackoverflow.com/a/42106034

@adithyabsk Я только что попытался использовать brew install libomp , и теперь я могу скомпилировать XGBoost с компилятором по умолчанию, Apple Clang:

brew install libomp
mkdir build
cd build
cmake ..
make -j10

Более того, полученный двоичный файл libxgboost.dylib зависит только от /usr/local/opt/libomp/lib/libomp.dylib и системных библиотек OSX. (Больше нет зависимости от конкретной версии GCC! Ура!) Поэтому я полагаю, что brew install libomp — наименее болезненный способ установить XGBoost на Mac OSX без Conda.

Однако распространение предварительно скомпилированных двоичных файлов по-прежнему сложно. Даже если бы мы включили libomp.dylib внутрь колеса, Mac OSX не будет использовать этот файл, так как зависимость общей библиотеки указана с полным путем :

hcho3<strong i="17">@localhost</strong>: xgboost$ otool -l libxgboost.dylib    # show list of library dependencies

libxgboost.dylib:
Mach header
      magic cputype cpusubtype  caps    filetype ncmds sizeofcmds      flags
 0xfeedfacf 16777223          3  0x00           6    15       2112 0x00918085
....
Load command 10
          cmd LC_LOAD_DYLIB
      cmdsize 64
         name /usr/local/opt/libomp/lib/libomp.dylib (offset 24)
   time stamp 2 Wed Dec 31 16:00:02 1969
      current version 5.0.0
compatibility version 5.0.0
Load command 11
          cmd LC_LOAD_DYLIB
      cmdsize 48
         name /usr/lib/libc++.1.dylib (offset 24)
   time stamp 2 Wed Dec 31 16:00:02 1969
      current version 400.9.0
compatibility version 1.0.0
Load command 12
          cmd LC_LOAD_DYLIB
      cmdsize 56
         name /usr/lib/libSystem.B.dylib (offset 24)
   time stamp 2 Wed Dec 31 16:00:02 1969
      current version 1252.50.4
compatibility version 1.0.0

С другой стороны, Windows более гибкая, когда дело доходит до поиска общих библиотек. Я счел достаточным просто включить vcomp140.dll (среда выполнения OpenMP) внутри колеса.

@hetong007 hetong007 Примечание по теме: brew install libomp также должен включать многопоточность для CRAN XGBoost на Mac OSX

@hcho3 Я так думаю. Пакет XGBoost R вызывает один и тот же внутренний API, поэтому должен вести себя одинаково.

@hcho3 Это потрясающая разработка! Я уже двигаюсь в правильном направлении, и я могу засвидетельствовать, что во многих научно-исследовательских лабораториях установка xgboost является проблемой для тех, кто не знаком с его внутренними требованиями.

В продолжение этой заметки:

Mac OSX не будет использовать файл, так как зависимость общей библиотеки указана с полным путем

Возможно, мы могли бы подробнее изучить эту конкретную проблему, чтобы увидеть, есть ли какие-либо обходные пути для включения libomp.dylib в двоичное колесо.

@hcho3 также может быть из-за самого расширения? Должны ли мы использовать .so и в macOS. Этот поток проблем и сообщение stackoverflow, похоже, указывают на это.
https://stackoverflow.com/questions/2488016/how-to-make-python-load-dylib-on-osx
https://github.com/MoDeNa-EUProject/MoDeNa/issues/1

@adithyabsk Учитывая сложность доставки библиотеки времени выполнения в колесо (и ее загрузки), давайте согласимся с brew install libomp .

  • Homebrew довольно широко используется уже среди опытных пользователей (я думаю).
  • С помощью libomp мы можем использовать Apple Clang для компиляции XGBoost, тем самым устраняя жесткую зависимость от конкретной версии Homebrew GCC.
  • Этот метод был проверен другими проектами, такими как LightGBM.

Пс. Я просматриваю https://iscinumpy.gitlab.io/post/omp-on-high-sierra/ , чтобы понять использование OpenMP в Apple Clang.

@hcho3

Пс. Я просматриваю https://iscinumpy.gitlab.io/post/omp-on-high-sierra/ , чтобы понять использование OpenMP в Apple Clang.

Эти PR могут помочь вам:
https://github.com/microsoft/LightGBM/pull/1501 , https://github.com/microsoft/LightGBM/pull/1923.

@adithyabsk Это один из моих приоритетов. Я хотел бы сделать исправление до выпуска 1.0.0.

@hcho3 Рад это слышать! Я посмотрю, смогу ли я возиться с этой проблемой.

@adithyabsk Одна тонкая проблема, с которой я столкнулся, заключается в том, что brew install libomp будет скомпилирован без OpenMP, потому что CMakeLists.txt был настроен неправильно. (Я мог убедиться, запустив умеренно тяжелую работу на моем Macbook; без OpenMP работа будет выполняться в 2-3 раза дольше.) Я пытаюсь пересмотреть CMakeLists.txt, чтобы правильно включить OpenMP.

@StrikerRUS Спасибо за ссылку. Заставить систему сборки работать довольно сложно, и мне очень помогает наличие точки отсчета (LightGBM).

@adithyabsk Одна тонкая проблема, с которой я столкнулся, заключается в том, что brew install libomp будет скомпилирован без OpenMP, потому что CMakeLists.txt был настроен неправильно. (Я мог убедиться, запустив умеренно тяжелую работу на моем Macbook; без OpenMP работа будет выполняться в 2-3 раза дольше.) Я пытаюсь пересмотреть CMakeLists.txt, чтобы правильно включить OpenMP.

При удаче? Причина, по которой я спрашиваю, заключается в том, что «pip install xgboost -U» не работает даже после установки libomp через «brew install libomp».

@ wel51x Мы еще не изменили CMakeLists.txt, чтобы новое решение заработало. На данный момент вы должны следовать инструкциям в https://xgboost.readthedocs.io/en/latest/build.html.

@adithyabsk @Craigacp Я нашел https://github.com/matthew-brett/delocate. Это может быть полезным решением для удаления жестко заданных библиотечных зависимостей.

В случае, если кто-то найдет это полезным... Я понимаю, что это ни в коем случае не основной подход, но последнюю версию xgboost с поддержкой OpenMP можно установить на MacOS с помощью Nix (https://nixos.org/nix/) так же тривиально, как

$ nix-shell -p python3Packages.xgboost

Привет, @hcho3 , я создал формулу Homebrew для XGBoost, чтобы упростить установку на Mac, чтобы пользователи могли запускать brew install xgboost в будущем. Он отлично работает, но, к сожалению, не будет принят с использованием более старой версии GCC.

Обсуждение: https://github.com/Homebrew/homebrew-core/pull/43246

Один из вариантов — отключить OpenMP, но, как вы упомянули, это не очень хорошо для производительности. Если вы сможете зафиксировать изменения, чтобы заставить их работать с libomp , я могу обновить формулу, и мы сможем продвинуть ее вперед.

Спасибо за обновления.

fwiw, я обновил формулу, чтобы она больше не зависела от GCC, но не поддерживала OpenMP. Мы сможем обновить его, как только будет выпущена поддержка libomp .

Формула была принята Homebrew, поэтому пользователи Mac теперь могут:

brew install xgboost

Я использовал brew install xgboost , но все еще не могу импортировать XGBoost. В недавно установленном каталоге XGBoost нет файла __init__.py или чего-либо еще, поэтому я не могу использовать какие-либо функции XGBoost. Есть ли еще один шаг после использования brew для установки XGBoost?

@bnicholl См. https://github.com/dmlc/xgboost/issues/4949#issuecomment -542333666 для временного решения.

@hcho3

Спасибо за ссылку. Заставить систему сборки работать довольно сложно, и мне очень помогает наличие точки отсчета (LightGBM).

С выпуском CMake 3.16 (сейчас на стадии RC) это должно быть еще проще: не будет необходимости передавать дополнительные аргументы для >= пользователей Mojave. См . https://gitlab.kitware.com/cmake/cmake/merge_requests/3916.

@adithyabsk @Craigacp #5146 теперь должен позволить вам использовать OpenMP без установки Homebrew GCC. Теперь XGBoost будет зависеть только от пакета Homebrew libomp .

@ankane Следовательно, мы сможем представить следующий выпуск XGBoost (1.0) с включенным OpenMP.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги