Xgboost: Error al construir xgboost usando mingw g ++ de 64 bits

Creado en 27 mar. 2016  ·  35Comentarios  ·  Fuente: dmlc/xgboost

Me gustaría compilar xgboost para Anaconda Python 3.x en Windows 10 de 64 bits, así que seguí los pasos aquí: https://xgboost.readthedocs.org/en/latest/build.html#building -on-windows y aquí: instale xgboost en python con fallas de msys de 64 bits. Usando mingw g++ de 64 bits, recibí el siguiente mensaje de error cuando "make -j4" usando mingw64.mk:

g++: error: dmlc-core/libdmlc.a: No existe tal archivo o directorio
g++: error: rabit/lib/librabit_empty.a: No existe tal archivo o directorio
Makefile: 120 : la receta para el destino 'lib/libxgboost.dll' falló
mingw32-make: *** [lib/libxgboost.dll] Error 1

Más detalles de los mensajes de registro se pueden encontrar aquí:
registro.txt

¿Puedes por favor decirme qué está pasando y cómo puedo resolver esto?

Muchas gracias.

Comentario más útil

Todos 35 comentarios

Puede copiar mingw32-make.exe en el directorio git (p. ej., C:\Program Files\Git\usr\bin) y cambiarle el nombre a make.exe. Luego vuelva a ejecutar make -j4 en git shell.

Necesita compilar dmlc-core y rabit directamente

cd dmlc-core
hacer -j4

cd ../conejo
hacer -j4

pero este falla en mi instalación, tratando de entender por qué.

Bien, lo encontré.

Al usar mingw64, debe tener mingw32-make en su camino. Alias ​​para hacerlo como se explica en la guía de instalación.
Luego vaya al directorio xgboost y haga lo siguiente
cd dmlc-core
hacer -j4
cd ../conejo
hacer lib/librabit_empty -j4
CD ..
cp make/mingw64.mk config.mk
hacer -j4

error de tipografía:
en el comentario anterior, una línea debe decir
hacer lib/librabit_empty.a -j4
en vez de
hacer lib/librabit_empty -j4

Muchas gracias jfpuget!! ¡Finalmente funciona con tus pasos anteriores!

@jfpuget Tal vez pueda ayudar a mejorar nuestras instrucciones. Cualquier PR será realmente bienvenido.

@jfpuget Esto se ve muy bien, ¿puedes hacer un PR para mejorar la instrucción anterior? ¡Gracias!

Claro, lo haré lo antes posible (un par de días ya que acabo de regresar de vacaciones y la gente ha pensado en mí en el trabajo;))

Hola a todos. Cuando 'make -j4' en el directorio raíz, tengo este problema. ¿Tienes algún consejo? Gracias

Ya existe una compilación de subdirectorio o archivo.
Ocurrió un error al procesar: build.
Makefile: 97 : la receta para el objetivo 'build/logging.o' falló
hacer: ** [compilación/registro.o] Error 1hacer: * * Esperando trabajos sin terminar....
La sintaxis del comando es incorrecta.
Makefile: 97 : la receta para el objetivo 'build/common/common.o' falló
hacer: ** [compilación/común/común.o] Error 1La sintaxis del comando es incorrecta.Makefile: 97 : la receta para el objetivo 'build/c_api/c_api_error.o' fallóhacer: * * [build/c_api/c_api_error.o] Error 1

Lo tengo... Estaba usando git cmd... no git bash... Es por eso que encontré el problema.

También puedo compartir mis notas sobre cómo construyo paquetes xgboost R y python en Windows.

Algunas de mis soluciones fueron similares a las de Jean-François, pero hay algunas diferencias sutiles porque estoy usando la cadena de herramientas de compilación mingw incluida con Rtools. Esencialmente, Windows es un desastre con una gran variedad de paquetes basados ​​en mingw hoy en día con diversos grados de integridad, estabilidad y actualización. Incluso en mi situación que describo a continuación, hay tres conjuntos de herramientas basadas en mingw que tienen que trabajar juntas:

  • un conjunto mínimo sin compilador de herramientas gnu de línea de comandos con Windows git;
  • un compilador gcc-4.7 pero no creado con Anaconda;
  • y un conjunto bastante utilizable que tiene gcc-4.6.3 y que viene con Rtools.

