Erreur lors de l'importation Tensorflow en Python 2.7 sous Ubuntu 12.04. 'GLIBC_2.17 non trouvé"
J'ai installé le Tensorflow liaisons 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.
Vous devez vous connecter pour publier un commentaire.
J'ai eu le même problème, donc une recherche sur google, j'ai fait ces étapes:
Et à la sortie:
Qui fonctionne pour moi.
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/tmp/libc6_2.17/lib/x86_64-linux-gnu blablabla
. Pour moi, travaillé par exemple ceci:LD_LIBRARY_PATH=$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
qui python`/tmp
, comme suggéré ici), et le système devrait être OK.J'ai juste réussi à installer tensorflow 0.12rc0 sur CentOS 6.5 avec la glibc 2.12, sans avoir les privilèges root. Simplement en installant tensorflow binaires via le pip a été de me donner une erreur, liée à la version de la GLIBC ainsi.
Fondamentalement, vous avez 4 options pour faire face à cette (chacune avec certains avantages et inconvénients):
Option 1 - Mise à niveau de votre système de GLIBC à l'échelle mondiale.
C'est, probablement, la meilleure option, si votre système prend en charge cette, vous avez les privilèges de root, et que vous êtes persuadé que cette mise à jour ne va pas casser quoi que ce soit pour une raison ou une autre. En fin de compte, cela va jusqu'à la mise à niveau de l'ensemble de la distribution Linux. Ici's une belle petite liste de défaut sur les versions de la GLIBC sur les distributions.
Option 2 - Ajouter la deuxième GLIBC pour votre système
La compilation ou de télécharger les binaires. Le plus simple&simple option. Surtout si vous avez seulement besoin de exécuter quelques scripts simples.
.bashrc
.Option 3 - Patch tensorflow
Cette peuvent travailler pour la TF de la version 0.6.0, mais vous auriez probablement recommencer à partir de zéro, lors de chaque nouvelle tensorflow version est disponible. E. g. ici's un correctif pour 0.9.0.
Option 4 - Compiler tensorflow à partir de la source
Si vous le re-compiler à partir des sources et de lien à l'encontre de votre existant, GLIBC, plus récent, GLIBC ne serait plus nécessaire. D'une certaine façon, cette option n'a pas été mentionné dans la réponse ici encore. À mon humble avis, c'est la meilleure option, à la fois "en général", et "spécialement pour tensorflow".
Un rapide résumé de "construction de tensorflow sur le système obsolète":
Bien que le guide officiel fournit une "l'installation à partir des sources" section, il ya quelques trucs que vous devez faire pour construire sur un système désuet. Ici, je suppose, que vous n'avez pas les privilèges root (si vous ne le faites - vous sera probablement en mesure d'installer le même pré-requestities avec un gestionnaire de paquet, plutôt manuellement les construire à partir de la source).
J'ai trouvé deux bien documenté histoires de réussite: #1, #2 et un certain nombre de posts sur le github (surtout sur un ensemble de bibliothèques de lien à l'intérieur du binaire): #1, #2, #3, #4. J'ai dû combiner les astuces, décrit on à réussi à compiler TF dans mon cas.
Tout d'abord, vérifiez votre
gcc --version
, et vérifier qu'il prend en charge le c++11. Le mien était 4.4.7, de sorte qu'il ne fonctionne pas. J'ai téléchargé gcc-4.9.4 le code source, et compilé. Cette étape est assez simple, mais la compilation elle-même peut prendre quelques heures. Comme une solution de contournement pour un problème avec les sections de bazel, j'ai compilé avec gcc des chemins codés en dur àas
,ld
etnm
. Cependant, vous pouvez essayer une autre solution: (Un, Deux).Vérifier votre
java --version
. Avec les sections de bazel requiert JDK 8, installer si nécessaire. (Ils fournir certains jdk7 téléchargements connexes, pour avec les sections de bazel-0.4.1 mais il semble comme ils le jugent obsolète)J'ai créé une
use_gcc_4.9.4.sh
fichier, avec les variables d'environnement nécessaires. J'utilisesource ./use_gcc_4.9.4.sh
quand j'ai besoin de quelque chose lié à ce nouveau compilateur.Le courant avec les sections de bazel binaire (0.4.1) nécessite la GLIBC 2.14, nous avons donc à compiler avec les sections de bazel à partir de la source ainsi (avec notre nouveau gcc). OK, à moins que vous ne sont autorisé à exécuter un nombre très limité de threads sur la machine cible. (Cette post décrit quelques autres solutions de contournement, mais dans mon cas, ils n'étaient pas nécessaires, peut-être en raison des récentes mises à jour avec les sections de bazel code.)
Obtenir tensorflow code source
git clone https://github.com/tensorflow/tensorflow
, et installer les composants requis vous avez besoin d' (CUDA,cuDNN,python, etc). Voir guide officiel.Si vous n'utilisez pas le système par défaut de gcc (par exemple, si vous avez eu à compiler plus récente de gcc, comme discuté ci-dessus), ajouter les liens suivante drapeaux à
tensorflow/third_party/gpus/crosstool/CROSSTOOL.tpl
, ligne 59:Sans cette étape, vous seriez probablement rencontrer un message d'erreur comme cette:
Enfin, pour éviter la GLIBC dépendances, nous devons lier statiquement certaines bibliothèques, par l'ajout de la
-lrt
de l'éditeur de liens drapeau (peut-être-lm
ainsi). J'ai trouvé plusieurs posts, ce qui suggère d'ajouter cela dans une manière différente:via "third_party/gpu/crosstool/CROSSTOOL.tpl" (le même fichier que nous avons juste modifié à l'étape précédente, juste en dessous des lignes, nous avons déjà ajouté).
via "tensorflow/tensorflow.bzl" (fonctionne pour moi, mais moins pratique simplement parce que vous devez modifier un autre fichier. Je n'en suis pas sûr à 100% de l'équivalent du point précédent)
Sans
-lrt
j'ai couru dans la GLIBC, spécifique à la version d'erreur à nouveau, en essayant deimport tensorflow
:Sans
-lm
vous pouvez exécuter en cette (pour moi, il s'est avéré être pas nécessaire).Exécuter le processus de construction.
Essayez d'exécuter la suite de simple script python pour tester si les choses les plus élémentaires du fonctionnement:
configure: error: cannot execute: usr/bin/as: check --with-as or env. var. DEFAULT_ASSEMBLER make[2]: *** [configure-stage1-gcc] Error 1 make[2]: Leaving directory '/mnt/home/xx/download/gcc-4.9.4/objdir' make[1]: *** [stage1-bubble] Error 2 make[1]: Leaving directory '/mnt/home/xx/download/gcc-4.9.4/objdir' make: *** [all] Error 2
lorsque je configure gccbazel build --config=opt //tensorflow/tools/pip_package:build_pip_package
, comme ici[tensorflow.org/install/install_sources] suggèrent, sans gup. Et j'ai ajouté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"
àtensorflow/third_party/gpus/crosstool/CROSSTOOL.tpl
, encore obtenu d'erreur...'GLIBCXX_3.4.20' not found..., ...'CXXABI_1.3.8' not found..., ...'GLIBCXX_3.4.18' not found...
glibc
denlesc
oumgckind
garde le même comportement,glibc
deasmeurer
donnepython: error while loading shared libraries: __vdso_time: invalid mode for dlopen(): Invalid argument
)J'ai essayé BR_User solution et toujours eu une fâcheuse:
Je suis sur CentOS 6.7, il manque aussi une mise à jour de c++ standard lib, donc à construire sur BR_User solution, j'ai extrait le bon libstdc++ package, cependant je n'ai trouvé aucun besoin pour l'environnement virtuel.
En supposant que vous avez déjà installé tensorflow, elle donne:
puis exécuter python avec:
Si cela ne fonctionne pas, j'ai une autre solution, mais vous ne l'aimez pas.
$LD_LIBRARY_PATH:
sur le début.alias
dans votre.bashrc
si vous ne voulez pas le type de tout à chaque foisimport tensorflow
suis confronté à l'erreur suivante:error while loading shared libraries: __vdso_time: invalid mode for dlopen(): Invalid argument
Problème n ° 2105wget ftp://rpmfind.net/linux/...
échoue avecNo such directory “linux/sourceforge/m/ma/magicspecs/apt/3.0/x86_64/RPMS.lib”
. Aucune idée sur les solutions de rechange pour obtenir ce package?Ok, donc, ici, est l'autre solution que j'ai mentionné dans mon réponse précédente, c'est plus compliqué, mais il faut toujours travailler sur des systèmes avec la GLIBC>=2.12 et GLIBCXX>=3.4.13.
Dans mon cas, c'était sur un CentOS 6.7, mais c'est aussi très bien pour Ubuntu 12.04.
Nous allons avoir besoin d'une version de gcc qui prend en charge le c++11, soit sur une autre machine ou un isolé installer; mais pas pour le moment.
Ce que nous allons faire ici est de modifier le _pywrap_tensorflow.donc binaire, dans le but de weakify' son libc et libstdc++ dépendances, de sorte que ld accepte de lier les bouchons, nous allons faire. Ensuite, nous allons nous faire de ces talons pour les symboles manquants, et enfin nous allons pré-charge de tout cela lors de l'exécution de python.
Tout d'abord, je tiens à remercier Jacques pour son excellent article ( http://www.lightofdawn.org/wiki/wiki.cgi/NewAppsOnOldGlibc ) et de précieux conseils, je n'aurais pas pu le faire sans lui.
Donc, nous allons commencer par weakifying les dépendances, c'est juste sur le remplacement de la droite octets dans _pywrap_tensorflow.donc. Veuillez noter que cette étape ne fonctionne que pour la version actuelle de tensorflow (0.6.0). Donc, si ce n'est pas déjà fait, créer et activer votre virtualenv si vous en avez un (si vous n'êtes pas admin virtualenv est une solution, une autre est d'ajouter
--user
drapeau à pip de commande), et installer tensorflow 0.6.0 (remplacer le cpu par gpu dans l'url si vous voulez que le gpu de la version) :Et nous allons weakify tous les ennuyeux dépendances, voici la commande pour la version du processeur de tensorflow:
Et voici le gpu un (exécuter seulement de la bonne ou vous aurez corrompu le fichier binaire):
Vous pouvez le vérifier avec:
Avoir un oeil sur l'article si vous voulez comprendre ce qui se passe ici.
Maintenant, nous allons faire les stubs pour le manque de la libc symboles:
Vous besoin pour effectuer cette étape sur la machine avec les dépendances manquantes (ou à la machine, avec les mêmes versions de bibliothèques standard (dans un cluster par exemple)).
Maintenant, nous allons probablement changer de machine, car nous avons besoin d'un gcc qui prend en charge le c++11, et il n'est probablement pas sur la machine qui manque de toutes les dépendances (ou vous pouvez utiliser un isolé installer une version récente de gcc). Dans la suite, je suppose que nous sommes encore dans
~/my_stubs
et en quelque sorte vous partagez votre maison à travers les machines, sinon vous aurez juste à copier le .donc les fichiers que nous allons générer quand c'est fait.Donc, un tampon que nous pouvons faire pour libstdc++, et pour les autres disparus, nous allons à la compilation de gcc source (cela peut prendre un certain temps pour cloner le dépôt):
Et c'est tout! Vous pouvez maintenant exécuter un tensorflow script python par préchargement tous nos bibliothèques partagées (et votre local libstdc++):
🙂
--user
à lapip install
.clock_gettime
. Avez-vous des idées comment contourner celui-là?_pywrap_tensorflow.so
avec un éditeur de texte. Et remplacer les deux occurrences declock_gettime
avecclack_gettime
. Puis rebaptisé la fonction exportée dansmylibc.c
. Maintenant, tout (jupyter ordinateur portable) fonctionne sans plantage.Note à " weakifying solution de Theo Trouillon. Il ne s'applique que pour Tensorflow la version 0.6.0. Si vous voulez l'appliquer pour Tensorflow 0.9.0, c'est plus difficile.
Mon cas était une mode CPU, Centos 6.7 où la GLIBC 2.12 GLIBCXX 3.4.13.
Installation tensorflow :
'weakifying code doit être MODIFIÉ :
Et code suivant doit être AJOUTÉ à la stub de la génération de code à la machine plus récente.
Cours de la dernière exécution de code doit être modifié afin d'inclure d'autres talons.
Que l'erreur provient principalement si votre GNU C Library n'est pas à jour.
Vous pouvez vérifier quelle version vous êtes en cours d'exécution à l'aide d'un simple
La sortie devrait ressembler à ceci:
La 2.19 est votre version de la GLIBC. Pour mettre à niveau, vous pouvez visiter le GNU C Library projet de site web et de télécharger la dernière version.
Le lien vers la dernière de la glibc est ici : GNU C library Télécharger
Au moment de la rédaction de cette réponse de la dernière version stable était de 2,22.
J'ai essayé de courir tensorflow sur les deux Ubuntu 12.04 et 14.04. Ubuntu 14.04 ne jetez pas ce problème car il est livré avec la glibc 2.19 installé par défaut.
Espère que cela aide.
export LD_LIBRARY_PATH=""
ou/lib64/ld-linux-x86-64.so.2 --library-path /lib64 /bin/ls
temporairement fixé mon problème, et j'ai supprimé récemment modifié.so
fichiers sous/usr/local/lib/
et tout semble aller pour le mieux maintenant(aussi pour la compilation de nouveaux programmes). Veuillez consulter la sourceware.org/glibc/wiki/Testing/BuildsMa solution est similaire à celle de Theo T; bien que affiné pour Xubuntu 12.04 (CAELinux 2013)
Les deux étapes suivantes irait à l'convolution.py script situé dans le tensorflow/modèles/image/mnist répertoire:
Si vous voulez python pour être toujours chargé de la diminution des dépendances, il suffit d'ajouter cette à la .bashrc fichier avec le ci-dessous étape:
Et si vous avez ipython:
En gros, j'ai mis à jour pour l'installation de python fait dans dist_packages au lieu de site-packages. Aussi, je clone de la gcc-miroir au lieu de le natif git page pour gcc. Le reste tous est le même.
La dernière à quelques pas de s'assurer que chaque fois que vous exécutez python ou ipython, il serait chargé avec la réduction des dépendances.
~/.bashrc
pour éviter d'écrire à chaque fois: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'
. Vous pouvez lui donner un nom différent si vous voulez garderpython
commande pas de préchargement de tout. N'oubliez pas d'ajouterMYSTUBS=~/.my_stubs
etLIBSTDCPP=`ldconfig -p | grep libstdc++.so.6 | grep 64 | cut -d' ' -f4`
en premier dans votre~/.bashrc
trop 😉Le lien de @Théo T la réponse est plus de travail, donc j'ai dû essayer plusieurs solutions de rechange pour enfin en trouver un qui fonctionne.
Exécuter du code python avec tensorflow
J'ai essayé https://stackoverflow.com/a/34897674/5929065 solution, et sa a fonctionné parfaitement. Mais libstdc++-4.8.2-7 lien de téléchargement n'est plus accessible, essayez de ramasser un nouveau à partir de 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.1511/os/x86_64/Packages/libstdc++-4.8.5-4.el7.x86_64.rpm
Avis: vous devez télécharger le paquet deb par votre plate-forme:
x86:
https://launchpad.net/ubuntu/raring/i386/libc6/2.17-0ubuntu5.1
x64:
https://launchpad.net/ubuntu/raring/amd64/libc6/2.17-0ubuntu5.1
Test sur mon Ubuntu 12.04 x64.
Réponses ci-dessus sont très bien mais j'ai toujours été confronté à quelques questions, même après de les faire. J'ai suivi comme dans @Theo réponse sur rhel et j'essayais d'export LD_LIBRARY_PATH qui avait jeté quelques erreurs, avec LD_LIBRARY_PATH également inclure LD_PRELOAD comme
vous devez toujours le faire lors de l'exécution de python afin de faire un script qui se charge de ces variables et les appels de l'interpréteur python
J'ai eu "version" GLIBC_2.14" introuvable " lors de l'importation de tensorflow en python. Réussi à importer tensorflow dans python3.5 sur Centos6.6 à l'aide de virtualenv:
J'ai eu un problème similaire d'essayer d'installer
numba
sur un vieux HPC système Linux en cours d'exécutionSUSE Linux Enterprise Server 11, qui a glibc 2.11.3 (selon
ldd --version
). Je n'ai pas de super-utilisateur, l'accès, et toute régulier conda d'installation (que ce soit de la part des chaînesdefaults
,conda-forge
, ounumba
) échoue avecOSError: /lib64/libpthread.so.0: version
GLIBC_2.12not found (required by ...envs/test1-py37/lib/python3.7/site-packages/llvmlite/binding/libllvmlite.so
). J'ai réussi à installernumba
par les étapes suivantes:glibc
de lanlsec
environnementpip
pour installernumba
etllvmlite
construit contre la nouvellement installéglibc
:Ainsi:
Puis l'importation de numba œuvres. Cependant, on doit par la suite être prudent que toute
conda install
n'a pas de "mise à niveau"llvmlite
à une version non compatible avecnumba
, ou le vieux problème revient. Vous pouvez à la broche un ou l'autre ou les deux pour cet effet. Vous aurez à la broche de la construire ainsi que la version. J'ai créé un fichierpinned
contenant:et l'a placé dans mon conda de l'environnement dans un fichier texte
conda-meta/pinned
.J'ai eu le même problème et trouvé la solution suivante: