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.
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.
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):
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.
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 .
.bashrc
.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.
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".
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.
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
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)
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
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.)
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 .
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)
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 "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).
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
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))
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.
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
:)
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
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
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.
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.
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:
J'ai eu le même problème et a trouvé la solution suivante :
conda install tensorflow
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: version
GLIBC_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:
glibc
à partir de l'environnement nlsec
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
.
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
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`
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.