Xgboost: Falha ao compilar xgboost usando mingw g++ de 64 bits

Criado em 27 mar. 2016  ·  35Comentários  ·  Fonte: dmlc/xgboost

Gostaria de compilar o xgboost para o Anaconda Python 3.x no Windows 10 de 64 bits, então segui os passos aqui - https://xgboost.readthedocs.org/en/latest/build.html#building -on-windows e aqui - Instale o xgboost em python com falha no msys de 64 bits. Usando o mingw g++ de 64 bits, recebi a seguinte mensagem de erro ao "make -j4" usando mingw64.mk:

g++: erro: dmlc-core/libdmlc.a: Arquivo ou diretório inexistente
g++: erro: rabit/lib/librabit_empty.a: Arquivo ou diretório inexistente
Makefile:120 : receita para o destino 'lib/libxgboost.dll' falhou
mingw32-make: *** [lib/libxgboost.dll] Erro 1

Mais detalhes das mensagens de log podem ser encontrados aqui:
log.txt

Você pode por favor me informar o que está acontecendo e como posso resolver isso?

Muito obrigado.

Comentários muito úteis

Todos 35 comentários

Você pode copiar mingw32-make.exe para o diretório git (por exemplo, C:\Program Files\Git\usr\bin), e renomeá-lo para make.exe. Em seguida, execute novamente make -j4 no git shell.

Você precisa construir dmlc-core e rabit diretamente

cd dmlc-core
fazer -j4

cd ../rabit
fazer -j4

mas este falha na minha instalação, tentando entender o porquê.

Pronto, encontrei.

Usando mingw64, você precisa ter mingw32-make em seu caminho. Alias ​​para fazer conforme explicado no guia de instalação.
Você então vai para o diretório xgboost e faz o seguinte
cd dmlc-core
fazer -j4
cd ../rabit
make lib/librabit_empty -j4
CD ..
cp make/mingw64.mk config.mk
fazer -j4

erro de digitação:
no comentário anterior, uma linha deve ler
make lib/librabit_empty.a -j4
em vez de
make lib/librabit_empty -j4

Muito obrigado jfpuget!! Ele finalmente funciona com seus passos acima!

@jfpuget Talvez você possa ajudar a melhorar nossas instruções. Qualquer PR será verdadeiramente bem-vindo.

@jfpuget Isso parece ótimo, você pode fazer um PR para melhorar a instrução antiga. Obrigado!

Claro, farei o mais rápido possível (alguns dias, pois acabei de voltar de férias e as pessoas pensaram em mim no trabalho;))

Olá a todos. Quando 'make -j4' no diretório raiz, tenho esse problema. Você tem algum conselho? THX

Já existe um subdiretório ou compilação de arquivo.
Ocorreu um erro durante o processamento: build.
Makefile:97 : falha na receita para o destino 'build/logging.o'
make: ** [build/logging.o] Erro 1make: * * Aguardando trabalhos inacabados....
A sintaxe do comando está incorreta.
Makefile:97 : receita para o destino 'build/common/common.o' falhou
make: ** [build/common/common.o] Erro 1A sintaxe do comando está incorreta.Makefile:97 : receita para o destino 'build/c_api/c_api_error.o' falhoumake: * * [build/c_api/c_api_error.o] Erro 1

Eu entendi... eu estava usando git cmd... não git bash... É por isso que encontrei o problema.

Também posso compartilhar minhas notas sobre como crio pacotes xgboost R e python no Windows.

Algumas das minhas soluções alternativas eram semelhantes às de Jean-François, mas existem algumas diferenças sutis porque estou usando a cadeia de ferramentas mingw build empacotada com o Rtools. Essencialmente, o Windows é uma bagunça com uma enorme variedade de pacotes baseados em mingw disponíveis hoje em dia com vários graus de integridade, estabilidade e atualização. Mesmo na minha situação que descrevo abaixo, existem três conjuntos de ferramentas baseados em mingw que precisam trabalhar juntos:

  • um conjunto mínimo sem compilador de ferramentas gnu de linha de comando com windows git;
  • um compilador gcc-4.7, mas sem criação com o Anaconda;
  • e um conjunto bastante utilizável que possui o gcc-4.6.3 e o make que vem com o Rtools.

O último é suficiente para as necessidades C++ 11 do xgboost, e não vejo nenhuma razão até agora para envolver mais uma distribuição mingw nessa bagunça. Em tais situações, é fundamental ter muito cuidado com o que entra no PATH e em que ordem.

Algumas notas sobre Rtools:

Eu uso a versão mais recente do pacote Rtools 3.3. No entanto (IMPORTANTE), durante a instalação do Rtools, não instalo o conjunto de ferramentas 3.3 com o gcc 4.9 - ele ainda apresenta alguns problemas. A cadeia de ferramentas 3.2 de 64 bits é suficiente e funciona bem. Como uso mais R, tenho os caminhos do Rtools adicionados ao PATH do meu sistema, mas não os do Miniconda. Sempre que preciso de python sem usar os atalhos do Anaconda, apenas defino os caminhos necessários manualmente.

A compilação do pacote R é bastante trivial:
  • pegue a fonte
  • lançar R
setwd('wherever xgboost R-package directory is')
install.packages('.', repos = NULL, type='source')
setwd('tests')
source('testthat.R')
Construir xgboost exe e bibliotecas precisa de algumas soluções alternativas:
  • assumindo git-bash, dentro do diretório raiz xgboost
  • certifique-se de que which gcc aponta para /c/Rtools/gcc-4.6.3/bin/gcc (dependendo de onde o Rtools foi instalado)
  • edite rabit/Makefile e adicione o sinalizador -m64 à linha de definição CFLAGS (não deveria estar lá em primeiro lugar?): export CFLAGS = -m64 -O3 -msse2 $(WARNFLAGS)
  • o seguinte deve funcionar agora (precisa executar make em vários estágios aqui devido a algumas interações/peculiaridades/bugs do pacote mingw):
cp make/mingw64.mk config.mk
cp make/mingw64.mk dmlc-core/config.mk
cd rabit
make lib/librabit_empty.a -j4
cd ../dmlc-core
make -j4
cd ..
make -j4
Pacote Python:
export PATH=/c/Miniconda/Scripts:/c/Miniconda:/C/Miniconda/MinGW/bin:$PATH
cd python-package/
python setup.py install
python tests/python/test_basic_models.py

Você está certo: se você já tem um compilador g++ funcionando, então você não precisa instalar outro.

com https://github.com/dmlc/xgboost/pull/1071 , as coisas devem ser mais fáceis

BTW, eu enviei #1071 que permitiria simplesmente executar mingw32-make.exe -j da raiz do projeto para compilar tudo de uma vez, ao usar essa distribuição Mingw recente. O make no Rtools ainda precisa de soluções alternativas...

@jfpuget Estou curioso: você teve algum motivo específico para escolher os threads POSIX e a opção de tratamento de exceção SEH? Por exemplo, acabei de tentar instalar o Win32 e o SJLJ (só porque era isso que o gcc no Rtools usava) e isso parece funcionar.

Uma observação interessante no gcc 5.3: parece gerar o código veio de 64 bits, independentemente de haver o sinalizador -m64 definido para a biblioteca rabit ou não. É por isso que você não teve nenhum erro ao vinculá-lo. O gcc mudou para -m64 como padrão em alguma versão?

Sobre a modificação do PATH dentro do python: se você acabou de modificar o PATH do sistema, o Python do anaconda no Windows às vezes (dependendo de como você o inicia?) Não verifiquei agora, mas tive alguns problemas semelhantes há algum tempo.

@khotilov Acabei de deixar as configurações padrão no instalador mingw64-gw.

Modificar o caminho do sistema não foi bom o suficiente, mesmo se eu reinicializasse o python (na verdade, reiniciei o kernel de dentro de um notebook). Vou verificar novamente por que precisei modificar a variável de caminho os dentro do Python.

Meu objetivo era ter o xgboost funcionando, por isso parei de investigar quando terminei.

@khotilov Não tenho certeza de qual MinGW-w64 com GCC 5.3 você está usando.

Mas em algumas distribuições (talvez a maioria), não há suporte multiarch.

Em xgboost\dmlc-core\include\dmlc\base.h
linha 113

if (definido MINGW32 ) || (definido MINGW64 )

//#define fopen64 std::fopen

fim se

se você estiver usando MINGW64, você deve comentar este fopen64 define desde
mingw64 definiu seu próprio fopen64 no stdio.h

@yunzhou Obrigado. Depois de brincar por uma noite inteira, seu truque realmente funcionou.

Na verdade, meus erros disseram algo errado com o 'base.h'.

@jfpuget : Tentei instalar usando seu link, mas estou recebendo o seguinte erro
Makefile:136 : receita para o destino 'xgboost' falhou

Tenho certeza que fiz tudo conforme seu artigo. Você pode por favor me ajudar? Obrigado

Oi,

não há como obter ajuda a menos que forneça mais informações. Qual é o erro durante a compilação? O que você fornece não é a mensagem de erro, é o resumo.

