J'essaie d'installer tensorflow sur un serveur Linux sur lequel je ne suis qu'un utilisateur sans la permission root. Et je ne peux pas transférer de fichiers de/vers lui car je le ssh via un serveur de saut. Le système est le suivant:
Linux THENAME_OF_SURVER 2.6.32-573.18.1.el6.x86_64 #1 SMP Tue Feb 9 22:46:17 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
J'ai installé le tensorflow via pip install tensorflow
et un programme tensorflow affiche les informations suivantes:
ImportError: /lib64/libc.so.6: version `GLIBC_2.16' not found
J'ai installé une nouvelle version de glibc
git clone git://sourceware.org/git/glibc.git cd glibc git checkout --track -b local_glibc-2.16 Origin/release/2.16/master mkdir build cd build ../configure --prefix=/home/MYNAME/dependency/glibc-2.16 make -j4 make install
Après avoir suivi les instructions en ligne, j'ai modifié les variables d'environnement en:
export LD_LIBRARY_PATH=/home/MYNAME/dependency/glibc-2.16/lib
MAIS cela me conduit à un problème: je ne peux utiliser aucune commande. Par exemple, j'ai appelé ls
et cela m'avertirait comme ceci:
ls: error while loading shared libraries: __vdso_time: invalid mode for dlopen(): Invalid argument
J'ai ensuite suivi une autre instruction pour exécuter la commande comme suit:
/home/MYNAME/dependency/glibc-2.16/lib/ld-linux-x86-64.so.2 --library-path /home/MYNAME/dependency/glibc-2.16/lib:$LD_LIBRARY_PATH:/path/to/gcc-5.2.0/lib64:/usr/lib64/:/usr/lib64/ ls
(je ne sais pas où trouver le dossier similaire à gcc-5.2.0
, mon which gcc
indique /usr/local/sbin/gcc
, mais il est lié à /usr/local/gcc-5.3.0/bin/gcc
, qui ne contient pas de sous-dossier lib64)
Mais alors il est venu avec l'avertissement suivant:
ls: error while loading shared libraries: ls: cannot open shared object file
Je sais que je peux à nouveau utiliser ls
en exportant la variable à vider. Mais je ne peux toujours pas utiliser la nouvelle version de glibc. Quelqu'un pourrait-il m'aider à lier correctement la nouvelle glibc? Toute suggestion serait appréciée!
EDIT: Donc, les progrès sont les suivants:
LD_LIBRARY_PATH=/home/MYNAME/dependency/glibc-2.16/lib python
donnerait python: error while loading shared libraries: __vdso_time: invalid mode for dlopen(): Invalid argument
/home/MYNAME/dependency/glibc-2.16/lib/ld-2.16.so python
donnerait python: error while loading shared libraries: __vdso_time: invalid mode for dlopen(): Invalid argument
EDIT2 & SOMMAIRE:
Pour que la réponse de Employed Russian soit plus détaillée, je voudrais coller ici mes solutions finales.
Mon objectif est d'utiliser tensorflow en Python sur un serveur pour lequel je ne dispose pas de l'autorisation root. J'ai été averti que ImportError: /lib64/libc.so.6: version 'GLIBC_2.16' not found
lors de l'importation tensorflow.
Sur la base de la réponse de Employed Russian, j'ai utilisé ce qui suit pour exécuter ma commande:
LD_LIBRARY_PATH=/home/USERNAME/dependency/glibc-2.17/lib/:/lib64/:/usr/local/gcc-5.3.0/lib64/ /home/USERNAME/dependency/glibc-2.17/lib/ld-2.17.so /home/USERNAME/anaconda2/bin/python
Divisez la commande en plusieurs parties (j'utiliserais ???
pour représenter les chemins d'accès différents pour différentes personnes):
LD_LIBRARY_PATH=
:
signifie divisé???/glibc-2.17/lib/
/lib64/
et /usr/local/gcc-5.3.0/lib64/
: J'ai trouvé ces dossiers par find / -name 'libgcc_s.so.1'
parce que j'étais/???/glibc-2.17/lib/ld-2.17.so
/???/python
le chemin de votre exécutable. Pour Python, import sys; print(sys.executable)
pour voir votre chemin Python.Autres choses:
os.system('ls')
ou os.system('python xxx.py')
. Mais cela m’avait averti que si je l’utilisais normalement, sh: error while loading shared libraries: __vdso_time: invalid mode for dlopen(): Invalid argument
et que je n’ai pas trouvé de solution satisfaisante.
export LD_LIBRARY_PATH=/home/MYNAME/dependency/glibc-2.16/lib
Cette réponse explique pourquoi LD_LIBRARY_PATH
ne fonctionne pas et ce que vous devriez faire à la place.
J'ai lu votre message et essayé ...
python: error while loading shared libraries: __vdso_time: invalid mode for dlopen(): Invalid argument
L'erreur signifie généralement que vous avez un incompatibilité entre ld-linux
et libc.so.6
. Ils doivent correspondent.
Si vous utilisez l'appel direct du chargeur via /home/MYNAME/.../ld-2.16.so
, vous devez également organiser le chargement de /home/MYNAME/.../libc.so.6
.
Vous pouvez le faire en passant --library-path ...
à ld-2.16.so
ou en définissant LD_LIBRARY_PATH
de manière appropriée.
Votre commande avec ld-2.16 --library-path ... ls
est presque correct. Ce qui vous manque, c'est que ld-2.16
va not rechercher votre PATH
. Vous devez lui donner full nom du chemin: ld-2.16 --library-path ... /bin/ls
.
Dans mon cas, c’était centos 6 avec python pour pytorch .
J'ai eu des erreurs comme, etc.:
libraries: __vdso_time: invalid mode for dlopen(): Invalid argument
ImportError: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by /home/evaldsu/.conda/envs/conda_env/lib/python3.6/site-
J'ai installé à côté de glibc-2.17 dans le répertoire local/opt/exp_soft/tools
puis j'ai installé dans l'outil de correction de conda env (je peux également l'installer avec d'autres outils):
conda install -c conda-forge patchelf
puis j'ai patché le binaire de python pour utiliser un chemin différent de la glibc (vous pouvez le faire avec n'importe quel binaire). Sachez que cela va vous changer le binaire Python.
patchelf --set-rpath /opt/exp_soft/tools/glibc-2.17/lib:$HOME/.conda/envs/conda_inf/lib:/usr/lib64:/lib64:/lib --set-interpreter /opt/exp_soft/tools/glibc-2.17/lib/ld-linux-x86-64.so.2 /home/evaldsu/.conda/envs/conda_inf/bin/python3.6
Une autre option consiste simplement à installer ce script si vous disposez d'un accès administrateur complet:
https://Gist.github.com/harv/f86690fcad94f655906ee9e37c85b174