mac instalar how como python ubuntu glibc tensorflow

instalar - Error al importar Tensorflow en Python 2.7 en Ubuntu 12.04. ''GLIBC_2.17 no encontrado''



tensorflow cuda (14)

He instalado los enlaces de Tensorflow con python con éxito. Pero cuando trato de importar Tensorflow, aparece el siguiente error.

ImportError: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.17'' not found (required by /usr/local/lib/python2.7/dist-packages/tensorflow/python/_pywrap_tensorflow.so)

He intentado actualizar GLIBC_2.15 a 2.17, pero no tuve suerte.



Acabo de instalar Tensorflow 0.12rc0 en CentOS 6.5 con glibc 2.12, sin tener privilegios de root. Simplemente instalar el binario de tensorflow a través de pip me estaba dando un error, relacionado también con la versión GLIBC.

Básicamente, tiene 4 opciones para lidiar con esto (cada una con algunas ventajas y desventajas):

Opción 1: actualice su sistema GLIBC a nivel mundial.

Esta es , probablemente, la mejor opción, si su sistema lo admite , tiene privilegios de root y está seguro de que esta actualización no romperá nada por alguna extraña razón. En última instancia, esto va a actualizar toda la distribución de Linux. Here una buena lista de versiones predeterminadas de GLIBC en distribuciones populares.

Opción 2: agregue un segundo GLIBC a su sistema

Compilar o descargar binarios . La opción más simple y directa. Especialmente si solo necesita ejecutar algunos scripts simples .

  • Es posible tener múltiples versiones de glibc en el mismo sistema, pero se debe hacer esto con mucho cuidado.
  • No destruirá su sistema, si todos sus cambios se limitarían a un entorno virtual.
  • Muchos programas, instalados / compilados antes, podrían depender de GLIBC antiguo, simplemente se bloquearían en su nuevo entorno (por ejemplo, su IDE de Python). Incluyendo los comandos bash más básicos, como "lc", "cd", etc.
  • También son posibles otros efectos secundarios como pérdidas significativas de memoria .
  • Por lo tanto, es una muy mala idea agregar un nuevo GLIBC a su entorno normal , por ejemplo, a través de .bashrc .
  • Por otro lado, si necesita alguna herramienta específica en su nuevo entorno virtual, puede volver a compilarla y vincularla con el nuevo GLIBC . Entonces, eso funcionaría bien en su nuevo entorno.
  • Sin embargo, personalmente, renuncié rápidamente a recompilar todo lo que necesito en un nuevo entorno (sin root y sin un administrador de paquetes).
  • Los desarrolladores de GLIBC ofrecen oficialmente un enfoque ligeramente diferente para probar nuevas compilaciones de GLIBC.

Opción 3 - Patch tensorflow

This puede funcionar para TF 0.6.0, pero probablemente tenga que comenzar de nuevo desde cero, cuando se lance cada nueva versión de tensorflow. Por ejemplo, here una solución para 0.9.0.

Opción 4: compilar tensorflow desde la fuente

Si lo vuelve a compilar desde la fuente y se vincula con su GLIBC existente, ya no se necesitará un GLIBC más nuevo. De alguna manera, esta opción no se mencionó en ninguna respuesta aquí todavía. En mi opinión, esta es la mejor opción, tanto " en general " como "específicamente para el tensorflow".

  • Esto funciona bien con r0.11 y probablemente funcionaría durante años, pero en teoría, podría romperse en alguna versión más nueva de tensorflow, si decidieran usar alguna nueva funcionalidad GLIBC, que no está presente en versiones anteriores.
  • Para ser sincero, construir tensorflow desde la fuente no es sencillo, especialmente en sistemas obsoletos.

Un resumen rápido de "creación de tensorflow en un sistema desactualizado":

Aunque la guía oficial proporciona una sección de " instalación desde fuentes ", hay algunos trucos que debe hacer para construirla en un sistema desactualizado. Aquí supongo que no tiene privilegios de root (si los tiene, probablemente podría instalar las mismas solicitudes previas con un administrador de paquetes, en lugar de que las construyan manualmente desde la fuente).

Encontré dos historias de éxito bien documentadas: #1 , #2 y una serie de publicaciones útiles en el github oficial (principalmente sobre un conjunto de bibliotecas para vincular dentro del binario): #1 , #2 , #3 , #4 . Tuve que combinar trucos, descritos allí para compilar con éxito TF en mi caso.

  1. En primer lugar, verifique su gcc --version y verify que sea compatible con c ++ 11. El mío era 4.4.7, por lo que no funcionará. He downloaded código fuente de gcc-4.9.4 y lo he compilado . Este paso es bastante sencillo, pero la compilación en sí puede tomar algunas horas. Como solución para un problema en bazel, he compilado gcc con rutas codificadas as , ld y nm . Sin embargo, puede intentar otras soluciones: ( 1 , 2 ).

    #!/bin/sh unset LIBRARY_PATH CPATH C_INCLUDE_PATH unset PKG_CONFIG_PATH CPLUS_INCLUDE_PATH INCLUDE LD_LIBRARY_PATH cd gcc-4.9.4 ./contrib/download_prerequisites mkdir objdir cd objdir # I''ve added --disable-multilib to fix the following error: # /usr/bin/ld: crt1.o: No such file: No such file or directory # collect2: ld returned 1 exit status # configure: error: I suspect your system does not have 32-bit # developement libraries (libc and headers). If you have them, # rerun configure with --enable-multilib. If you do not have them, # and want to build a 64-bit-only compiler, rerun configure # with --disable-multilib. ../configure --prefix=$HOME/opt/gcc-4.9.4 / --disable-multilib / --disable-nls / --enable-languages=c,c++ / --with-ld=/usr/bin/ld / --with-nm=/usr/bin/nm / --with-as=/usr/bin/as make make install

  2. Compruebe su java --version . Bazel requiere JDK 8, instálelo si es necesario. (Todavía provide algunas descargas relacionadas con jdk7, para bazel-0.4.1 pero parece que lo consideran obsoleto)

  3. He creado un archivo use_gcc_4.9.4.sh separado, con las variables de entorno necesarias. Uso source ./use_gcc_4.9.4.sh cuando lo necesito para hacer algo relacionado con este compilador más nuevo.

    #!/bin/sh this=$HOME/opt/gcc-4.9.4 export PATH=$this/bin:$PATH export CPATH=$this/include:$CPATH export LIBRARY_PATH=$this/lib:$LIBRARY_PATH export LIBRARY_PATH=$this/lib64:$LIBRARY_PATH export LD_LIBRARY_PATH=$this/lib:$LD_LIBRARY_PATH export LD_LIBRARY_PATH=$this/lib64:$LD_LIBRARY_PATH

  4. El binario actual de bazel (0.4.1) requiere GLIBC 2.14 , por lo que también tenemos que compilar bazel desde la fuente (con nuestro nuevo gcc). Funciona bien, a menos que solo se le permita ejecutar un número muy limitado de hilos en la máquina de destino. ( #1 publicación describe algunas soluciones adicionales, pero en mi caso no fueron necesarias, tal vez debido a actualizaciones recientes en el código de bazel).

  5. Obtenga el código fuente de tensorflow git clone https://github.com/tensorflow/tensorflow e instale los requisitos previos que necesita (CUDA, cuDNN, python, etc.). Ver guía oficial .

  6. Si no está usando el sistema predeterminado gcc (por ejemplo, si tuvo que compilar gcc más nuevo, como se discutió anteriormente), agregue #4 a tensorflow/third_party/gpus/crosstool/CROSSTOOL.tpl , línea 59 :

    linker_flag: "-L/home/username/localinst/opt/gcc-4.9.4/lib64" linker_flag: "-Wl,-rpath,/home/username/localinst/opt/gcc-4.9.4/lib64"

    Sin este paso, es probable que encuentre mensajes de error como this :

    # ERROR: /home/username/localdistr/src/tensorflow/tensorflow/tensorflow/core/debug/BUILD:33:1: null failed: protoc failed: error executing command bazel-out/host/bin/external/protobuf/protoc ''--cpp_out=bazel-out/local_linux-py3-opt/genfiles/'' ''--plugin=protoc-gen-grpc=bazel-out/host/bin/external/grpc/grpc_cpp_plugin'' ... (remaining 8 argument(s) skipped): com.google.devtools.build.lib.shell.BadExitStatusException: Process exited with status 1. # bazel-out/host/bin/external/protobuf/protoc: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.20'' not found (required by bazel-out/host/bin/external/protobuf/protoc) # bazel-out/host/bin/external/protobuf/protoc: /usr/lib64/libstdc++.so.6: version `CXXABI_1.3.8'' not found (required by bazel-out/host/bin/external/protobuf/protoc) # bazel-out/host/bin/external/protobuf/protoc: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.18'' not found (required by bazel-out/host/bin/external/protobuf/protoc)

  7. Finalmente, para evitar dependencias GLIBC, tenemos que vincular estáticamente algunas bibliotecas, agregando el -lrt enlace -lrt ( maybe -lm ). Encontré varias publicaciones, sugiriendo agregar esto de una manera diferente:

    • a través de la #1 (puede #1 razonable, pero de alguna manera no funciona para mí en la versión actual de tensorflow),
    • a través de #3 (no estoy seguro de si funciona, pero esto no parece conveniente; este archivo solo se crea durante el intento de compilación)
    • a través de "third_party/gpus/crosstool/CROSSTOOL.tpl" (el mismo archivo que acabamos de editar en el paso anterior, justo debajo de las líneas que ya hemos agregado).

      linker_flag: "-lrt" linker_flag: "-lm"

    • a través de #1 (funciona para mí, pero menos conveniente solo porque tiene que editar un archivo más. No estoy seguro de que sea 100% equivalente al punto anterior)

    Sin -lrt me encontré con un error específico de la versión GLIBC nuevamente, tratando de import tensorflow :

    # ImportError: /lib64/libc.so.6: version `GLIBC_2.14'' not found (required by /home/username/anaconda3/envs/myenvname/lib/python3.5/site-packages/tensorflow/python/_pywrap_tensorflow.so)

    Sin -lm puedes -lm con maybe (para mí, resultó no ser necesario).

  8. Ejecute el proceso de compilación.

source ./use_gcc_4.9.4.sh ./configure bazel build -c opt --config=cuda //tensorflow/tools/pip_package:build_pip_package bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg pip install --upgrade /tmp/tensorflow_pkg/tensorflow-0.12.0rc0-cp35-cp35m-linux_x86_64.whl

  1. Intente ejecutar el siguiente script simple de Python para probar si funciona lo más básico:

    import tensorflow as tf hello = tf.constant(''Hello, TensorFlow!'') sess = tf.Session() print(sess.run(hello)) a = tf.constant(10) b = tf.constant(32) print(sess.run(a + b))



Bien, aquí está la otra solución que mencioné en mi respuesta anterior , es más difícil, pero siempre debería funcionar en sistemas con GLIBC> = 2.12 y GLIBCXX> = 3.4.13. En mi caso, estaba en un CentOS 6.7, pero también está bien para Ubuntu 12.04.

Vamos a necesitar una versión de gcc que admita c ++ 11, ya sea en otra máquina o en una instalación aislada; Pero no por el momento.

Lo que haremos aquí es editar el _pywrap_tensorflow.so binario para ''debilitar'' sus dependencias libc y libstdc ++, de modo que ld acepte vincular los stubs que haremos. Luego haremos esos talones para los símbolos que faltan, y finalmente vamos a precargar todo esto al ejecutar Python.

En primer lugar, quiero agradecer a James por su gran artículo ( http://www.lightofdawn.org/wiki/wiki.cgi/NewAppsOnOldGlibc ) y sus valiosos consejos, no podría haberlo hecho sin él.

Entonces, comencemos debilitando las dependencias, se trata de reemplazar los bytes correctos en _pywrap_tensorflow.so. Tenga en cuenta que este paso solo funciona para la versión actual de tensorflow (0.6.0). Entonces, si aún no lo ha hecho, cree y active su virtualenv si tiene uno (si no es administrador, virtualenv es una solución, otra es agregar el indicador de --user al comando pip) e instalar tensorflow 0.6.0 (reemplace cpu por gpu en la url si quieres la versión gpu):

pip install --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.6.0-cp27-none-linux_x86_64.whl

Y debilitemos todas las dependencias molestas, aquí está el comando para la versión de la CPU de tensorflow:

TENSORFLOW_DIR=`python -c "import imp; print(imp.find_module(''tensorflow'')[1])"` for addr in 0xC6A93C 0xC6A99C 0xC6A9EC 0xC6AA0C 0xC6AA1C 0xC6AA3C; do printf ''/x02'' | dd conv=notrunc of=${TENSORFLOW_DIR}/python/_pywrap_tensorflow.so bs=1 seek=$((addr)) ; done

Y aquí está el de gpu (ejecute solo el correcto o dañará el binario):

TENSORFLOW_DIR=`python -c "import imp; print(imp.find_module(''tensorflow'')[1])"` for addr in 0xDC5EA4 0xDC5F04 0xDC5F54 0xDC5F74 0xDC5F84 0xDC5FA4; do printf ''/x02'' | dd conv=notrunc of=${TENSORFLOW_DIR}/python/_pywrap_tensorflow.so bs=1 seek=$((addr)) ; done

Puedes consultarlo con:

readelf -V ${TENSORFLOW_DIR}/python/_pywrap_tensorflow.so

Echa un vistazo al artículo si quieres entender lo que está pasando aquí.

Ahora vamos a hacer los talones para los símbolos libc que faltan:

mkdir ~/my_stubs cd ~/my_stubs MYSTUBS=~/my_stubs printf "#include <time.h>/n#include <string.h>/nvoid* memcpy(void *dest, const void *src, size_t n) {/nreturn memmove(dest, src, n);/n}/nint clock_gettime(clockid_t clk_id, struct timespec *tp) {/nreturn clock_gettime(clk_id, tp);/n}" > mylibc.c gcc -s -shared -o mylibc.so -fPIC -fno-builtin mylibc.c

Debe realizar ese paso en la máquina con las dependencias que faltan (o máquina con versiones similares de bibliotecas estándar (en un clúster, por ejemplo)).

Ahora probablemente cambiaremos de máquina, ya que necesitamos un gcc que admita c ++ 11, y probablemente no esté en la máquina que carece de todas las dependencias (o puede usar una instalación aislada de un gcc reciente). A continuación, supongo que todavía estamos en ~/my_stubs y de alguna manera compartes tu casa entre las máquinas, de lo contrario, solo tendrás que copiar los archivos .so que generaremos cuando esté hecho.

Entonces, un trozo que podemos hacer para libstdc ++, y para los restantes que faltan los vamos a compilar desde la fuente gcc (puede tomar algún tiempo clonar el repositorio):

printf "#include <functional>/nvoid std::__throw_bad_function_call(void) {/nexit(1);/n}" > bad_function.cc gcc -std=c++11 -s -shared -o bad_function.so -fPIC -fno-builtin bad_function.cc git clone https://github.com/gcc-mirror/gcc.git cd gcc mkdir my_include mkdir my_include/ext cp libstdc++-v3/include/ext/aligned_buffer.h my_include/ext gcc -I$PWD/my_include -std=c++11 -fpermissive -s -shared -o $MYSTUBS/hashtable.so -fPIC -fno-builtin libstdc++-v3/src/c++11/hashtable_c++0x.cc gcc -std=c++11 -fpermissive -s -shared -o $MYSTUBS/chrono.so -fPIC -fno-builtin libstdc++-v3/src/c++11/chrono.cc gcc -std=c++11 -fpermissive -s -shared -o $MYSTUBS/random.so -fPIC -fno-builtin libstdc++-v3/src/c++11/random.cc gcc -std=c++11 -fpermissive -s -shared -o $MYSTUBS/hash_bytes.so -fPIC -fno-builtin ./libstdc++-v3/libsupc++/hash_bytes.cc

¡Y eso es! Ahora puede ejecutar un script de Python tensorflow cargando previamente todas nuestras bibliotecas compartidas (y su libstdc ++ local):

LIBSTDCPP=`ldconfig -p | grep libstdc++.so.6 | grep 64 | cut -d'' '' -f4` #For 64bit machines LD_PRELOAD="$MYSTUBS/mylibc.so:$MYSTUBS/random.so:$MYSTUBS/hash_bytes.so:$MYSTUBS/chrono.so:$MYSTUBS/hashtable.so:$MYSTUBS/bad_function.so:$LIBSTDCPP" python ${TENSORFLOW_DIR}/models/image/mnist/convolutional.py

:)


El enlace en la respuesta de @ Théo T ya no funciona, así que tuve que probar varias alternativas para finalmente encontrar una que funcione.

mkdir ~/my_libc_env cd ~/my_libc_env wget http://launchpadlibrarian.net/137699828/libc6_2.17-0ubuntu5_amd64.deb wget http://launchpadlibrarian.net/137699829/libc6-dev_2.17-0ubuntu5_amd64.deb wget ftp://ftp.icm.edu.pl/vol/rzm5/linux-slc/centos/7.0.1406/cr/x86_64/Packages/libstdc++-4.8.3-9.el7.x86_64.rpm ar p libc6_2.17-0ubuntu5_amd64.deb data.tar.gz | tar zx ar p libc6-dev_2.17-0ubuntu5_amd64.deb data.tar.gz | tar zx rpm2cpio libstdc++-4.8.3-9.el7.x86_64.rpm| cpio -idmv

Ejecute el código de Python con Tensorflow

LD_LIBRARY_PATH="$HOME/my_libc_env/lib/x86_64-linux-gnu/:$HOME/my_libc_env/usr/lib64/" $HOME/my_libc_env/lib/x86_64-linux-gnu/ld-2.17.so `which python` your_program.py


Ese error surge principalmente si su GNU C-Library no está actualizada. Puede verificar qué versión está ejecutando usando un simple

$ ldd --version

La salida debería ser así:

ldd (Ubuntu EGLIBC 2.19-0ubuntu6.6) 2.19 Copyright (C) 2014 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Written by Roland McGrath and Ulrich Drepper.

La 2.19 es su versión GLIBC. Para actualizar puede visitar el sitio web del proyecto de la Biblioteca GNU-C y descargar la última versión. El enlace al último glibc está aquí: Descarga de la biblioteca GNU-C Al momento de escribir esta respuesta, la última versión estable era 2.22 .

Intenté ejecutar tensorflow en Ubuntu 12.04 y 14.04. Ubuntu 14.04 no arroja este problema, ya que viene con glibc 2.19 instalado de forma predeterminada.

Espero eso ayude.



Las respuestas anteriores están bien, pero aún me enfrenté a algunos problemas incluso después de hacerlo. Seguí como en @Theo answer en rhel y estaba tratando de exportar LD_LIBRARY_PATH que había arrojado algunos errores, junto con LD_LIBRARY_PATH también incluyen LD_PRELOAD como

mkdir libstdc cd libstdc rpm2cpio ../libstdc++-4.8.3-9.el7.x86_64.rpm| cpio -idmv LD_LIBRARY_PATH="$HOME/my_libc_env/lib/x86_64-linux-gnu/:$HOME/my_libc_env/lib64/" LD_PRELOAD="$HOME/my_libc_env/libstdc/usr/lib64/libstdc++.so.6.0.19" $HOME/my_libc_env/lib/x86_64-linux-gnu/ld-2.17.so `which python`

siempre debe hacer esto mientras ejecuta Python, así que cree un script que cargue estas variables y llame al intérprete de Python

vim tmp.sh LD_LIBRARY_PATH="$HOME/my_libc_env/lib/x86_64-linux-gnu/:$HOME/my_libc_env/lib64/" LD_PRELOAD="$HOME/my_libc_env/libstdc/usr/lib64/libstdc++.so.6.0.19" $HOME/my_libc_env/lib/x86_64-linux-gnu/ld-2.17.so `which python`


Mi solución es similar a la de Theo T; aunque ajustado para Xubuntu 12.04 (CAELinux 2013)

sudo pip install --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.6.0-cp27-none-linux_x86_64.whl sudo su # prompt for password TENSORFLOW_DIR=`python -c "import imp; print(imp.find_module(''tensorflow'')[1])"` for addr in 0xC6A93C 0xC6A99C 0xC6A9EC 0xC6AA0C 0xC6AA1C 0xC6AA3C; do printf ''/x02'' | dd conv=notrunc of=${TENSORFLOW_DIR}/python/_pywrap_tensorflow.so bs=1 seek=$((addr)) ; done readelf -V ${TENSORFLOW_DIR}/python/_pywrap_tensorflow.so exit mkdir ~/.my_stubs cd ~/.my_stubs MYSTUBS=~/.my_stubs printf "#include <time.h>/n#include <string.h>/nvoid* memcpy(void *dest, const void *src, size_t n) {/nreturn memmove(dest, src, n);/n}/nint clock_gettime(clockid_t clk_id, struct timespec *tp) {/nreturn clock_gettime(clk_id, tp);/n}" > mylibc.c gcc -s -shared -o mylibc.so -fPIC -fno-builtin mylibc.c printf "#include <functional>/nvoid std::__throw_bad_function_call(void) {/nexit(1);/n}" > bad_function.cc gcc -std=c++11 -s -shared -o bad_function.so -fPIC -fno-builtin bad_function.cc git clone https://github.com/gcc-mirror/gcc.git cd gcc mkdir my_include mkdir my_include/ext cp libstdc++-v3/include/ext/aligned_buffer.h my_include/ext gcc -I$PWD/my_include -std=c++11 -fpermissive -s -shared -o $MYSTUBS/hashtable.so -fPIC -fno-builtin libstdc++-v3/src/c++11/hashtable_c++0x.cc gcc -std=c++11 -fpermissive -s -shared -o $MYSTUBS/chrono.so -fPIC -fno-builtin libstdc++-v3/src/c++11/chrono.cc gcc -std=c++11 -fpermissive -s -shared -o $MYSTUBS/random.so -fPIC -fno-builtin libstdc++-v3/src/c++11/random.cc gcc -std=c++11 -fpermissive -s -shared -o $MYSTUBS/hash_bytes.so -fPIC -fno-builtin ./libstdc++-v3/libsupc++/hash_bytes.cc

Los siguientes dos pasos ejecutarían el script convolution.py ubicado en el directorio tensorflow / models / image / mnist:

LIBSTDCPP=`ldconfig -p | grep libstdc++.so.6 | grep 64 | cut -d'' '' -f4` #For 64bit machines LD_PRELOAD="$MYSTUBS/mylibc.so:$MYSTUBS/random.so:$MYSTUBS/hash_bytes.so:$MYSTUBS/chrono.so:$MYSTUBS/hashtable.so:$MYSTUBS/bad_function.so:$LIBSTDCPP" python ${TENSORFLOW_DIR}/models/image/mnist/convolutional.py

Si desea que Python se cargue siempre con estas dependencias reducidas, simplemente agregue esto al archivo .bashrc con el siguiente paso:

echo "LIBSTDCPP=`ldconfig -p | grep libstdc++.so.6 | grep 64 | cut -d'' '' -f4`" >> ~/.bashrc echo alias python="''"LD_PRELOAD=''"''''$''MYSTUBS/mylibc.so:''$''MYSTUBS/random.so:''$''MYSTUBS/hash_bytes.so:''$''MYSTUBS/chrono.so:''$''MYSTUBS/hashtable.so:''$''MYSTUBS/bad_function.so:''$''LIBSTDCPP''"'' python"''" >> ~/.bashrc

Y si tienes ipython:

echo alias ipython="''"LD_PRELOAD=''"''''$''MYSTUBS/mylibc.so:''$''MYSTUBS/random.so:''$''MYSTUBS/hash_bytes.so:''$''MYSTUBS/chrono.so:''$''MYSTUBS/hashtable.so:''$''MYSTUBS/bad_function.so:''$''LIBSTDCPP''"'' ipython"''" >> ~/.bashrc

Básicamente, lo actualicé a la instalación de Python que se realiza en dist_packages en lugar de paquetes de sitio. Además, clono desde el gcc-mirror lugar de la página nativa de git para gcc. Descansa todo es lo mismo.

Los últimos pasos aseguran que cada vez que ejecute python o ipython, se cargue con las dependencias reducidas.


Nota para la solución ''debilitante'' de Theo Trouillon. Solo aplica para Tensorflow 0.6.0. Si desea aplicarlo para Tensorflow 0.9.0, se vuelve más complicado. Mi caso fue el modo CPU, Centos 6.7 donde GLIBC 2.12 GLIBCXX 3.4.13.

Instalación de tensorflow:

pip uninstall protobuf pip install --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.9.0-cp27-none-linux_x86_64.whl

El código ''debilitante'' debería CAMBIARSE:

TENSORFLOW_DIR=`python -c "import imp; print(imp.find_module(''tensorflow'')[1])"` for addr in 0x376e34 0x376e94 0x376ef4 0x376f14 0x376f24 0x376f44 0x376f54 ; do printf ''/x02'' | dd conv=notrunc of=${TENSORFLOW_DIR}/python/_pywrap_tensorflow.so bs=1 seek=$((addr)) ; done for addr in 0x93aa4 0x93b04 ; do printf ''/x02'' | dd conv=notrunc of=${TENSORFLOW_DIR}/contrib/layers/python/ops/_bucketization_op.so bs=1 seek=$((addr)) ; done for addr in 0x95bec 0x95c4c ; do printf ''/x02'' | dd conv=notrunc of=${TENSORFLOW_DIR}/contrib/layers/python/ops/_sparse_feature_cross_op.so bs=1 seek=$((addr)) ; done for addr in 0x9ffec 0x9fffc 0xa005c ; do printf ''/x02'' | dd conv=notrunc of=${TENSORFLOW_DIR}/contrib/metrics/python/ops/_set_ops.so bs=1 seek=$((addr)) ; done for addr in 0x96aa4 0x96b04 0x96b24; do printf ''/x02'' | dd conv=notrunc of=${TENSORFLOW_DIR}/contrib/linear_optimizer/python/ops/_sdca_ops.so bs=1 seek=$((addr)) ; done

Y el siguiente código se debe AGREGAR al código de generación de código auxiliar en la máquina más nueva.

mkdir my_include/bits cp libstdc++-v3/include/bits/shared_ptr_atomic.h my_include/bits/ cp libstdc++-v3/include/std/memory my_include/ gcc -I$PWD/my_include -std=c++11 -fpermissive -s -shared -o ${MYSTUBS}/shared_ptr.so -fPIC -fno-builtin ./libstdc++-v3/src/c++11/shared_ptr.cc gcc -I$PWD/my_include -std=c++11 -fpermissive -s -shared -o ${MYSTUBS}/list.so -fPIC -fno-builtin ./libstdc++-v3/src/c++98/list.cc echo " #include <unistd.h> #include <stdlib.h> char * secure_getenv (const char *name) { if ((getuid () == geteuid ()) && (getgid () == getegid ())) return getenv (name); else return NULL; }" > getenv.cc gcc -I$PWD/my_include -std=c++11 -fpermissive -s -shared -o ${MYSTUBS}/getenv.so -fPIC -fno-builtin getenv.cc

Por supuesto, el código de ejecución final debe cambiarse para incluir apéndices adicionales.

LD_PRELOAD="$MYSTUBS/list.so:$MYSTUBS/mylibc.so:$MYSTUBS/shared_ptr.so:$MYSTUBS/getenv.so:$MYSTUBS/random.so:$MYSTUBS/hash_bytes.so:$MYSTUBS/chrono.so:$MYSTUBS/hashtable.so:$MYSTUBS/bad_function.so:$LIBSTDCPP" python ${TENSORFLOW_DIR}/models/image/mnist/convolutional.py


Obtuve "versión` GLIBC_2.14 ''no encontrada "al importar tensorflow en python. Gestionado para importar tensorflow en python3.5 en Centos6.6 usando virtualenv:

mkdir ~/tensorflow cd ~/tensorflow virtualenv --system-site-packages -p python3.5 ~/tensorflow source bin/activate wget http://launchpadlibrarian.net/137699828/libc6_2.17-0ubuntu5_amd64.deb wget http://launchpadlibrarian.net/137699829/libc6-dev_2.17-0ubuntu5_amd64.deb wget ftp://195.220.108.108/linux/mageia/distrib/4/x86_64/media/core/updates/libstdc++6-4.8.2-3.2.mga4.x86_64.rpm wget https://rpmfind.net/linux/centos/7.4.1708/updates/x86_64/Packages/glibc-2.17-196.el7_4.2.i686.rpm ar p libc6_2.17-0ubuntu5_amd64.deb data.tar.gz | tar zx ar p libc6-dev_2.17-0ubuntu5_amd64.deb data.tar.gz | tar zx rpm2cpio libstdc++6-4.8.2-3.2.mga4.x86_64.rpm | cpio -idmv rpm2cpio glibc-2.17-196.el7_4.2.i686.rpm | cpio -idmv pip3.5 install --upgrade tensorflow export PYTHONPATH="$HOME/tensorflow/lib/python3.5/site-packages/" alias tfpython=''LD_LIBRARY_PATH="$HOME/tensorflow/lib/x86_64-linux-gnu/:$HOME/tensorflow/usr/lib64/" $HOME/tensorflow/lib/x86_64-linux-gnu/ld-2.17.so /usr/local/bin/python3.5'' tfpython


Tuve el mismo problema, así que busqué en Google estos pasos:

$ sudo pip install --upgrade virtualenv $ virtualenv --system-site-packages ~/tensorflow $ cd ~/tensorflow $ source bin/activate $ pip install --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.5.0-cp27-none-linux_x86_64.whl $ cd /tmp $ wget http://launchpadlibrarian.net/137699828/libc6_2.17-0ubuntu5_amd64.deb $ wget http://launchpadlibrarian.net/137699829/libc6-dev_2.17-0ubuntu5_amd64.deb $ mkdir libc6_2.17 $ cd libc6_2.17 $ ar p ../libc6_2.17-0ubuntu5_amd64.deb data.tar.gz | tar zx $ ar p ../libc6-dev_2.17-0ubuntu5_amd64.deb data.tar.gz | tar zx $ cd - $ LD_LIBRARY_PATH=/tmp/libc6_2.17/lib/x86_64-linux-gnu/ /tmp/libc6_2.17/lib/x86_64-linux-gnu/ld-2.17.so bin/python local/lib/python2.7/site-packages/tensorflow/models/image/mnist/convolutional.py

Y para salir:

$ deactivate

Funciona para mi.


Tuve un problema similar al intentar instalar numba en un viejo sistema HPC Linux que ejecuta SUSE Linux Enterprise Server 11, que tiene glibc 2.11.3 (según ldd --version ). No tengo acceso de superusuario, y cualquier instalación regular de conda (ya sea por los canales defaults , conda-forge o numba ) fallaría con OSError: /lib64/libpthread.so.0: version GLIBC_2.12 not found (required by ...envs/test1-py37/lib/python3.7/site-packages/llvmlite/binding/libllvmlite.so ). Logré instalarlo numba siguiendo los siguientes pasos:

  1. Crea un entorno conda
  2. Dentro del entorno conda, instale glibc desde el nlsec entorno
  3. Luego use pip para instalar numba y llvmlite construir contra el recién instalado glibc :

Así:

conda create -n test -c nlesc glibc conda activate test pip install numba

Luego importar numba funciona. Sin embargo, posteriormente se debe tener cuidado de que cualquier subsiguiente conda install no se "actualice" llvmlite a una versión incompatible numba o que el viejo problema vuelva. Es posible que desee anclar uno o ambos para este efecto. Tendrás que anclar la compilación y la versión. Creé un archivo que pinned contiene:

llvmlite==0.27.0-pypi numba==0.42.0-pypi

y lo coloqué dentro de mi entorno conda en un archivo de texto conda-meta/pinned .


Probé la solución BR_User y aún me molestaba :

ImportError: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.14'' not found

Estoy en CentOS 6.7, también carece de una lib estándar actualizada de c ++, así que para construir sobre la solución BR_User extraje el paquete libstdc ++ correcto, sin embargo, no encontré la necesidad del entorno virtual.

Suponiendo que ya haya instalado tensorflow, le da:

mkdir ~/my_libc_env cd ~/my_libc_env wget http://launchpadlibrarian.net/137699828/libc6_2.17-0ubuntu5_amd64.deb wget http://launchpadlibrarian.net/137699829/libc6-dev_2.17-0ubuntu5_amd64.deb wget ftp.riken.jp/Linux/scientific/7.0/x86_64/os/Packages/libstdc++-4.8.2-16.el7.x86_64.rpm ar p libc6_2.17-0ubuntu5_amd64.deb data.tar.gz | tar zx ar p libc6-dev_2.17-0ubuntu5_amd64.deb data.tar.gz | tar zx rpm2cpio libstdc++-4.8.2-7mgc30.x86_64.rpm| cpio -idmv

y luego ejecuta python con:

LD_LIBRARY_PATH="$HOME/my_libc_env/lib/x86_64-linux-gnu/:$HOME/my_libc_env/usr/lib64/" $HOME/my_libc_env/lib/x86_64-linux-gnu/ld-2.17.so `which python`

Si no funciona, tengo otra solución , pero no te va a gustar.