Por favor, envie o log da compilação sem qualquer edição.

Atenciosamente/Cordialement,JFJean-Francois Puget, PhDDistinguished Engineer, Machine Learning and Optimization, IBM AnalyticsMobile: +33(0)6 7000 8815 Email: jf. [email protected] : http://bit.ly/jfpuget Twitter: @JFPuget


----- Mensagem original -----De: harishneela [email protected] : dmlc/xgboost [email protected] : Jean Francois Puget/France/ IBM@IBMFR , Menção mençã[email protected] : Re: [dmlc/xgboost] Falha ao compilar xgboost usando mingw g++ de 64 bits (#1049)Data: qua, 2 de novembro de 2016 19:51
@jfpuget : Tentei instalar usando seu link, mas estou recebendo o seguinte erro rMakefile:136 : receita para o destino 'xgboost' falhou
Tenho certeza que fiz tudo conforme seu artigo. Você pode por favor me ajudar? Obrigado
—Você está recebendo isso porque foi mencionado.Responda a este e-mail diretamente, visualize-o no GitHub ou silencie o tópico.

Sauf indicação contraire ci-dessus:/ Salvo indicação em contrário acima:
Empresa IBM França
Siège Social : 17 avenue de l'Europe, 92275 Bois-Colombes Cedex
RCS Nanterre 552 118 465
Forma Social: SAS
Capital Social: 657.364.587€
SIREN/SIRET: 552 118 465 03644 - Código NAF 6202A

Mac instalar xgboost

1. Atualize a bebida

Como o brew não foi atualizado após a atualização do Mac para 10.12, encontrei vários pits ao atualizar o brew e agora vou analisá-lo. Não use o brew update diretamente para atualizar o brew, ele reportará um erro. Use a atualização do brew para atualizar o software e o brew será atualizado ativamente durante a atualização de outro software.

2. Instale a versão mais recente do gcc (gcc-6)

brew install gcc --without-multilib

Nota: Se você atualizar o brew, não poderá instalar o gcc.

3. Baixe o código-fonte do Git

Git clone --recursive https://github.com/dmlc/xgboost

Após o download, cd xgboost; cp make/minimum.mk ./config.mk; make -j4 para compilar o xgboost. Até agora, é apenas compilado xgboost. (tente mais algumas vezes, talvez da próxima vez seja bem sucedido)

4. Instale a versão python do xgboost

Porque o xgboost é dividido em versão Python e versão em linguagem R. Devido ao gargalo de desempenho do R, eu uso python, então instale a versão python do xgboost.

Entre no diretório xgboost, e então entre no diretório python-package do xgboost, use o comando: cd python-package/

Execute no diretório python-package: sudo python setup.py install, se o sudo não for adicionado, um erro será relatado:

5. Concluído, eu mesmo instalei, espero que seja útil para outras pessoas

@jfpuget apenas curioso para saber se você está ciente de que essas instruções são válidas em uma máquina POWER8. Estou tentando construir o XGBoost no POWER8 e centos 7. Estou recebendo o mesmo erro que o OP.

Eu não sei.

Olá @jfpuget

Obrigado por seu blog. No entanto, preciso de algumas orientações para concluir a instalação. Recebo um erro quando digito "python setup.py install"

Ele diz "não é possível encontrar a biblioteca xgboost no caminho candidato". Isso significa que eu tenho um erro na instalação antes deste ponto. Não recebi nenhum erro quando segui os passos.

Atenciosamente

Eu segui as instruções do jfpuget para fazer submódulos, então aqui está um erro após o último make,

dmlc-core/libdmlc.a: erro ao adicionar símbolos: O arquivo não tem índice; execute ranlib para adicionar um
collect2.exe: erro: ld retornou 1 status de saída
Makefile:174 : falha na receita para o destino 'xgboost'
make: * [xgboost] Erro 1

Alguém tem ideias?

Obrigado!

@jfpuget Tentei seguir suas instruções no meu sistema operacional Windows várias vezes, mas sempre recebo este erro:
$ cd dmlc-core
$ mingw32-make -j4
g++ -c -O3 -Wall -Wno-unknown-pragmas -Iinclude -std=c++0x -fPIC -DDMLC_USE_HDFS=0 -DDMLC_USE_S3=0 -DDMLC_USE_AZURE=0 -msse2 -o line_split.o src/io/line_split.cc
g++ -c -O3 -Wall -Wno-unknown-pragmas -Iinclude -std=c++0x -fPIC -DDMLC_USE_HDFS=0 -DDMLC_USE_S3=0 -DDMLC_USE_AZURE=0 -msse2 -o recordio_split.o src/io/recordio_split.cc
g++ -c -O3 -Wall -Wno-unknown-pragmas -Iinclude -std=c++0x -fPIC -DDMLC_USE_HDFS=0 -DDMLC_USE_S3=0 -DDMLC_USE_AZURE=0 -msse2 -o input_split_base.o src/io/input_split_base.cc
g++ -c -O3 -Wall -Wno-unknown-pragmas -Iinclude -std=c++0x -fPIC -DDMLC_USE_HDFS=0 -DDMLC_USE_S3=0 -DDMLC_USE_AZURE=0 -msse2 -o io.o src/io.cc
g++ -c -O3 -Wall -Wno-unknown-pragmas -Iinclude -std=c++0x -fPIC -DDMLC_USE_HDFS=0 -DDMLC_USE_S3=0 -DDMLC_USE_AZURE=0 -msse2 -o local_filesys.o src/io/local_filesys.cc
No arquivo incluído em include/dmlc/./././parameter.h:25:0,
de include/dmlc/././registry.h:14,
de include/dmlc/./data.h:16,
de include/dmlc/threadediter.h:20,
de src/io/cached_input_split.h:16,
de src/io.cc:13:
include/dmlc/././././optional.h: Na instanciação de 'dmlc::opcional::~opcional() [com T = int]':
include/dmlc/./././parameter.h:513:7: obrigatório daqui
include/dmlc/././././optional.h:60:7: aviso: desreferenciar o ponteiro puncionado por tipo quebrará as regras de alias estrito [-Wstrict-aliasing]
reinterpretar_cast(&val)->~T();
^ ~ ~ ~
include/dmlc/././././optional.h: Na instanciação de 'const T& dmlc::opcional::valor() const [com T = int]':
include/dmlc/./././parameter.h:872:9: obrigatório daqui
include/dmlc/././././optional.h:106:12: aviso: desreferenciar o ponteiro puncionado por tipo quebrará as regras de alias estrito [-Wstrict-aliasing]
return reinterpret_cast(&val);^ ~ ~ ~ ~ ~ ~~ ~g++ -c -O3 -Wall -Wno-unknown-pragmas -Iinclude -std=c++0x -fPIC -DDMLC_USE_HDFS=0 -DDMLC_USE_S3=0 -DDMLC_USE_AZURE=0 -msse2 -o data.o src/data.ccinclude/dmlc/././././optional.h: Na instanciação de 'const T& dmlc::opcional::operador () const [com T = int]':
include/dmlc/././././optional.h:134:11: obrigatório de 'std::ostream& dmlc::operator<<(std::ostream&, const dmlc::opcional&) [com T = int; std::ostream = std::basic_ostream]'
include/dmlc/./././parameter.h:877:13: obrigatório daqui
include/dmlc/././././optional.h:97:12: aviso: desreferenciar o ponteiro puncionado por tipo quebrará as regras de alias estrito [-Wstrict-aliasing]
return reinterpret_cast(&val);^ ~ ~ ~ ~ ~ ~~ ~g++ -c -O3 -Wall -Wno-unknown-pragmas -Iinclude -std=c++0x -fPIC -DDMLC_USE_HDFS=0 -DDMLC_USE_S3=0 -DDMLC_USE_AZURE=0 -msse2 -o recordio.o src/recordio.ccNo arquivo incluído em src/data/././text_parser.h:11:0,de src/data/./libsvm_parser.h:13,de src/data/disk_row_iter.h:19,de src/data.cc:12:include/dmlc/omp.h:15:81: note: #pragma message: Atenção: OpenMP não está disponível, o projeto será compilado em código single-thread.






::~opcional() [com T = int]':include/dmlc/././parameter.h:513:7: obrigatório daquiinclude/dmlc/./././optional.h:60:7: aviso: desreferenciar o ponteiro puncionado por tipo quebrará as regras de alias estrito [-Wstrict-aliasing]reinterpretar_cast(&val)->~T();^ ~ ~ ~include/dmlc/./././optional.h: Na instanciação de 'const T& dmlc::opcional::valor() const [com T = int]':include/dmlc/././parameter.h:872:9: obrigatório daquiinclude/dmlc/./././optional.h:106:12: aviso: desreferenciar o ponteiro puncionado por tipo quebrará as regras de alias estrito [-Wstrict-aliasing]return *reinterpret_cast(&val);^ ~ ~ ~ ~ ~ ~~ ~include/dmlc/./././optional.h: Na instanciação de 'const T& dmlc::opcional::operador
() const [com T = int]':
include/dmlc/./././optional.h:134:11: obrigatório de 'std::ostream& dmlc::operator<<(std::ostream&, const dmlc::opcional&) [com T = int; std::ostream = std::basic_ostream]'
include/dmlc/././parameter.h:877:13: obrigatório daqui
include/dmlc/./././optional.h:97:12: aviso: desreferenciar o ponteiro puncionado por tipo quebrará as regras de alias estrito [-Wstrict-aliasing]
return *reinterpret_cast(&val);
^ ~ ~ ~ ~ ~ ~~ ~
g++ -c -O3 -Wall -Wno-unknown-pragmas -Iinclude -std=c++0x -fPIC -DDMLC_USE_HDFS=0 -DDMLC_USE_S3=0 -DDMLC_USE_AZURE=0 -msse2 -o config.o src/config.cc
ar cr libdmlc.a line_split.o recordio_split.o input_split_base.o io.o local_filesys.o data.o recordio.o config.o

Você está compilando com g++, não mingw.

@jfpuget
Com base em sua prescrição disponível em https://www.ibm.com/developerworks/community/blogs/jfp/entry/Installing_XGBoost_For_Anaconda_on_Windows?lang=en , executei as seguintes etapas:

1) Eu instalei o Git para windows.
2) Iniciei o Git Bash no menu Iniciar
3) Mudei o diretório para /c/Users/Roshan/code
4) Executei os comandos:
$ git clone --recursive https://github.com/dmlc/xgboost
$ cd xgboost
$ git submodule init
Atualização do submódulo $ git

