PYTHON

▷Fehler beim Importieren von Tensorflow in Python 2.7 in Ubuntu 12.04. 'GLIBC

Lösung:

Ich habe es gerade geschafft, tensorflow 0.12rc0 auf CentOS 6.5 mit glibc 2.12 zu installieren, ohne Root-Rechte zu haben. Die einfache Installation der Tensorflow-Binärdatei über pip gab mir einen Fehler, der sich auch auf die GLIBC-Version bezieht.

Grundsätzlich haben Sie 4 Möglichkeiten, damit umzugehen (jeweils mit einigen Vor- und Nachteilen):

Option 1 – Aktualisieren Sie Ihr System GLIBC global.

Dies ist wahrscheinlich die beste Option, wenn Ihr System unterstützt dies, Sie haben Root-Rechte und Sie sind zuversichtlich, dass dieses Upgrade aus irgendeinem seltsamen Grund nichts kaputt macht. Letztendlich geht dies bis zum Upgrade der gesamten Linux-Distribution. Hier ist eine schöne kurze Liste von Standard-GLIBC-Versionen für beliebte Distributionen.

Option 2 – Fügen Sie Ihrem System einen zweiten GLIBC hinzu

Binärdatei kompilieren oder herunterladen. Die einfachste und unkomplizierteste Option. Vor allem, wenn Sie nur wenige einfache Skripte ausführen müssen.

Es ist möglich, mehrere Versionen von glibc auf demselben System zu haben, aber man sollte dies mit großer Sorgfalt tun.

Sie werden Ihr System nicht zerstören, wenn alle Ihre Änderungen auf eine virtuelle Umgebung beschränkt wären.

Viele Programme, die zuvor installiert/kompiliert wurden, basieren möglicherweise auf altem GLIBC und würden in Ihrer neuen Umgebung (zB Ihrer Python-IDE) einfach abstürzen. Einschließlich der meisten grundlegenden Bash-Befehle wie "lc", "cd" usw.

Andere Nebenwirkungen wie signifikante Speicherverluste sind ebenfalls möglich.

Daher ist es eine sehr schlechte Idee, Ihrer normalen Umgebung einen neuen GLIBC hinzuzufügen, z. B. über .bashrc .

. Wenn Sie andererseits in Ihrer neuen virtuellen Umgebung ein bestimmtes Tool benötigen, können Sie es neu kompilieren und mit dem neuen GLIBC verknüpfen. Damit es in Ihrer neuen Umgebung gut funktionieren würde.

Ich persönlich habe es jedoch schnell aufgegeben, alles was ich brauche in einer neuen Umgebung (ohne Root und Paketmanager) neu zu kompilieren.

Ein etwas anderer Ansatz wird offiziell von GLIBC-Entwicklern zum Testen neuer GLIBC-Builds angeboten.

Option 3 - Patch-Tensorflow

Dies mag für TF 0.6.0 funktionieren, aber Sie müssen wahrscheinlich bei jeder neuen tensorflow-Version von vorne beginnen. Hier ist zB ein Fix für 0.9.0.

Option 4 - Tensorflow aus der Quelle kompilieren

Wenn Sie es aus der Quelle neu kompilieren und mit Ihrem vorhandenen GLIBC verknüpfen, werden neuere GLIBC nicht mehr benötigt. Irgendwie wurde diese Option hier noch in keiner Antwort erwähnt. Imho, dies ist die beste Option, sowohl "im Allgemeinen" als auch "speziell für Tensorflow".

Dies funktioniert mit r0.11 in Ordnung und würde wahrscheinlich jahrelang funktionieren, aber theoretisch könnte es in einer neueren Tensorflow-Version kaputt gehen, wenn sie sich entscheiden würden, tatsächlich eine neue GLIBC-Funktionalität zu verwenden, die in älteren Versionen nicht vorhanden ist.

Um ehrlich zu sein, ist der Aufbau von Tensorflow aus dem Quellcode nicht einfach, insbesondere auf veralteten Systemen.

Eine kurze Zusammenfassung von "Building Tensorflow auf einem veralteten System":

Obwohl das offizielle Handbuch einen Abschnitt "Installation aus Quellen" enthält, müssen Sie einige Tricks ausführen, um es auf einem veralteten System zu erstellen. Hier gehe ich davon aus, dass Sie keine Root-Rechte haben (wenn Sie dies tun - könnten Sie wahrscheinlich die gleichen Vorabanforderungen mit einem Paketmanager installieren, anstatt sie manuell aus dem Quellcode zu erstellen).

Ich habe zwei gut dokumentierte Erfolgsgeschichten gefunden: #1, #2 und eine Reihe nützlicher Posts auf dem offiziellen Github (hauptsächlich über eine Reihe von Bibliotheken, die in der Binärdatei verlinkt werden können): #1, #2, #3, #4. Ich musste die dort beschriebenen Tricks kombinieren, um in meinem Fall TF erfolgreich zu kompilieren.

Überprüfen Sie zunächst Ihre gcc --version , und vergewissern Sie sich, dass es c++11 unterstützt. Meins war 4.4.7, also wird es nicht funktionieren. Ich habe den Quellcode von gcc-4.9.4 heruntergeladen und kompiliert. Dieser Schritt ist ziemlich einfach, aber die Kompilierung selbst kann einige Stunden dauern. Als Workaround für ein Problem in bazel habe ich gcc mit fest codierten Pfaden zu kompiliert as , ld und nm . Sie können jedoch andere Problemumgehungen versuchen: (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: 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 Überprüfe dein java --version . Bazel benötigt JDK 8, installieren Sie es bei Bedarf. (Sie bieten immer noch einige jdk7-bezogene Downloads für bazel-0.4.1 an, aber es sieht so aus, als ob sie es als veraltet betrachten) Ich habe eine separate erstellt use_gcc_4.9.4.sh Datei mit den erforderlichen Umgebungsvariablen. ich benutze source ./use_gcc_4.9.4.sh wenn ich so etwas zu diesem neueren Compiler brauche. #!/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 Die aktuelle Binärdatei von Bazel (0.4.1) erfordert GLIBC 2.14, daher müssen wir auch Bazel aus dem Quellcode kompilieren (mit unserem neuen gcc). Funktioniert OK, es sei denn, Sie dürfen nur eine sehr begrenzte Anzahl von Threads auf dem Zielcomputer ausführen. (Dieser Beitrag beschreibt einige zusätzliche Problemumgehungen, aber in meinem Fall wurden sie nicht benötigt, möglicherweise aufgrund der jüngsten Aktualisierungen im Bazel-Code.) Tensorflow-Quellcode abrufen git clone , und installieren Sie die erforderlichen Voraussetzungen (CUDA,cuDNN,python usw.). Siehe offizielle Anleitung. Wenn Sie kein Standard-System-gcc verwenden (z. B. wenn Sie neuere gcc kompilieren mussten, wie oben beschrieben), fügen Sie die folgenden Linker-Flags zu . hinzu , Zeile 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" Ohne diesen Schritt würden Sie wahrscheinlich auf Fehlermeldungen wie diese stoßen: # 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) Um GLIBC-Abhängigkeiten zu vermeiden, müssen wir schließlich einige Bibliotheken statisch verknüpfen, indem wir die -lrt Linker-Flag (vielleicht -lm sowie). Ich habe mehrere Beiträge gefunden, die vorschlagen, dies auf andere Weise hinzuzufügen: über die bazel-Befehlszeile (kann vernünftig klingen, funktioniert aber irgendwie nicht für mich auf der aktuellen Tensorflow-Version),

über "bazel-tensorflow/external/protobuf/BUILD" (nicht sicher, ob es funktioniert, aber das sieht nicht bequem aus - diese Datei wird nur während des Build-Versuchs selbst erstellt)

über (die gleiche Datei, die wir gerade im vorherigen Schritt bearbeitet haben, direkt unter den Zeilen, die wir bereits hinzugefügt haben). linker_flag: "-lrt" linker_flag: "-lm"

über "tensorflow/tensorflow.bzl" (funktioniert für mich, aber weniger praktisch, nur weil Sie eine weitere Datei bearbeiten müssen. Ich bin mir nicht sicher, ob dies zu 100% dem vorherigen Punkt entspricht) Ohne -lrt Ich bin erneut auf einen GLIBC-versionsspezifischen Fehler gestoßen und habe versucht, 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) Ohne -lm Sie können darauf stoßen (für mich stellte sich heraus, dass es nicht notwendig war). Führen Sie den Build-Prozess aus.

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

Versuchen Sie, das folgende einfache Python-Skript auszuführen, um zu testen, ob die grundlegendsten Dinge funktionieren: import tensorflow as tf hello = TensorFlow!') sess = tf.Session() a = b = + b))

Ich habe die BR_User-Lösung ausprobiert und hatte immer noch ein nerviges:

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

Ich verwende CentOS 6.7, es fehlt auch eine aktualisierte c++-Standardbibliothek. Um auf der BR_User-Lösung aufzubauen, habe ich das richtige libstdc++-Paket extrahiert, aber ich fand keine Notwendigkeit für die virtuelle Umgebung.

Angenommen, Sie haben tensorflow bereits installiert, erhalten Sie:

mkdir ~/my_libc_env cd ~/my_libc_env wget wget wget ar p libc6_2.17-0ubuntu5_amd64.deb | tar zx ar p libc6-dev_2.17-0ubuntu5_amd64.deb | tar zx rpm2cpio cpio -idmv

und dann python ausführen mit:

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`

Wenn es nicht funktioniert, habe ich eine andere Lösung, aber Sie wird es nicht mögen.

Ich hatte das gleiche Problem, also habe ich beim googeln diese Schritte gemacht:

$ sudo pip install --upgrade virtualenv $ virtualenv --system-site-packages ~/tensorflow $ cd ~/tensorflow $ source bin/activate $ pip install --upgrade $ cd /tmp $ wget $ wget $ mkdir libc6_2.17 $ cd libc6_2.17 $ ar p ../libc6_2.17-0ubuntu5_amd64.deb | tar zx $ ar p ../libc6-dev_2.17-0ubuntu5_amd64.deb | 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

Und zum Beenden:

$ deactivate

Das ist für mich in Ordnung.

Click to rate this post! [Total: 0 Average: 0 ]

Anderer Beitrag

Andreas Müller

LEAVE A REVIEW