在jupyter笔记本中使用LD_PRELOAD

时间:2016-10-10 11:14:40

标签: python linux tensorflow jupyter jupyter-notebook

我想在我的系统中安装tensorflow库(Linux 2.6.32_1-18-0-0 x86_64 GNU / Linux),但是,由于我系统中的libc太旧,因此无法找到某些功能定义。错误消息显示如下:

$ python
>>> import tensorflow
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/root/.jumbo/lib/python2.7/site-packages/tensorflow/__init__.py", line 23, in <module>
    from tensorflow.python import *
  File "/root/.jumbo/lib/python2.7/site-packages/tensorflow/python/__init__.py", line 48, in <module>
    from tensorflow.python import pywrap_tensorflow
  File "/root/.jumbo/lib/python2.7/site-packages/tensorflow/python/pywrap_tensorflow.py", line 28, in <module>
    _pywrap_tensorflow = swig_import_helper()
  File "/root/.jumbo/lib/python2.7/site-packages/tensorflow/python/pywrap_tensorflow.py", line 24, in swig_import_helper
    _mod = imp.load_module('_pywrap_tensorflow', fp, pathname, description)
ImportError: /root/.jumbo/lib/python2.7/site-packages/tensorflow/python/_pywrap_tensorflow.so: symbol memcpy, version GLIBC_2.14 not defined in file libc.so.6 with link time reference

所以我自己实现了缺失的函数,并将其编译为,所以将它放在/home/tensorflow/mylibc/mylibc.so

下次启动python时,我会这样做

$ LD_PRELOAD=/home/tensorflow/mylibc/mylibc.so python
>>> import tensorflow
I tensorflow/stream_executor/dso_loader.cc:108] successfully opened CUDA library libcublas.so locally
I tensorflow/stream_executor/dso_loader.cc:108] successfully opened CUDA library libcudnn.so locally
I tensorflow/stream_executor/dso_loader.cc:108] successfully opened CUDA library libcufft.so locally
I tensorflow/stream_executor/dso_loader.cc:108] successfully opened CUDA library libcuda.so.1 locally
I tensorflow/stream_executor/dso_loader.cc:108] successfully opened CUDA library libcurand.so locally
>>> 

一切似乎都没问题,在我的更多测试中确实没问题。

然而,当运行jupyter(ipython notebook)时,在笔记本中,当我输入&#34; import tensorflow&#34;时,我再次遇到导入错误 我按如下方式运行jupyter:

LD_PRELOAD=/home/tensorflow/mylibc/mylibc.so  jupyter notebook --ip=0.0.0.0 --port=8888 > /dev/null 2>&1 &

,错误如下

ImportError: /root/.jumbo/opt/gcc46/lib64/libstdc++.so.6: version `GLIBCXX_3.4.19' not found (required by /root/.jumbo/lib/python2.7/site-packages/tensorflow/python/_pywrap_tensorflow.so)

然后,我决定将一个shell脚本写入&#34; wrapper&#34;蟒蛇。就像下面这样:

$ cd ~/.jumbo/bin # the python binary directory
$ ls -l | grep python
-rwxr-xr-x 1 root root      234 Oct 10 03:58 ipython
-rwxr-xr-x 1 root root      234 Oct 10 03:58 ipython2
-rwxr-xr-x 1 root root       87 Oct 10 05:40 python -> python2
lrwxrwxrwx 1 root root       14 Aug 15 02:42 python-config -> python2-config
lrwxrwxrwx 1 root root        9 Aug 15 02:42 python2 -> python2.7
lrwxrwxrwx 1 root root       16 Aug 15 02:42 python2-config -> python2.7-config
-rwxr-xr-x 1 root root     9864 Jul 26 03:17 python2.7
-rwxr-xr-x 1 root root     1626 Jul 26 03:17 python2.7-config
$ rm python
$ vim python # I typed the following text into file python, making python as a wrapper for python2.7, the actual executable file
#!/bin/sh
LD_PRELOAD=/home/tensorflow/mylibc/mylibc.so "/root/.jumbo/bin/python2.7" $@

$ chmod +x python

然后我再次运行jupyter,启动一个新的笔记本,尝试导入tensorflow。但是再次遇到相同的导入错误。

我列出了jupyter的过程,并在启动新笔记本时发现,jupyter实际上会产生一个单独的进程。执行新笔记本

是python2.7而不是python
root       792  0.1  0.0 685252 43856 ?        Ssl  06:31   0:00 /root/.jumbo/bin/python2.7 -m ipykernel -f /root/.local/share/jupyter/runtime/kernel-d8e49d7b-d36f-4806-8013-be5a7c3a2028.json
root      1020  0.5  0.0  13352  1348 ?        S    06:58   0:00 /bin/sh /root/.jumbo/bin/python /root/.jumbo/bin/jupyter-notebook --ip=0.0.0.0 --port=8888

所以,我的问题是,如何使LD_PRELOAD实际上在我的jupyter笔记本中工作?感谢您的任何建议。

0 个答案:

没有答案