5) Baixei o MinGW-W64 da url mencionada no seu post
6) Eu verifiquei e encontrei mingw32-make em "C:\Program Files\mingw-w64\x86_64-7.1.0-posix-seh-rt_v5-rev0\mingw64\bin"
7) Eu adicionei "C:\Program Files\mingw-w64\x86_64-7.1.0-posix-seh-rt_v5-rev0\mingw64\bin" à minha variável de sistema de caminho
8) Executei o comando "which mingw32-make" que retornou "/c/Program Files/mingw-w64/x86_64-7.1.0-posix-seh-rt_v5-rev0/mingw64/bin/mingw32-make"
9) Executei o comando: alias make='mingw32-make'
10) Mudei o diretório para "/c/Users/Roshan/code/xgboost/dmlc-core"
11) Então, executei o comando: make -j4

Como acabei compilando com g ++ em vez de mingw. Eu segui cada uma de suas instruções, todo-poderoso. Por que ainda estou queimando no inferno?

@jfpuget Limpei tudo e tentei todas essas etapas novamente. Desta vez, instalei o mingw no drive C (como um dos sites recomendou evitar Arquivos de Programas, pois essa pasta tem um espaço no nome). Durante a instalação, também selecionei a versão como 5.3.0 (em vez do padrão 7 algo). Mas isso também não ajudou.

