web-dev-qa-db-fra.com

Erreur lors de l'importation de Tensorflow dans Python 2.7 dans Ubuntu 12.04. 'GLIBC_2.17 not found'

J'ai installé les liaisons Tensorflow avec python avec succès. Mais lorsque j'essaie d'importer Tensorflow, j'obtiens l'erreur suivante.

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)

J'ai essayé de mettre à jour GLIBC_2.15 à 2.17, mais pas de chance.

43
Tanvir

J'ai eu le même problème, alors googler j'ai fait ces étapes:

$ 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

Et pour sortir:

$ deactivate 

Ça marche pour moi.

16
Fabiano

Je viens de réussir à installer tensorflow 0.12rc0 sur CentOS 6.5 avec glibc 2.12, sans avoir les privilèges root. La simple installation de binaire tensorflow via pip me générait une erreur, liée également à la version de GLIBC.

En gros, vous avez 4 options pour régler ce problème (chacune avec des avantages et des inconvénients):

Option 1 - Mettez à niveau votre système GLIBC globalement.

Ceci est , probablement la meilleure option, si votre système le supporte , vous avez privilèges root, et vous êtes confiant que cette mise à jour ne cassera rien pour une raison étrange. En fin de compte, cela revient à mettre à niveau toute la distribution Linux. Here Une belle liste des versions par défaut de GLIBC sur les distributions populaires.

Option 2 - Ajouter un deuxième GLIBC à votre système

Compiler ou télécharger le binaire . L'option la plus simple et directe. Surtout si vous avez seulement besoin de exécuter quelques scripts simples .

  • Il est possible == avoir plusieurs versions de la glibc sur le même système, mais il faut le faire avec le plus grand soin.
  • Vous ne détruirez pas votre système si toutes vos modifications étaient limitées à un environnement virtuel.
  • De nombreux programmes, installés/compilés auparavant, peuvent s’appuyer sur l’ancien GLIBC, ne ferait que planter dans votre nouvel environnement (par exemple, votre python IDE). la plupart des commandes bash, comme "lc", "cd", etc.
  • D'autres effets secondaires tels que d'importantes fuites de mémoire sont également possibles.
  • Par conséquent, c’est une très mauvaise idée de ajouter un nouveau GLIBC à votre environnement normal , par exemple. via .bashrc.
  • D'autre part, si vous avez besoin d'un outil spécifique dans votre nouvel environnement virtuel, vous pouvez le recompiler, en le liant au nouveau GLIBC . Donc, cela fonctionnerait bien dans votre nouvel environnement.
  • Cependant, personnellement, j’ai vite renoncé à recompiler tout ce dont j’avais besoin dans un nouvel environnement (sans root ni gestionnaire de paquets).
  • Une approche légèrement différente est officiellement proposée par les développeurs GLIBC, pour tester de nouvelles versions de GLIBC.

Option 3 - Tenseur du patch

This peut fonctionner pour TF 0.6.0, mais vous devrez probablement recommencer à zéro, à la sortie de chaque nouvelle version de tensorflow. Par exemple. here est un correctif pour 0.9.0.

Option 4 - Compiler le flux tensoriel à partir de la source

Si vous le recompilez à partir de la source et que vous établissez un lien avec votre GLIBC existant, un nouveau GLIBC ne serait plus nécessaire. D'une manière ou d'une autre, cette option n'a encore été mentionnée dans aucune réponse. À mon humble avis, c’est la meilleure option, à la fois " en général " et "spécifiquement pour tensorflow".

  • Cela fonctionne bien avec r0.11 et fonctionnerait probablement pendant des années, mais en théorie, une version plus récente de tensorflow pourrait être endommagée si les utilisateurs décidaient d'utiliser une nouvelle fonctionnalité GLIBC, absente des versions précédentes.
  • Pour être honnête, créer un flux de tensor à partir de la source n’est pas simple, en particulier sur des systèmes obsolètes.

Un résumé rapide de "bâtiment tensorflow sur un système obsolète":

Bien que le guide officiel propose une section " installation à partir de sources ", il existe quelques astuces que vous devez faire pour le construire sur un système obsolète. Je suppose ici que vous n’avez pas les privilèges root (si vous en avez, vous pourrez probablement installer les mêmes pré-requêtes avec un gestionnaire de paquets, plutôt qu’ils les construisant manuellement à partir des sources).

