Fehler beim importieren von Tensorflow in Python 2.7 in Ubuntu 12.04. 'GLIBC_2.17 nicht gefunden"
Habe ich installiert die Tensorflow Bindungen, die mit python erfolgreich. Aber wenn ich versuche zu importieren Tensorflow, bekomme ich die folgende Fehlermeldung.
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)
Ich habe versucht, zu aktualisieren, GLIBC_2.15 2.17, aber kein Glück.
InformationsquelleAutor Tanvir | 2015-11-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich hatte das gleiche problem, also googeln habe ich diese Schritte:
Und zu beenden:
Das funktioniert für mich.
aber die Pfad-Zuweisung beschwert sich trotzdem: bin/python: error while loading shared libraries: libpython2.7.so.1.0: nicht öffnen können shared object-Datei: Keine solche Datei oder Verzeichnis
Fast Tat es! Jetzt heißt es: ImportError: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.19' not found (required by /home/yasen/tensorflow/local/lib/python2.7/site-packages/tensorflow/python/_pywrap_tensorflow.so)
diese Lösung wäre wahrscheinlich OK, arbeiten für das ausführen von einfachen scripts (hinzufügen von neuen GLIBC LD_LIBRARY_PATH und sofort starten bestimmten python-Skript). Die console session gebrochen nach, - nur töten Sie danach. Die wichtig ist, niemals hinzufügen dieser Bibliotheken zu LD_LIBRARY_PATH permanent (und keine "speziellen Ordner" - nur halten Sie in
/tmp
wie hier vorgeschlagen), und dein system wäre OK.Nach Abschluss dieser es sagt ImportError: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.14' nicht gefunden
InformationsquelleAutor Fabiano
Ich habe es gerade geschafft zu installieren tensorflow 0.12rc0 auf CentOS 6.5 mit glibc 2.12, ohne root-Rechte. Einfach installieren tensorflow binäre via pip war mir ein Fehler, im Zusammenhang mit der GLIBC-version als auch.
Grundsätzlich haben Sie 4 Möglichkeiten, wie man mit diesem (jeweils mit einigen vor-und Nachteile):
Option 1 - Upgrade Ihr system GLIBC weltweit.
Dies ist, wahrscheinlich, die beste option, wenn Ihr system dies unterstützt, haben Sie root-Privilegien, und Sie sind zuversichtlich, dass dieses upgrade nicht etwas zu brechen, aus irgendeinem seltsamen Grund. Letztlich, dies geht bis zur Modernisierung der gesamten Linux-distribution. Hier's eine schöne kurze Liste der Standard-GLIBC-Versionen auf populäre Distributionen.
Option 2 - Add zweite GLIBC auf Ihrem system
Kompilieren oder download binary. Die meisten einfachen&einfache option. Vor allem, wenn Sie brauchen nur zu führen Sie einige einfache Skripte.
.bashrc
.Option 3 - Patch tensorflow
Diese für TF-0.6.0, aber Sie würden wahrscheinlich haben, um wieder von vorne anzufangen, wenn jede neue tensorflow version veröffentlicht wird. E. g. hier's ein Update für 0.9.0.
Option 4 - Kompilieren tensorflow von der Quelle
Wenn Sie re-kompilieren aus dem Quellcode und link mit Ihrem vorhandenen GLIBC, neuere GLIBC wäre nicht mehr nötig. Irgendwie, wird diese option nicht erwähnt wurde in jeder Antwort hier noch. Imho, ist dies die beste option, die beide " im Allgemeinen " und "speziell für tensorflow".
Eine kurze Zusammenfassung der "Gebäude-tensorflow auf veraltete system":
Obwohl der offizielle Leitfaden bietet eine "die Installation aus Quellen" Abschnitt, es gibt paar tricks, die Sie tun müssen, um es zu bauen auf einem veralteten system. Hier gehe ich davon aus, dass Sie nicht über root-Privilegien (wenn Sie es tun - Sie würden wahrscheinlich in der Lage sein zu installieren die gleichen vor-requestities mit einem Paket-manager, sondern Sie manuell erstellen Sie von der Quelle).
Fand ich zwei gut dokumentierte Erfolgsgeschichten: #1, #2 und eine Reihe von nützlichen Beiträgen im offiziellen github (meist über eine Reihe von Bibliotheken link in der binären): #1, #2, #3, #4. Ich hatte zu kombinieren tricks beschrieben, die es erfolgreich zu kompilieren TF in meinem Fall.
Zuerst von allen, überprüfen Sie Ihre
gcc --version
, und überprüfen, dass es unterstützt c++11. Mir war 4.4.7, so wird es nicht funktionieren. Ich habe heruntergeladen gcc-4.9.4-source-code, und es kompiliert. Dieser Schritt ist ziemlich einfach, aber die Zusammenstellung selbst nehmen kann einige Stunden. Als ein workaround für ein Problem in bazel, das ich zusammengestellt habe gcc mit hardcoded Pfade zuas
,ld
undnm
. Jedoch können Sie versuchen, eine andere workarounds: (Eins, Zwei).Überprüfen Sie Ihre
java --version
. Bazel erfordert JDK 8 installieren Sie es, falls erforderlich. (Sie immer noch bieten einige jdk7 Verwandte downloads zum bazel-0.4.1, aber es sieht aus wie Sie halten es für veraltet)Habe ich einen separaten
use_gcc_4.9.4.sh
- Datei mit den erforderlichen Umgebungsvariablen. Ich benutzesource ./use_gcc_4.9.4.sh
wenn ich so etwas im Zusammenhang mit diesem neuen compiler.Den aktuellen bazel binäre (0.4.1) benötigt GLIBC-2.14, so müssen wir kompilieren bazel von der Quelle als auch (mit unserem neuen gcc). Funktioniert OK, es sei denn, Sie sind nur die Ausführung erlaubt eine sehr begrenzte Anzahl von threads auf der Ziel-Maschine. (Diese post beschreibt einige zusätzliche workarounds, aber in meinem Fall wurden Sie nicht benötigt, vielleicht wegen der letzten updates in bazel-code.)
Erhalten tensorflow Quellcode
git clone https://github.com/tensorflow/tensorflow
, und installieren Voraussetzungen Sie brauchen (CUDA,cuDNN,python, etc). Sehen official guide.Wenn Sie nicht mit dem Standard-gcc (z.B. wenn Sie hatte zu kompilieren neuere gcc, wie oben beschrieben), fügen Sie die folgenden linker-flags zu
tensorflow/third_party/gpus/crosstool/CROSSTOOL.tpl
, Zeile 59:Ohne diesen Schritt, werden Sie wahrscheinlich laufen in Fehlermeldungen wie diese:
Schließlich, um zu vermeiden, GLIBC Abhängigkeiten, wir haben zu statisch link einige Bibliotheken, indem die
-lrt
linker-flag ( vielleicht-lm
). Fand ich mehrere Beiträge, was darauf hindeutet, fügen Sie diese in einer anderen Art und Weise:über "third_party/gpus/crosstool/CROSSTOOL.tpl" (die gleiche Datei haben wir gerade im vorigen Schritt bearbeitete, knapp unterhalb der Linien haben wir bereits Hinzugefügt).
über "tensorflow/tensorflow.bzl" (funktioniert für mich, aber weniger bequem, weil du einfach zu Bearbeiten eine weitere Datei. Ich bin nicht sicher, es ist 100% gleichwertig mit dem vorherigen Punkt)
Ohne
-lrt
ich lief in GLIBC-version-spezifische Fehler wieder versuchen zuimport tensorflow
:Ohne
-lm
können Sie diese (für mich, es war nicht notwendig).Führen Sie den build-Prozess.
Versuchen, führen Sie die folgenden einfachen python-Skript zu testen, ob die grundsätzlichen Dinge, die funktionieren kann:
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
wenn ich bei der Konfiguration gccdas ist wahrscheinlich etwas, das OS-abhängig. Sind Sie sicher, dass Ihr "als" richtig funktioniert? Vielleicht sollten Sie beginnen, von der Eingabe von "denen da" und versuchen, es auszuführen. Wie auch immer, dieses Problem ist im Zusammenhang mit Gebäude-gcc als Gebäude tensorflow, so ist es kaum zu diesem Thema.
Ja, meine
/usr/bin/as
gut funktioniert .Ich Baue von
bazel build --config=opt //tensorflow/tools/pip_package:build_pip_package
wie hier[tensorflow.org/install/install_sources] empfehlen, ohne gup. Und ich fügte hinzulinker_flag: "-L/home/username/localinst/opt/gcc-4.9.4/lib64" linker_flag: "-Wl,-rpath,/home/username/localinst/opt/gcc-4.9.4/lib64"
zutensorflow/third_party/gpus/crosstool/CROSSTOOL.tpl
, immer noch Fehler...'GLIBCXX_3.4.20' not found..., ...'CXXABI_1.3.8' not found..., ...'GLIBCXX_3.4.18' not found...
Für die zweite option, sollte installation von glibc mit conda arbeiten? Ich versucht, aber es hat nicht machen es Arbeit (
glibc
ausnlesc
odermgckind
hält das gleiche Verhalten,glibc
ausasmeurer
gibtpython: error while loading shared libraries: __vdso_time: invalid mode for dlopen(): Invalid argument
)InformationsquelleAutor Igor
Versuchte ich BR_User Lösung und hatte noch eine lästige:
Bin ich auf CentOS 6.7, es fehlt auch eine aktualisierte c++ standard lib, also auf zu bauen BR_User Lösung, die ich extrahiert die richtige libstdc++ - Paket, jedoch fand ich keine Notwendigkeit für die virtuelle Umgebung.
Angenommen, dass Sie bereits installiert haben tensorflow, es gibt:
und dann führen Sie python mit:
Wenn es nicht funktioniert, ich habe eine andere Lösung, aber es wird dir nicht gefallen.
$LD_LIBRARY_PATH:
am Anfang.Ja das ist normal, Sie können machen Sie sich ein
alias
in Ihrem.bashrc
wenn Sie nicht wollen, zu geben alles everytimeFunktioniert unter RHEL 6.5. Wow. PFM.
Nach dem ausführen
import tensorflow
bin mit dem folgenden Fehler:error while loading shared libraries: __vdso_time: invalid mode for dlopen(): Invalid argument
Issue #2105Das nun folgende (Mar-2017) nicht: wget rpmfind.net/linux/sourceforge/m/ma/magicspecs/apt/3.0/x86_64/... Stattdessen können Sie versuchen: wget 195.220.108.108/linux/mageia/distrib/4/x86_64/media/core/... und rpm2cpio libstdc++6-4.8.2-3.2.mga4.x86_64.rpm | cpio -idmv Für zukünftige Referenz (wenn es wieder mal Pause), diese alternative Links gefunden unter: rpmfind.net/linux/rpm2html/...
InformationsquelleAutor Théo T
Okay also hier ist die andere Lösung, die ich wissen in meinem Vorherige Antwort, es ist mehr tricky, aber sollte immer funktionieren auf Systemen mit GLIBC - >=2.12 und GLIBCXX>=3.4.13.
In meinem Fall war es auf einem CentOS-6.7, aber es ist auch gut für Ubuntu 12.04.
Wir gehen zu müssen, um eine version von gcc unterstützt c++11, die entweder auf einem anderen Rechner oder auf eine isolierte installieren; aber nicht für den moment.
Was wir gonna do ist hier Bearbeiten Sie die _pywrap_tensorflow.also binäre, damit 'weakify' seine glibc und libstdc++ Abhängigkeiten, so dass die ld akzeptiert die Verknüpfung der stubs, wir sind gonna machen. Dann werden wir diese stubs für die Symbole fehlen, und endlich sind wir gonna pre-load-all dies beim ausführen von python.
Erste von allen, ich danke James für seine große Artikel ( http://www.lightofdawn.org/wiki/wiki.cgi/NewAppsOnOldGlibc ) und die wertvollen Ratschläge, ich konnte es nicht geschafft ohne ihn.
Also lassen Sie uns beginnen, indem weakifying die Abhängigkeiten, es geht nur um das einbauen der richtigen bytes in _pywrap_tensorflow.so. Bitte beachten Sie, dass dieser Schritt funktioniert nur für die aktuelle version von tensorflow (0.6.0). Also, wenn Ihr nicht bereits geschehen, erstellen und aktivieren Sie Ihre virtualenv, wenn Sie eine haben (wenn Sie nicht admin virtualenv ist eine Lösung, eine andere ist das hinzufügen
--user
Flagge, um die pip-Befehl), und installieren Sie tensorflow 0.6.0 (ersetzen Sie die cpu durch die gpu in der url, wenn Sie möchten, dass die gpu-version) :Lassen und ist weakify alle die lästigen Abhängigkeiten, hier ist der Befehl für die cpu-version des tensorflow:
Und hier ist die gpu (nur die richtige oder werden Sie beschädigt die binäre):
Können Sie es mit:
Haben Sie einen Blick auf die Artikel, wenn Sie möchten, um zu verstehen, was hier Los ist.
Nun, wir sind gonna machen die stubs für die fehlenden libc-Symbole:
Du müssen zu führen, Schritt auf die Maschine mit den fehlenden Abhängigkeiten (oder Maschine mit ähnlichen Versionen von standard-Bibliotheken (in einem cluster zum Beispiel)).
Jetzt sind wir gonna wahrscheinlich änderung der Maschine, da brauchen wir einen gcc unterstützt c++11, und es ist wahrscheinlich nicht an der Maschine, das nicht alle Abhängigkeiten (oder verwenden Sie eine isolierte installieren Sie eine aktuelle gcc). In der folgenden ich nehme an, wir sind immer noch in
~/my_stubs
und irgendwie Sie teilen sich Ihre Heimat durch die Maschinen, sonst wirst du nur noch zu kopieren .also Dateien, die wir gonna erzeugen, wenn es fertig ist.So, eine stub, die wir tun können, für die libstdc++, und für die restlichen fehlenden, wir gehen zur Kompilierung von gcc-source (es könnte einige Zeit dauern, zu Klonen Sie das repository):
Und das ist es! Sie können nun eine tensorflow python-Skript durch vorspannen alle unsere gemeinsamen Bibliotheken (und Ihre lokalen libstdc++):
🙂
Sicher!!! Möchte zu beachten, dass die Adressen geändert werden müssen für die GPU-version. Ich verwendet readelf zu erhalten, die folgende Liste (die vermutlich alle von denen sind nicht notwendig; ich fügte Chargen gleichzeitig): 0xDC5EA4 0xDC5EC4 0xDC5F04 0xDC5F54 0xDC5F64 0xDC5F74 0xDC5F84 0xDC5FA4 0xDC5FC4. Noch ein Hinweis: es funktioniert immer noch nicht für mich, aber ich denke, dies ist aufgrund eines Cuda-Treiber-Problem (TF hängt beim instanziieren einer Sitzung). Werde zu aktualisieren, wenn ich dies bestätigen.
Oh das ist komisch, ich habe es getestet für die gpu-version und es hat funktioniert, ich werde überprüfen, verwenden Sie 0.6.0 version? Obwohl ich nicht weiß, über die hängenden Problem, halten Sie mich auf dem Laufenden 🙂
Ja, 0.6.0. Ich habe einen Verdacht über Ihr hängen. Genau das gleiche problem auf einem anderen Feld (Prozess hängt; auch root kann nicht kill -9). Das problem auf diesem Feld war die speziellen Cuda-Treiber neben Cuda 7.0. Wir hatten ein Rollback auf eine ältere version. Wenn ich die admins dieses Servers, dies zu versuchen, ich werde aktualisieren.
Ein weiterer kleiner Hinweis: virtualenv ist nicht erforderlich, wenn Sie nicht admin. Sie brauchen nur anfügen
--user
zu denpip install
.InformationsquelleAutor Théo T
Hinweis auf 'weakifying Lösung Theo Trouillon. Es gilt nur für Tensorflow 0.6.0. Wenn Sie wollen, um es anzuwenden, für Tensorflow 0.9.0, es wird schwieriger.
Mein Fall war die CPU-Modus, Centos 6.7 wo GLIBC 2.12 GLIBCXX 3.4.13 bei Fahrzeugen erforderliche
Installieren tensorflow :
'weakifying' code sollte GEÄNDERT werden :
Und folgenden code HINZUGEFÜGT werden sollte, um den stub-code-Generierung bei der neueren Maschine.
Natürlich die endgültige running code sollte geändert werden, um zusätzliche stubs.
InformationsquelleAutor Tay Cho
Dass Fehler vor allem entsteht, wenn Ihr GNU C-Bibliothek ist nicht up-to-date.
Sie können überprüfen, welche version Sie ausführen, mit einem einfachen
Die Ausgabe sollte wie folgt sein:
Die 2.19 ist Ihre GLIBC-version. Upgrade Sie können besuchen Sie die GNU-C-Bibliothek-Projekt-website und laden Sie die neueste version.
Der link zu den neuesten glibc ist hier : GNU-C-Bibliothek Herunterladen
Zum Zeitpunkt des Schreibens dieser Antwort die die Letzte stabile version war 2.22.
Ich habe versucht mit tensorflow auf beiden Ubuntu 12.04 und 14.04. Ubuntu 14.04 nicht werfen nicht das Problem, wie es kommt mit glibc 2.19 standardmäßig installiert.
Hoffe, es hilft.
export LD_LIBRARY_PATH=""
oder/lib64/ld-linux-x86-64.so.2 --library-path /lib64 /bin/ls
vorübergehend behoben mein problem, und ich gelöscht neu geändert.so
Dateien unter/usr/local/lib/
und alles scheint in Ordnung zu sein jetzt(auch für die Erstellung neuer Programme). Bitte siehe sourceware.org/glibc/wiki/Testing/BuildsInformationsquelleAutor shanky_thebearer
Meine Lösung ist ähnlich der von Theo T; zwar fein abgestimmt, für Xubuntu 12.04 (CAELinux 2013)
Den folgenden zwei Schritte ausführen convolution.py Skript befindet sich in der tensorflow/models/image/mnist-Verzeichnis:
Wenn Sie möchten, dass python immer geladen mit diesen reduzierten Abhängigkeiten, einfach hinzufügen .bashrc-Datei mit den unten Schritt:
Und wenn Sie haben ipython:
Grundsätzlich habe ich aktualisiert es die python-installation in dist_packages anstelle von site-packages. Auch habe ich einen Klon von der gcc-Spiegel statt der nativen git-Seite für gcc. Rest ist alles der gleiche.
Die letzten Schritte stellen sicher, dass jedes mal, wenn Sie ausführen, python oder ipython, es würde geladen werden mit der reduzierten Abhängigkeiten.
Aber ich bekomme immer noch die Fehlermeldung :ImportError: ~/tensorflow/local/lib/python2.7/site-packages/tensorflow/python/_pywrap_tensorflow.also: symbol clock_gettime, version GLIBC_2.17 nicht definiert in file libc.so.6 with link time reference
Gelöst wird es durch Wiederholung LD_PRELOAD="$MYSTUBS/mylibc.so:$MYSTUBS/random.so:$MYSTUBS/hash_bytes.so:$MYSTUBS/chrono.so:$MYSTUBS/hashtable.so:$MYSTUBS/bad_function.so:$LIBSTDCPP" python
Wie kann ich LD_PRELOAD="..." python wiederholt werden, immer? Sorry, aber ich bin einfach shell-Neuling.
Ja, Sie haben zum hinzufügen von LD_PRELOAD... zuerst jedes mal, wenn Sie ausführen, python. Keine Sorge, Sie können machen Sie sich ein alias und legen Sie es in Ihrem
~/.bashrc
zu vermeiden, schreiben Sie es jedes mal: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'
. Sie können nennen Sie es anders, wenn Sie wollen, zu haltenpython
Befehl nicht Vorladen alles. Vergessen Sie nicht, fügen SieMYSTUBS=~/.my_stubs
undLIBSTDCPP=`ldconfig -p | grep libstdc++.so.6 | grep 64 | cut -d' ' -f4`
erste in Ihrer~/.bashrc
auch 😉InformationsquelleAutor Sam
Den link in @Théo T s Antwort ist nicht mehr arbeiten, also musste ich versuchen, mehrere alternativen, um endlich eine, die funktioniert finden.
Ausführen von python-code mit tensorflow
InformationsquelleAutor Honglei Liu