Este último es suficiente para las necesidades de C++11 de xgboost, y no veo ninguna razón hasta ahora para involucrar otra distribución de mingw en este lío. En tales situaciones, es fundamental tener mucho cuidado con lo que entra en PATH y en qué orden.

Algunas notas sobre Rtools:

Uso la última versión del paquete Rtools 3.3. Sin embargo (IMPORTANTE), durante la instalación de Rtools, no instalo la cadena de herramientas 3.3 con gcc 4.9; todavía tiene algunos problemas. La cadena de herramientas 3.2 de 64 bits es suficiente y funciona bien. Como uso más R, tengo las rutas de Rtools agregadas a mi sistema PATH, pero no a las de Miniconda. Cada vez que necesito python mientras no uso los accesos directos de Anaconda, solo configuro las rutas necesarias manualmente.

La compilación del paquete R es bastante trivial:
  • obtener la fuente
  • lanzamiento R
setwd('wherever xgboost R-package directory is')
install.packages('.', repos = NULL, type='source')
setwd('tests')
source('testthat.R')
La creación de xgboost exe y bibliotecas necesita algunas soluciones:
  • asumiendo git-bash, dentro del directorio raíz de xgboost
  • asegúrese de que which gcc apunte a /c/Rtools/gcc-4.6.3/bin/gcc (dependiendo de dónde se instaló Rtools)
  • edite rabit/Makefile y agregue el indicador -m64 a la línea de definición de CFLAGS (¿no debería estar allí en primer lugar?): export CFLAGS = -m64 -O3 -msse2 $(WARNFLAGS)
  • lo siguiente debería funcionar ahora (es necesario ejecutar make en varias etapas aquí debido a algunas interacciones/peculiaridades/errores del paquete 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
Paquete de 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

Tiene razón: si ya tiene un compilador g ++ en funcionamiento, entonces no necesita instalar otro.

con https://github.com/dmlc/xgboost/pull/1071 , las cosas deberían ser más fáciles

Por cierto, he enviado #1071 que permitiría simplemente ejecutar mingw32-make.exe -j desde la raíz del proyecto para compilar todo a la vez, al usar esa distribución reciente de Mingw. La marca en Rtools todavía necesita soluciones...

@jfpuget Tengo curiosidad: ¿tuvo algún motivo específico para elegir los subprocesos POSIX y la opción de manejo de excepciones SEH? Por ejemplo, acabo de intentar instalar Win32 y SJLJ (solo porque eso era lo que usaba gcc en Rtools) y parece funcionar.

Una observación interesante sobre gcc 5.3: parece generar el código de 64 bits sin importar si había o no el indicador -m64 establecido para la biblioteca rabit. Es por eso que no tuviste ningún error al vincularlo. ¿Gcc cambió a -m64 como predeterminado en alguna versión?

Sobre la modificación de la RUTA dentro de python: si acaba de modificar la RUTA del sistema, Python de anaconda en Windows a veces (¿dependiendo de cómo lo inicie?) solo lo recuperaría después de reiniciar/reiniciar sesión. No lo revisé en este momento, pero tuve algunos problemas similares hace algún tiempo.

@khotilov Acabo de dejar la configuración predeterminada en el instalador mingw64-gw.

Modificar la ruta del sistema no fue lo suficientemente bueno, incluso si reinicié python (en realidad, reinicié el kernel desde una computadora portátil). Verificaré nuevamente por qué necesitaba modificar la variable de ruta del sistema operativo dentro de Python.

Mi objetivo era tener xgboost en funcionamiento, por lo tanto, dejé de investigar cuando terminé.

@khotilov No estoy seguro de qué MinGW-w64 con GCC 5.3 está usando.

Pero en algunas distribuciones (quizás en la mayoría), no hay soporte multiarquitectura.

En xgboost\dmlc-core\include\dmlc\base.h
línea 113

si (definido MINGW32 ) || (definido MINGW64 )

//#definir fopen64 std::fopen

terminara si

si está utilizando MINGW64, debe comentar esta definición de fopen64 ya que
mingw64 ha definido su propio fopen64 en stdio.h

@yunzhou Gracias. Después de perder el tiempo durante toda una noche, tu truco realmente funcionó.

En realidad, mis errores dijeron algo mal con 'base.h'.

@jfpuget : Intenté instalar usando su enlace pero recibo el siguiente error
Makefile: 136 : la receta para el objetivo 'xgboost' falló

Estoy seguro de que hice todo según su artículo. ¿Podrías ayudarme? Gracias

Hola,

no hay forma de que pueda obtener ayuda a menos que proporcione más información. ¿Cuál es el error durante la compilación? Lo que proporciona no es el mensaje de error, es el resumen.

Envíe el registro de la compilación sin editarlo.

Saludos cordiales/Cordialement,JFJean-Francois Puget, PhDIngeniero Distinguido, Optimización y Aprendizaje Automático, IBM AnalyticsMóvil: +33(0)6 7000 8815 Correo electrónico: jf. [email protected] : http://bit.ly/jfpuget Twitter: @JFPuget


----- Mensaje original -----De: harishneela [email protected] : dmlc/xgboost [email protected] : Jean Francois Puget/France/ IBM@IBMFR , Mención [email protected] : Re: [dmlc/xgboost] Error al construir xgboost usando mingw g++ de 64 bits (#1049) Fecha: miércoles, 2 de noviembre de 2016 7:51 p. m.
@jfpuget : Intenté instalar usando su enlace, pero recibo el siguiente error rMakefile: 136 : la receta para el objetivo 'xgboost' falló
Estoy seguro de que hice todo según su artículo. ¿Podrías ayudarme? Gracias
—Estás recibiendo esto porque te mencionaron. Responde a este correo electrónico directamente, míralo en GitHub o silencia el hilo.

Sauf indicación contraire ci-dessus:/ A menos que se indique lo contrario arriba:
Compañía IBM Francia
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. Actualización de cerveza

Dado que brew no se ha actualizado después de actualizar Mac a 10.12, encontré varios hoyos al actualizar brew, y ahora lo analizaré. No use brew update directamente para actualizar brew, informará un error. Use brew upgrade para actualizar el software, y brew se actualizará activamente mientras actualiza otro software.

2. Instale la última versión de gcc (gcc-6)

brew install gcc --sin-multilib

Nota: si actualiza brew, no puede instalar gcc.

3. Descarga el código fuente de Git

Clon de Git --recursivo https://github.com/dmlc/xgboost

Después de descargar, cd xgboost; cp make/minimum.mk ./config.mk; make -j4 para compilar xgboost. Hasta ahora, solo se ha compilado xgboost. (intente unas cuantas veces más, tal vez la próxima vez tenga éxito)

4. Instale la versión Python de xgboost

Porque xgboost se divide en versión de Python y versión de lenguaje R. Debido al cuello de botella de rendimiento de R, utilizo python, así que instale la versión python de xgboost.

Ingrese al directorio xgboost y luego ingrese al directorio python-package de xgboost, use el comando: cd python-package/

Ejecute en el directorio python-package: sudo python setup.py install, si no se agrega sudo, se informará un error:

5. Terminado, lo instalé yo mismo, espero que sea útil para otros

@jfpuget solo tiene curiosidad por saber si sabe que estas instrucciones son válidas en una máquina POWER8. Estoy tratando de compilar XGBoost en POWER8 y centos 7. Recibo el mismo error que el OP.

No sé.

Hola @jfpuget

Gracias por tu blog. Sin embargo, necesito alguna orientación para completar la instalación. Recibo un error una vez que escribo "python setup.py install"

Dice "no se puede encontrar la biblioteca xgboost en la ruta candidata". ¿Significa esto que tengo un error en la instalación antes de este punto? No obtuve ningún error cuando seguí los pasos.

Saludos cordiales

Seguí las instrucciones de jfpuget para crear submódulos, luego aquí hay un error después de la última creación,

dmlc-core/libdmlc.a: error al agregar símbolos: el archivo no tiene índice; ejecuta ranlib para agregar uno
collect2.exe: error: ld devolvió 1 estado de salida
Makefile: 174 : la receta para el objetivo 'xgboost' falló
hacer: * [xgboost] Error 1

¿Alguien tiene ideas?

¡Gracias!

@jfpuget Intenté seguir sus instrucciones en mi sistema operativo Windows varias veces, pero siempre recibo este error:
$ cd dmlc-core
$ mingw32-hacer -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
En el archivo incluido desde include/dmlc/./././parameter.h:25:0,
de incluir/dmlc/././registry.h:14,
de incluir/dmlc/./data.h:16,
desde include/dmlc/threadediter.h:20,
de src/io/cached_input_split.h:16,
de src/io.cc:13:
include/dmlc/././././opcional.h: En instanciación de 'dmlc::opcional::~opcional() [con T = int]':
include/dmlc/./././parameter.h:513:7: requerido desde aquí
include/dmlc/././././opcional.h:60:7: advertencia: la desreferenciación del puntero con punciones de tipo romperá las reglas de alias estricto [-Wstrict-aliasing]
reinterpretar_cast(&valor)->~T();
^ ~ ~ ~
include/dmlc/././././opcional.h: En instanciación de 'const T& dmlc::opcional::value() const [con T = int]':
include/dmlc/./././parameter.h:872:9: requerido desde aquí
include/dmlc/././././opcional.h:106:12: advertencia: la desreferenciación del puntero con juego de palabras romperá las reglas de alias estricto [-Wstrict-aliasing]
volver reinterpret_cast(&valor);^ ~ ~ ~ ~ ~ ~ ~~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/././././opcional.h: En instanciación de 'const T& dmlc::opcional::operador () const [con T = int]':
include/dmlc/././././opcional.h:134:11: requerido de 'std::ostream& dmlc::operator<<(std::ostream&, const dmlc::opcional&) [con T = int; estándar::ostream = estándar::basic_ostream]'
include/dmlc/./././parameter.h:877:13: requerido desde aquí
include/dmlc/././././opcional.h:97:12: advertencia: la desreferenciación del puntero con punción de tipos romperá las reglas de alias estricto [-Wstrict-aliasing]
volver reinterpret_cast(&valor);^ ~ ~ ~ ~ ~ ~ ~~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.ccEn el archivo incluido desde 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: nota: mensaje #pragma: Advertencia: OpenMP no está disponible, el proyecto se compilará en un código de subproceso único.






::~opcional() [con T = int]':include/dmlc/././parameter.h:513:7: requerido desde aquíinclude/dmlc/./././opcional.h:60:7: advertencia: la desreferenciación del puntero con juego de palabras romperá las reglas de alias estricto [-Wstrict-aliasing]reinterpretar_cast(&valor)->~T();^ ~ ~ ~include/dmlc/./././opcional.h: En instanciación de 'const T& dmlc::opcional::value() const [con T = int]':include/dmlc/././parameter.h:872:9: requerido desde aquíinclude/dmlc/./././opcional.h:106:12: advertencia: la desreferenciación del puntero puntiagudo romperá las reglas de alias estricto [-Wstrict-aliasing]volver *reinterpret_cast(&valor);^ ~ ~ ~ ~ ~ ~ ~~include/dmlc/./././opcional.h: En instanciación de 'const T& dmlc::opcional::operador
() const [con T = int]':
include/dmlc/./././opcional.h:134:11: requerido de 'std::ostream& dmlc::operator<<(std::ostream&, const dmlc::opcional&) [con T = int; estándar::ostream = estándar::basic_ostream]'
include/dmlc/././parameter.h:877:13: requerido desde aquí
include/dmlc/./././opcional.h:97:12: advertencia: la desreferenciación del puntero con punción de tipos romperá las reglas de alias estricto [-Wstrict-aliasing]
volver *reinterpret_cast(&valor);
^ ~ ~ ~ ~ ~ ~ ~~
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

Está compilando con g ++, no con mingw.

@jfpuget
Según su receta disponible en https://www.ibm.com/developerworks/community/blogs/jfp/entry/Installing_XGBoost_For_Anaconda_on_Windows?lang=en , realicé los siguientes pasos:

1) Instalé Git para Windows.
2) Inicié Git Bash desde el menú de inicio
3) Cambié el directorio a /c/Users/Roshan/code
4) Ejecuté los comandos:
$ clon de git --recursivo https://github.com/dmlc/xgboost
$ cd xgboost
$ git submódulo init
$ actualización del submódulo git