J'ai trouvé deux histoires de réussite bien documentées: # 1 , # 2 et un certain nombre de messages utiles sur le github officiel (principalement sur un ensemble de bibliothèques à relier dans le binaire): # 1 , # 2 , # 3 , # 4 . J'ai dû combiner des astuces, décrites ici, pour réussir à compiler TF dans mon cas.

  1. Tout d’abord, vérifiez votre gcc --version Et verify qu’il prend en charge c ++ 11. Le mien était 4.4.7, donc ça ne marchera pas. J'ai téléchargé le code source de gcc-4.9.4 et l'a compilé . Cette étape est assez simple, mais la compilation elle-même peut prendre quelques heures. Pour résoudre un problème dans bazel, j’ai compilé gcc avec chemins codés en dur en as, ld et nm . Cependant, vous pouvez essayer d'autres solutions: ( 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. Vérifiez votre Java --version. Bazel nécessite JDK 8, installez-le si nécessaire. (Ils ont toujours fournissent quelques téléchargements liés à jdk7, pour bazel-0.4.1 mais il semble qu'ils le considèrent comme obsolète)

  3. J'ai créé un fichier séparé use_gcc_4.9.4.sh, Avec les variables d'environnement nécessaires. J'utilise source ./use_gcc_4.9.4.sh Lorsque j'ai besoin d'un élément lié à ce nouveau compilateur.

    #!/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. Le binaire bazel actuel (0.4.1) requiert GLIBC 2.14 , nous devons donc compiler bazel à partir de la source (avec notre nouveau gcc). Fonctionne correctement, sauf si vous êtes uniquement autorisé à exécuter un nombre très limité de threads sur la machine cible. ( This post décrit quelques solutions de contournement supplémentaires, mais dans mon cas, elles n'étaient pas nécessaires, peut-être en raison de mises à jour récentes dans le code bazel.)

  5. Obtenez le code source de tensorflow git clone https://github.com/tensorflow/tensorflow Et installez les prérequis dont vous avez besoin (CUDA, NDNC, Python, etc.). Voir guide officiel .

  6. Si vous n'utilisez pas le système gcc par défaut (par exemple, si vous deviez compiler un nouveau gcc, comme expliqué ci-dessus), ajoutez les drapeaux de l'éditeur de liens suivants à tensorflow/third_party/gpus/crosstool/CROSSTOOL.tpl, ligne 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"
    

    Sans cette étape, vous risquez de rencontrer des messages d'erreur tels que 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. Enfin, pour éviter les dépendances GLIBC, nous devons relier statistiquement certaines bibliothèques en ajoutant le drapeau -lrt ( peut-être-lm Également). J'ai trouvé plusieurs posts suggérant d'ajouter ceci d'une manière différente:

    • via bazel en ligne de commande (peut sembler raisonnable, mais ne fonctionne pas pour moi sur la version actuelle du tensorflow, en quelque sorte),
    • via "bazel-tensorflow/external/protobuf/BUILD" (pas sûr que ça marche, mais ça n'a pas l'air commode - ce fichier n'est créé que pendant la tentative de construction)
    • via "third_party/gpus/crosstool/CROSSTOOL.tpl" (le même fichier que nous venons de modifier à l'étape précédente, juste en dessous des lignes que nous avons déjà ajoutées).

      linker_flag: "-lrt"
      linker_flag: "-lm"
      
    • via "tensorflow/tensorflow.bzl" (fonctionne pour moi, mais moins pratique simplement parce que vous devez éditer un fichier de plus. Je ne suis pas sûr que ce soit l'équivalent à 100% du précédent point)

    Sans -lrt, J'ai encore rencontré une erreur liée à la version de GLIBC, en essayant 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)
    

    Sans -lm, Vous pourriez rencontrer this (pour moi, cela ne s'est pas avéré nécessaire).

  8. Exécutez le processus de construction.

    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. Essayez d’exécuter le script simple python) pour vérifier si les éléments les plus élémentaires fonctionnent:

    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))
    
20
Igor

J'ai essayé solution BR_User et j'avais toujours un ennuyeux:

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

Je suis sur CentOS 6.7, il manque aussi une librairie standard c ++ mise à jour, aussi, pour construire sur la solution BR_User, j’ai extrait le paquet correct libstdc ++, mais j’ai trouvé qu’il n’était pas nécessaire d’utiliser l’environnement virtuel.

Si vous avez déjà installé tensorflow, cela donne:

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

puis exécutez python avec:

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 cela ne fonctionne pas, j'ai ne autre solution , mais cela ne vous plaira pas.

17
Théo T

Bon alors voici l’autre solution que j’ai mentionnée dans mon réponse précédente , c’est plus compliqué, mais devrait toujours fonctionner sur des systèmes avec GLIBC> = 2.12 et GLIBCXX> = 3.4.13. Dans mon cas, il s’agissait d’une CentOS 6.7, mais c’est également acceptable pour Ubuntu 12.04.

Nous aurons besoin d’une version de gcc prenant en charge c ++ 11, soit sur une autre machine, soit sur une installation isolée; mais pas pour le moment.

Ce que nous allons faire ici, c'est éditer le binaire _pywrap_tensorflow.so pour "affaiblir" ses dépendances libc et libstdc ++, afin que ld accepte de lier les stubs que nous allons créer. Ensuite, nous allons créer ces stubs pour les symboles manquants et, finalement, nous allons pré-charger tout cela lors de l’exécution de python.

Tout d’abord, je tiens à remercier James pour son excellent article ( http://www.lightofdawn.org/wiki/wiki.cgi/NewAppsOnOldGlibc ) et ses précieux conseils, je n’aurais pas pu le faire. sans lui.

Commençons donc par affaiblir les dépendances, il s’agit simplement de remplacer les octets appropriés dans _pywrap_tensorflow.so. Veuillez noter que cette étape ne fonctionne que pour la version actuelle de tensorflow (0.6.0). Donc, si ce n’est pas fait, créez et activez votre virtualenv si vous en avez un (si vous n’êtes pas administrateur, virtualenv est une solution, vous pouvez également ajouter --user drapeau sur la commande pip), et installez tensorflow 0.6.0 (remplacez cpu par gpu dans l’url si vous voulez la version gpu):

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

Et affaiblissons toutes les dépendances gênantes, voici la commande pour la version 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

Et voici le gpu (lancez seulement le bon ou vous allez corrompre le binaire):

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

Vous pouvez le vérifier avec:

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

Jetez un coup d'oeil à l'article si vous voulez comprendre ce qui se passe ici.

Maintenant, nous allons faire les stubs pour les symboles libc manquants:

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

Vous devez effectuer cette opération sur la machine avec les dépendances manquantes (ou une machine avec des versions similaires de bibliothèques standard (dans un cluster par exemple)).

Maintenant, nous allons probablement changer de machine car nous avons besoin d’un gcc qui supporte le c ++ 11, et ce n’est probablement pas sur la machine qui manque de toutes les dépendances (ou vous pouvez utiliser une installation isolée d’un gcc récent). Dans ce qui suit, je suppose que nous sommes toujours en ~/my_stubs et vous partagez d'une manière ou d'une autre votre maison entre les machines, sinon vous devrez simplement copier les fichiers .so que nous allons générer une fois terminé.

Donc, un stub que nous pouvons faire pour libstdc ++, et pour les derniers manquants, nous allons les compiler à partir de la source gcc (le clonage du référentiel peut prendre un peu de temps):

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

Et c'est tout! Vous pouvez maintenant exécuter un script tensorflow python) en préchargeant toutes nos bibliothèques partagées (et votre libstdc ++ locale):

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

:)

10
Théo T

Note à la solution 'affaiblissante' de Theo Trouillon. Cela s'applique uniquement à Tensorflow 0.6.0. Si vous souhaitez l'appliquer à Tensorflow 0.9.0, cela devient plus compliqué. Mon cas était en mode CPU, Centos 6.7 où GLIBC 2.12 GLIBCXX 3.4.13.

Installation 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

Le code 'affaiblissant' devrait être CHANGÉ:

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

Et le code suivant doit être ajouté au code générant le stub sur la nouvelle machine.

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

Bien entendu, le code final en cours devrait être modifié pour inclure des stubs supplémentaires.

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
2
Tay Cho

Le lien dans la réponse de @ Théo T ne fonctionne plus, alors j'ai dû essayer plusieurs alternatives pour enfin en trouver une qui fonctionne.

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

Exécuter python avec 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
1
Honglei Liu

Cette erreur survient principalement si votre C-Library GNU n'est pas à jour. Vous pouvez vérifier la version que vous utilisez actuellement à l'aide d'une simple.

$ ldd --version

Le résultat devrait être comme ceci:

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 est votre version de GLIBC. Pour mettre à niveau, vous pouvez visiter le site web du projet de la bibliothèque GNU-C et télécharger la dernière version. Le lien vers la dernière glibc est ici: Téléchargement de la bibliothèque GNU-C Au moment de la rédaction de cette réponse, la dernière version stable de était de 2.22 .

J'ai essayé d'exécuter tensorflow sur Ubuntu 12.04 et 14.04. Ubuntu 14.04 ne pose pas ce problème car il est livré avec la glibc 2.19 installée par défaut.

J'espère que ça aide.

1
shanky_thebearer

Ma solution est similaire à celle de Theo T; bien ajusté pour 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

Les deux étapes suivantes exécuteraient le script convolution.py situé dans le répertoire 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 vous voulez que python soit toujours chargé avec ces dépendances réduites, ajoutez-le simplement au fichier .bashrc en procédant comme suit:

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

Et si vous avez 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

En gros, je l'ai mis à jour avec python est effectuée dans dist_packages au lieu de sites-packages. De plus, je clone à partir de gcc-mirror à la place de la page git native pour gcc. Reste tout est pareil.

Les dernières étapes garantissent que chaque fois que vous exécuterez python ou ipython, il sera chargé avec les dépendances réduites.

1
Sam

J'ai essayé la solution https://stackoverflow.com/a/34897674/5929065 , et sa a fonctionné parfaitement. Mais libstdc ++ - Le lien de téléchargement 4.8.2-7 n’est plus accessible, essayez-en un nouveau depuis cette page: http://rpm.pbone.net/index.php3/stat/4/idpl /31981489/dir/centos_7/com/libstdc++-4.8.5-4.el7.x86_64.rpm.html

Pour moi, j'utilise ceci:

wget ftp://mirror.switch.ch/pool/4/mirror/centos/7.2.15.13/os/x86_64/Packages/libstdc++-4.8.5-4.el7.x86_64.rpm

0
Yajun Huang

J'ai eu le même problème et a trouvé la solution suivante :

conda install tensorflow
0
Mahdi

J'ai eu un problème similaire en essayant d'installer numba sur un ancien système HPC Linux exécutant SUSE Linux Enterprise Server 11, doté de la glibc 2.11.3 (selon ldd --version). Je n'ai aucun accès superutilisateur, ni aucune installation de conda classique (des canaux defaults, conda-forge ou numba) échouerait avec OSError: /lib64/libpthread.so.0: versionGLIBC_2.12not found (required by ...envs/test1-py37/lib/python3.7/site-packages/llvmlite/binding/libllvmlite.so). J'ai réussi à installer numba en procédant comme suit:

  1. Créer un environnement conda
  2. Dans l'environnement conda, installez glibc à partir de l'environnement nlsec
  3. Ensuite, utilisez pip pour installer numba et llvmlite construit sur le glibc nouvellement installé:

Ainsi:

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

Puis importer numba fonctionne. Cependant, il faut par la suite veiller à ce que tout conda install ne "met pas à niveau" llvmlite vers une version non compatible avec numba, ou l'ancien problème est renvoyé. Vous voudrez peut-être épingler l'un ou les deux pour cet effet. Vous devrez épingler la construction ainsi que la version. J'ai créé un fichier pinned contenant:

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

et l'a placé dans mon environnement conda dans un fichier texte conda-meta/pinned.

0
gerrit

J'ai reçu la version "GLIBC_2.14" introuvable "lors de l'importation de tensorflow en python. Géré pour importer tensorflow en python3.5 sur Centos6.6 à l'aide de 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
0
breizhmg

Les réponses ci-dessus vont bien, mais je suis toujours confronté à des problèmes même après les avoir faites. J'ai suivi comme dans la réponse @Theo sur rhel et j'essayais d'exporter LD_LIBRARY_PATH qui avait généré des erreurs, avec LD_LIBRARY_PATH également d'inclure LD_PRELOAD en tant que

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`

vous devez toujours faire cela pendant que vous exécutez python, alors créez un script qui charge ces variables et appelle python interprète

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`
0
rakesh

Remarque: vous devriez télécharger le paquet deb sur votre plate-forme:

x86:

https://launchpad.net/ubuntu/raring/i386/libc6/2.17-0ubuntu5.1

wget http://launchpadlibrarian.net/151932048/libc6_2.17-0ubuntu5.1_i386.deb

Sudo dpkg -i libc6_2.17-0ubuntu5.1_i386.deb

x64:

https://launchpad.net/ubuntu/raring/AMD64/libc6/2.17-0ubuntu5.1

wget http://launchpadlibrarian.net/151925896/libc6_2.17-0ubuntu5.1_AMD64.deb

Sudo dpkg -i libc6_2.17-0ubuntu5.1_AMD64.deb

Testez sur mon 12.04 Ubuntu x64.

0
Mithril