Xgboost: Melhor instalação do XGBoost no Mac OSX?

Criado em 17 mai. 2019  ·  28Comentários  ·  Fonte: dmlc/xgboost

Emitir

Atualmente no MacOS o processo para instalar o pacote python é o seguinte.

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

Pergunta

O que eu gostaria de saber com um colaborador mais experiente é se existem planos para simplificar esse processo de instalação? O acima não é sustentável para um sistema de instalação automatizado para qualquer pacote que dependa do xgboost. O que seria necessário para tornar o xgboost compatível com o clang da Apple.

1.0.0 Blocking

Comentários muito úteis

A fórmula foi aceita pelo Homebrew, então os usuários de Mac agora podem fazer:

brew install xgboost

Todos 28 comentários

O clang da Apple não suporta OpenMP de fábrica, portanto, o Homebrew GCC é necessário. Portanto, não, o XGBoost não será compatível com o clang da Apple.

Acho que podemos simplificar o processo distribuindo rodas binárias para Mac OSX. As rodas binárias conterão libxgboost.dylib pré-construído para que o usuário não precise ter nenhum compilador. (É assim que os usuários do Windows não precisam ter o Visual Studio instalado para usar o XGBoost.)

No entanto, temo que os mantenedores (inclusive eu) atualmente não estejam familiarizados com empacotamento binário com Mac OSX, ou seja, como fazer binários que seriam amplamente compatíveis em várias versões do OSX. Você tem alguma sugestão aqui?

Por enquanto, você deve considerar o uso do conda-forge para automatizar a instalação do XGBoost no Mac OSX.

@hcho3 obrigado pela sua resposta rápida! Conda certamente é uma opção, mas seria muito mais simples usar pip. Verei como seria o empacotamento binário em macos. Eu também não estou familiarizado com empacotamento binário, então a entrada de qualquer outra pessoa que tenha experiência nessa área seria muito apreciada.

Eu tive alguma dificuldade com esse problema, pois o dylib produzido pelo processo de compilação padrão tem uma forte dependência das bibliotecas do homebrew gcc. Se alguém tiver uma maneira de alterar essa dependência após a compilação (ou torná-la genérica nas versões do gcc), isso seria ótimo, mas não acho que o macOS seja fornecido com libgomp (que fornece suporte a OpenMP), então podemos precisar empacotar isso como bem, o que torna a vida difícil.

@Craigacp @hcho3 Isso é algo que poderíamos considerar até que uma solução alternativa de cmakelists seja encontrada. https://github.com/netket/netket/issues/225#issuecomment -502714445. Eu não estou muito familiarizado com os componentes internos do xgboost, quão crítico é o OpenMP para o desempenho da biblioteca.

Isso também parecia promissor, mas não consegui fazê-lo funcionar: https://stackoverflow.com/questions/46414660/macos-cmake-and-openmp.

@adithyabsk @Craigacp OpenMP é muito crítico para o desempenho do XGBoost, pois queremos usar todos os núcleos disponíveis de CPUs multi-core comumente disponíveis nos sistemas dos usuários. Sem o OpenMP, você poderia usar apenas um núcleo de CPU.

IMHO, o pip não foi projetado para lidar com dependências externas como libomp. Por outro lado, o conda é capaz de lidar com dependências não Python com a mesma facilidade. Veja este post: https://jakevdp.github.io/blog/2016/08/25/conda-myths-and-misconceptions/

Como a Microsoft/LightGBM resolve o problema: eles pedem aos usuários que executem brew install libomp . Não tenho certeza se isso é mais fácil do que instalar o GCC ou o Conda, pois você precisará primeiro instalar o Homebrew.

@hcho3 , a solução brew install libomp pode ser melhor, pois pode ser fornecida em scripts de configuração de pré-instalação, enquanto, atualmente, é necessário separar o xgboost nos pipelines de CI para especificar as versões apropriadas do gcc e g ++. Definitivamente, concordo com você no que diz respeito ao conda e isso pode acabar sendo a única solução, mas eu só queria explorar as outras opções para ver se mais alguma coisa era possível.