@qingdatascience : O que especificamente você fez para que funcionasse?

Eu não me lembrava. Parece apenas editar o arquivo de script bash como @yunzhou sugeriu. Se não funcionou para você, sugiro que experimente o LightGBM, que é da MS e mais rápido.

Muito obrigado a @datascienceqing , bem como @jfpuget

Como não consegui instalar o xgboost, instalei o LightGBM. Eu segui as instruções fornecidas no seguinte URL. Toda a instalação (do início ao fim) levou menos de 30 minutos:
https://github.com/Microsoft/LightGBM/tree/master/python-package

Eu tenho o sistema operacional Windows. Eu não tenho o Visual Studio. Eu poderia instalar o LightGBM em 5 etapas:
1) Baixe e instale o cmake em https://cmake.org/download/
2) Baixe e instale o MS Build em https://www.visualstudio.com/downloads/#build-tools-for-visual-studio-2017
3) Baixe e instale o Git em https://git-for-windows.github.io/?cm_mc_uid=41805252005114998995219&cm_mc_sid_50200000=1500774547
4) Inicie o Git Bash
5) Execute estes comandos:
git clone --recursive https://github.com/Microsoft/LightGBM
cd LightGBM/python-package
instalação do python setup.py

Eu finalmente consegui instalar o xgboost, após várias rodadas de tentativa e erro. As instruções no seguinte local foram muito úteis: http://www.picnet.com.au/blogs/guido/post/2016/09/22/xgboost-windows-x64-binaries-for-download/

Obrigado a @gatapia @jfpuget e @qingdatascience

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