5) Descargué MinGW-W64 de la URL mencionada en su publicación
6) Revisé y encontré mingw32-make en "C:\Program Files\mingw-w64\x86_64-7.1.0-posix-seh-rt_v5-rev0\mingw64\bin"
7) Agregué "C:\Archivos de programa\mingw-w64\x86_64-7.1.0-posix-seh-rt_v5-rev0\mingw64\bin" a mi variable de sistema de ruta
8) Ejecuté el comando "cuál mingw32-make" que devolvió "/c/Program Files/mingw-w64/x86_64-7.1.0-posix-seh-rt_v5-rev0/mingw64/bin/mingw32-make"
9) Ejecuté el comando: alias make='mingw32-make'
10) Cambié el directorio a "/c/Users/Roshan/code/xgboost/dmlc-core"
11) Luego, ejecuté el comando: make -j4

¿Cómo terminé compilando con g ++ en lugar de mingw? Seguí cada una de tus instrucciones, todopoderoso. ¿Por qué sigo ardiendo en el infierno?

@jfpuget Limpié todo y probé todos estos pasos nuevamente. Esta vez, instalé mingw en la unidad C (ya que uno de los sitios web recomendó evitar los Archivos de programa, ya que esta carpeta tiene un espacio en su nombre). Durante la instalación, también seleccioné la versión 5.3.0 (en lugar de la predeterminada 7 algo). Pero eso tampoco ayudó.