Desculpe a pergunta boba, mas o OpenMP é necessário em tempo de execução? Por exemplo, poderíamos compilar o dmlc-core e o xgboost com o OpenMP instalado e, em seguida, agrupar esse arquivo em uma roda para que a compilação não fosse necessária no momento da instalação usando uma ferramenta como audit_wheel ?

https://stackoverflow.com/a/42106034

@adithyabsk Acabei de tentar usar brew install libomp e agora consigo compilar o XGBoost com o compilador padrão, Apple Clang:

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

Além disso, o binário resultante libxgboost.dylib depende apenas das bibliotecas do sistema /usr/local/opt/libomp/lib/libomp.dylib e OSX. (Não há mais dependência de uma versão específica do GCC! Viva!) Então, suponho que brew install libomp seja a maneira menos dolorosa de instalar o XGBoost no Mac OSX sem o Conda.

Distribuir binários pré-compilados ainda é complicado, no entanto. Mesmo se incluíssemos libomp.dylib dentro da roda, o Mac OSX não usaria o arquivo, pois a dependência da biblioteca compartilhada é especificada com o caminho completo :

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

Por outro lado, o Windows é mais flexível quando se trata de localizar bibliotecas compartilhadas. Achei suficiente simplesmente incluir vcomp140.dll (tempo de execução OpenMP) dentro da roda.

@hetong007 Nota relacionada: brew install libomp também deve habilitar multi-threading para CRAN XGBoost no Mac OSX

@hcho3 Acho que sim. O pacote XGBoost R chama a mesma API de back-end, portanto, deve se comportar da mesma forma.

@hcho3 Isso é um desenvolvimento incrível! Já estou indo na direção certa, pois posso atestar que, em muitos laboratórios de P&D, a instalação do xgboost é um ponto problemático para aqueles que não estão intimamente familiarizados com seus requisitos internos.

Acompanhando esta nota:

O Mac OSX não usará o arquivo, pois a dependência da biblioteca compartilhada é especificada com o caminho completo

Talvez pudéssemos analisar mais esse problema em particular para ver se há alguma solução alternativa para colocar o libomp.dylib na roda binária.

@hcho3 também pode ser por causa da própria extensão? Devemos usar .so no macOS também. Este tópico de problema e a postagem de stackoverflow parecem indicar isso.
https://stackoverflow.com/questions/2488016/how-to-make-python-load-dylib-on-osx
https://github.com/MoDeNa-EUProject/MoDeNa/issues/1

@adithyabsk Dada a complexidade de enviar a biblioteca de tempo de execução na roda (e fazer com que ela seja carregada), vamos resolver com brew install libomp .

  • Homebrew é bastante usado já entre usuários avançados (eu acho).
  • Com libomp , podemos usar o Apple Clang para compilar o XGBoost, eliminando assim a dependência de uma versão específica do Homebrew GCC.
  • Este método foi verificado por outros projetos, como LightGBM.

Ps. Estou olhando https://iscinumpy.gitlab.io/post/omp-on-high-sierra/ para entender o uso do OpenMP no Apple Clang.

@hcho3

Ps. Estou olhando https://iscinumpy.gitlab.io/post/omp-on-high-sierra/ para entender o uso do OpenMP no Apple Clang.

Esses PRs podem ajudá-lo:
https://github.com/microsoft/LightGBM/pull/1501 , https://github.com/microsoft/LightGBM/pull/1923.

@adithyabsk Essa é uma das minhas prioridades. Eu gostaria de fazer uma correção antes do lançamento 1.0.0.

@hcho3 Fico feliz em ouvir isso! Vou ver se consigo mexer nessa questão também.

@adithyabsk Um problema sutil que encontrei brew install libomp é que o XGBoost seria compilado sem o OpenMP, porque o CMakeLists.txt não foi configurado corretamente. (Eu poderia dizer executando um trabalho moderadamente pesado no meu Macbook; sem o OpenMP, os trabalhos levarão de 2 a 3 vezes mais.) Estou tentando revisar CMakeLists.txt para habilitar corretamente o OpenMP.

