Xgboost: Une meilleure installation de XGBoost sur Mac OSX ?

Créé le 17 mai 2019  ·  28Commentaires  ·  Source: dmlc/xgboost

Publier

Actuellement sur MacOS, le processus d'installation du package python est le suivant.

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

Question

Ce que j'aimerais apprendre d'un contributeur plus expérimenté, c'est s'il est prévu de simplifier ce processus d'installation ? Ce qui précède n'est pas valable pour un système d'installation automatisé pour tout paquet qui dépend de xgboost. Que faudrait-il pour rendre xgboost compatible avec le clang d'Apple.

1.0.0 Blocking

Commentaire le plus utile

La formule a été acceptée par Homebrew, donc les utilisateurs de Mac peuvent maintenant faire :

brew install xgboost

Tous les 28 commentaires

Le clang d'Apple ne prend pas en charge OpenMP prêt à l'emploi, donc Homebrew GCC est nécessaire. Donc, non, XGBoost ne sera pas compatible avec le clang d'Apple.

Je pense que nous pouvons simplifier le processus en distribuant des roues binaires pour Mac OSX. Les roues binaires contiendront libxgboost.dylib pré-construit afin que l'utilisateur n'ait pas besoin d'avoir un compilateur. (C'est ainsi que les utilisateurs Windows n'ont pas besoin d'installer Visual Studio pour utiliser XGBoost.)

Cependant, je crains que les mainteneurs (y compris moi-même) ne soient actuellement pas familiarisés avec l'empaquetage binaire avec Mac OSX, c'est-à-dire comment créer des binaires qui seraient largement compatibles entre plusieurs versions d'OSX. Avez-vous des suggestions ici?

Pour l'instant, vous devriez envisager d'utiliser conda-forge pour automatiser l'installation de XGBoost sur Mac OSX.

@hcho3 merci pour votre réponse rapide ! Conda est certainement une option mais il serait beaucoup plus simple d'utiliser pip. Je vais regarder à quoi ressemblerait l'emballage binaire sur macos. Je ne suis pas non plus familier avec l'empaquetage binaire, donc la contribution de toute autre personne ayant de l'expérience dans ce domaine serait très appréciée.

J'ai eu quelques difficultés avec ce problème car le dylib produit par le processus de compilation standard dépend fortement des bibliothèques de l'homebrew gcc. Si quelqu'un a un moyen de changer cette dépendance après la compilation (ou de la rendre générique sur les versions de gcc), ce serait formidable, mais je ne pense pas que macOS soit livré avec libgomp (qui fournit le support OpenMP), nous devrons donc peut-être l'emballer comme bien, ce qui rend la vie difficile.

@Craigacp @hcho3 Est-ce quelque chose que nous pourrions envisager jusqu'à ce qu'une solution de contournement cmakelists soit trouvée. https://github.com/netket/netket/issues/225#issuecomment -502714445. Je ne suis pas très familier avec les composants internes de xgboost, à quel point OpenMP est critique pour les performances de la bibliothèque.

Cela semblait également prometteur, mais je n'ai pas réussi à le faire fonctionner : https://stackoverflow.com/questions/46414660/macos-cmake-and-openmp.

@adithyabsk @Craigacp OpenMP est très critique pour les performances de XGBoost, car nous voulons utiliser tous les cœurs disponibles des processeurs multicœurs couramment disponibles sur les systèmes des utilisateurs. Sans OpenMP, vous ne pourriez utiliser qu'un seul cœur de processeur.

À mon humble avis, pip n'est pas conçu pour gérer des dépendances externes telles que libomp. D'autre part, conda est capable de gérer tout aussi facilement les dépendances non-Python. Voir cet article : https://jakevdp.github.io/blog/2016/08/25/conda-myths-and-misconceptions/

Comment Microsoft/LightGBM résout le problème : ils demandent aux utilisateurs d'exécuter brew install libomp . Je ne sais pas si c'est plus simple que d'installer GCC ou Conda, car vous devrez d'abord installer Homebrew.

@ hcho3 la solution brew install libomp pourrait être meilleure car elle peut être fournie dans les scripts de configuration de pré-installation alors qu'actuellement, il faut séparer xgboost dans les pipelines CI pour spécifier les versions gcc et g++ appropriées. Absolument, je suis d'accord avec vous en ce qui concerne conda et cela pourrait finir par être la seule solution, mais je voulais juste explorer les autres options pour voir si autre chose était possible.