@qingdatascience : ¿Qué hiciste específicamente para que funcionara?

No lo recordé. Parece que solo se editó el archivo de script bash como sugirió @yunzhou . Si no te funcionó, te sugiero que pruebes LightGBM, que es de MS y más rápido.

Muchas gracias a @datascienceqing así como a @jfpuget

Como no pude instalar xgboost, instalé LightGBM. Seguí las instrucciones provistas en la siguiente URL. La instalación completa (de principio a fin) tomó menos de 30 minutos:
https://github.com/Microsoft/LightGBM/tree/master/python-paquete

Tengo sistema operativo windows. No tengo Visual Studio. Podría instalar LightGBM en 5 pasos:
1) Descargue e instale cmake desde https://cmake.org/download/
2) Descargue e instale MS Build desde https://www.visualstudio.com/downloads/#build-tools-for-visual-studio-2017
3) Descargue e instale Git desde https://git-for-windows.github.io/?cm_mc_uid=41805252005114998995219&cm_mc_sid_50200000=1500774547
4) Inicie Git Bash
5) Ejecute estos comandos:
clon de git --recursivo https://github.com/Microsoft/LightGBM
cd LightGBM/python-paquete
instalar python setup.py

Finalmente pude instalar xgboost, después de varias rondas de prueba y error. Las instrucciones en la siguiente ubicación fueron muy útiles: http://www.picnet.com.au/blogs/guido/post/2016/09/22/xgboost-windows-x64-binaries-for-download/

Gracias a @gatapia @jfpuget y @qingdatascience

¿Fue útil esta página
0 / 5 - 0 calificaciones