@StrikerRUS Obrigado pelo link. Fazer o sistema de compilação funcionar é bastante difícil e me ajuda muito a ter um ponto de referência (LightGBM).

@adithyabsk Um problema sutil que encontrei brew install libomp é que o XGBoost seria compilado sem o OpenMP, porque o CMakeLists.txt não foi configurado corretamente. (Eu poderia dizer executando um trabalho moderadamente pesado no meu Macbook; sem o OpenMP, os trabalhos levarão de 2 a 3 vezes mais.) Estou tentando revisar CMakeLists.txt para habilitar corretamente o OpenMP.

Alguma sorte? A razão pela qual pergunto é que "pip install xgboost -U" falha mesmo depois de instalar o libomp via "brew install libomp".

@wel51x Ainda não modificamos CMakeLists.txt para que a nova solução funcione. Por enquanto, você deve seguir as instruções em https://xgboost.readthedocs.io/en/latest/build.html.

@adithyabsk @Craigacp Encontrei https://github.com/matthew-brett/delocate. Esta pode ser uma solução útil para remover dependências de bibliotecas codificadas.

Caso alguém ache útil... Eu entendo que não é de forma alguma uma abordagem convencional, mas o mais recente xgboost com suporte a OpenMP pode ser instalado no MacOS usando o Nix (https://nixos.org/nix/) tão trivialmente quanto

$ nix-shell -p python3Packages.xgboost

Ei @hcho3 , criei uma fórmula Homebrew para o XGBoost para ajudar a simplificar a instalação no Mac, para que os usuários possam executar brew install xgboost no futuro. Funciona muito bem, mas infelizmente não será aceito usando uma versão mais antiga do GCC.

Discussão: https://github.com/Homebrew/homebrew-core/pull/43246

Uma opção é desabilitar o OpenMP, mas como você mencionou, não é ótimo para desempenho. Se você conseguir confirmar as alterações para que funcionem com libomp , posso atualizar a fórmula e podemos avançar.

Obrigado pelas atualizações.

fwiw, atualizei a fórmula para que ela não dependa mais do GCC, mas não tenha suporte para OpenMP. Podemos atualizá-lo assim que o suporte para libomp for lançado.

A fórmula foi aceita pelo Homebrew, então os usuários de Mac agora podem fazer:

brew install xgboost

Eu usei brew install xgboost mas ainda não consigo importar o XGBoost. Não há nenhum arquivo __init__.py ou qualquer coisa dentro do diretório real do XGBoost recém-instalado, então não posso usar nenhuma das funções do XGBoost. Existe outra etapa depois de usar o brew para instalar o XGBoost?

@bnicholl Consulte https://github.com/dmlc/xgboost/issues/4949#issuecomment -542333666 para obter uma solução temporária.

@hcho3

Obrigado pelo link. Fazer o sistema de compilação funcionar é bastante difícil, e me ajuda muito a ter um ponto de referência (LightGBM).

Com o lançamento do CMake 3.16 (na fase RC agora) deve ser ainda mais fácil: não haverá necessidade de passar argumentos extras para usuários >=Mojave. Consulte https://gitlab.kitware.com/cmake/cmake/merge_requests/3916.

@adithyabsk @Craigacp #5146 agora deve permitir que você use o OpenMP sem instalar o Homebrew GCC. Agora o XGBoost dependerá apenas do pacote libomp Homebrew.

@ankane Consequentemente, devemos poder enviar a próxima versão do XGBoost (1.0) com o OpenMP ativado.

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

ivannz picture ivannz  ·  3Comentários

hx364 picture hx364  ·  3Comentários

choushishi picture choushishi  ·  3Comentários

trivialfis picture trivialfis  ·  3Comentários

lizsz picture lizsz  ·  3Comentários