Désolé pour la question idiote, mais OpenMP est-il requis au moment de l'exécution ? Par exemple, pourrions-nous compiler dmlc-core et xgboost avec OpenMP installé, puis regrouper ce fichier dans une roue afin que la compilation ne soit pas nécessaire au moment de l'installation à l'aide d'un outil comme audit_wheel ?

https://stackoverflow.com/a/42106034

@adithyabsk Je viens d'essayer d'utiliser brew install libomp et maintenant je peux compiler XGBoost avec le compilateur par défaut, Apple Clang :

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

De plus, le binaire résultant libxgboost.dylib ne dépend que de /usr/local/opt/libomp/lib/libomp.dylib et des bibliothèques système OSX. (Plus de dépendance à une version spécifique de GCC ! Hourra !) Donc, je suppose que brew install libomp est le moyen le moins pénible d'installer XGBoost sur Mac OSX sans Conda.

Cependant, la distribution de binaires pré-compilés reste délicate. Même si nous devions inclure libomp.dylib à l'intérieur de la roue, Mac OSX n'utilisera pas le fichier, car la dépendance de la bibliothèque partagée est spécifiée avec le chemin complet :

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

D'autre part, Windows est plus flexible lorsqu'il s'agit de localiser les bibliothèques partagées. J'ai trouvé suffisant d'inclure simplement vcomp140.dll (OpenMP runtime) dans la roue.

@ hetong007 Remarque connexe : brew install libomp devrait également activer le multithreading pour CRAN XGBoost sur Mac OSX

@ hcho3 Je pense que oui. Le package XGBoost R appelle la même API backend et devrait donc se comporter de la même manière.

@ hcho3 C'est un développement génial ! Je vais déjà dans la bonne direction car je peux attester que dans de nombreux laboratoires de R&D, l'installation de xgboost est un problème pour ceux qui ne connaissent pas intimement ses exigences internes.

Suite à cette note :

Mac OSX n'utilisera pas le fichier, car la dépendance de la bibliothèque partagée est spécifiée avec le chemin complet

Peut-être pourrions-nous examiner davantage ce problème particulier pour voir s'il existe des solutions de contournement pour obtenir le libomp.dylib dans la roue binaire.

@hcho3 pourrait aussi être à cause de l'extension elle-même ? Devrions-nous également utiliser .so sur macOS. Ce fil de discussion et cet article de stackoverflow semblent l'indiquer.
https://stackoverflow.com/questions/2488016/how-to-make-python-load-dylib-on-osx
https://github.com/MoDeNa-EUProject/MoDeNa/issues/1

@adithyabsk Compte tenu de la complexité de l'expédition de la bibliothèque d'exécution dans la roue (et de son chargement), réglons-nous avec brew install libomp .

  • Homebrew est déjà assez largement utilisé par les utilisateurs expérimentés (je pense).
  • Avec libomp , nous pouvons utiliser Apple Clang pour compiler XGBoost, éliminant ainsi la dépendance à une version spécifique de Homebrew GCC.
  • Cette méthode a été vérifiée par d'autres projets, tels que LightGBM.

Ps. Je regarde https://iscinumpy.gitlab.io/post/omp-on-high-sierra/ pour comprendre l'utilisation d'OpenMP dans Apple Clang.

@hcho3

Ps. Je regarde https://iscinumpy.gitlab.io/post/omp-on-high-sierra/ pour comprendre l'utilisation d'OpenMP dans Apple Clang.

Ces RP peuvent vous aider :
https://github.com/microsoft/LightGBM/pull/1501 , https://github.com/microsoft/LightGBM/pull/1923.

@adithyabsk C'est l'une de mes priorités. J'aimerais faire un correctif avant la version 1.0.0.

@hcho3 Heureux de l'entendre ! Je vais voir si je peux aussi bricoler ce problème.

@adithyabsk Un problème subtil que j'ai rencontré brew install libomp est que XGBoost serait compilé sans OpenMP, car CMakeLists.txt n'a pas été configuré correctement. (Je pourrais le dire en exécutant un travail modérément lourd sur mon Macbook ; sans OpenMP, les travaux prendront 2 à 3 fois plus de temps.) J'essaie de réviser CMakeLists.txt pour activer correctement OpenMP.

@StrikerRUS Merci pour le lien. Faire fonctionner le système de construction est assez difficile, et cela m'aide beaucoup d'avoir un point de référence (LightGBM).

@adithyabsk Un problème subtil que j'ai rencontré brew install libomp est que XGBoost serait compilé sans OpenMP, car CMakeLists.txt n'a pas été configuré correctement. (Je pourrais le dire en exécutant un travail modérément lourd sur mon Macbook ; sans OpenMP, les travaux prendront 2 à 3 fois plus de temps.) J'essaie de réviser CMakeLists.txt pour activer correctement OpenMP.

De la chance ? La raison pour laquelle je demande est que "pip install xgboost -U" échoue même après l'installation de libomp via "brew install libomp".

@ wel51x Nous n'avons pas encore modifié CMakeLists.txt pour que la nouvelle solution fonctionne. Pour l'instant, vous devez suivre les instructions dans https://xgboost.readthedocs.io/en/latest/build.html.

@adithyabsk @Craigacp J'ai trouvé https://github.com/matthew-brett/delocate. Cela peut être une solution utile pour supprimer les dépendances de bibliothèque codées en dur.

Au cas où quelqu'un le trouverait utile ... Je comprends que ce n'est en aucun cas une approche courante, mais le dernier xgboost avec prise en charge d'OpenMP peut être installé sur MacOS en utilisant Nix (https://nixos.org/nix/) aussi trivialement que

$ nix-shell -p python3Packages.xgboost

@hcho3 , j'ai créé une formule Homebrew pour XGBoost afin de simplifier l'installation sur Mac, afin que les utilisateurs puissent exécuter brew install xgboost à l'avenir. Cela fonctionne très bien, mais ne sera malheureusement pas accepté avec une ancienne version de GCC.

Débat : https://github.com/Homebrew/homebrew-core/pull/43246

Une option consiste à désactiver OpenMP, mais comme vous l'avez mentionné, ce n'est pas génial pour les performances. Si vous êtes en mesure de valider les modifications pour que cela fonctionne avec libomp , je peux mettre à jour la formule et nous pouvons faire avancer cela.

Merci pour les mises à jour.

fwiw, j'ai mis à jour la formule pour qu'elle ne dépende plus de GCC mais ne supporte pas OpenMP. Nous pourrons le mettre à jour une fois que la prise en charge de libomp sera publiée.

La formule a été acceptée par Homebrew, donc les utilisateurs de Mac peuvent maintenant faire :

brew install xgboost

J'ai utilisé brew install xgboost mais je ne peux toujours pas importer XGBoost. Il n'y a pas de fichier __init__.py ou quoi que ce soit dans le répertoire XGBoost nouvellement installé, donc je ne peux utiliser aucune des fonctions XGBoost. Y a-t-il une autre étape après avoir utilisé brew pour installer XGBoost ?

@bnicholl Voir https://github.com/dmlc/xgboost/issues/4949#issuecomment -542333666 pour une solution temporaire.

@hcho3

Merci pour le lien. Faire fonctionner le système de construction est assez difficile, et cela m'aide beaucoup d'avoir un point de référence (LightGBM).

Avec la version CMake 3.16 entrante (en phase RC maintenant), cela devrait être encore plus simple : il ne sera pas nécessaire de transmettre des arguments supplémentaires pour les utilisateurs >=Mojave. Reportez-vous à https://gitlab.kitware.com/cmake/cmake/merge_requests/3916.

@adithyabsk @Craigacp #5146 devrait maintenant vous permettre d'utiliser OpenMP sans installer Homebrew GCC. Désormais, XGBoost ne dépendra que du package libomp Homebrew.

@ankane Par conséquent, nous devrions pouvoir soumettre la prochaine version de XGBoost (1.0) avec OpenMP activé.

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

pplonski picture pplonski  ·  3Commentaires

uasthana15 picture uasthana15  ·  4Commentaires

frankzhangrui picture frankzhangrui  ·  3Commentaires

lizsz picture lizsz  ·  3Commentaires

vkuznet picture vkuznet  ·  3Commentaires