在 Ubuntu 12.04 中导入 Python 2.7 中的 Tensorflow 时出错。“未找到 GLIBC_2.17”

2025-03-04 08:25:00
admin
原创
111
摘要:问题描述:我已经成功安装了带有 Python 的 Tensorflow 绑定。但是当我尝试导入 Tensorflow 时,出现了以下错误。ImportError: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.17' not found (required...

问题描述:

我已经成功安装了带有 Python 的 Tensorflow 绑定。但是当我尝试导入 Tensorflow 时,出现了以下错误。

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)

我曾尝试将 GLIBC_2.15 更新至 2.17,但没有成功。


解决方案 1:

我刚刚设法在 CentOS 6.5 上安装了 tensorflow 0.12rc0,使用的是 glibc 2.12,无需 root 权限。简单地通过 pip 安装 tensorflow 二进制文件时出现了错误,也与 GLIBC 版本有关。

基本上,您有 4 种选择来解决这个问题(每种都有优点和缺点):

选项 1-全局升级系统 GLIBC。

如果您的系统支持此功能,并且您拥有 root 权限,并且您确信此升级不会因某些奇怪的原因而破坏任何东西,那么这可能是最好的选择。最终,这将升级整个 Linux 发行版。以下是流行发行版上默认 GLIBC 版本的简短列表。

选项 2 - 向系统添加第二个 GLIBC

编译或下载二进制文件。最简单直接的选项。特别是当您只需要运行几个简单的脚本时。

  • 同一个系统上可以有多个版本的 glibc,但是应该非常小心地这样做。

  • 如果所有更改都仅限于虚拟环境,那么您就不会破坏您的系统。

  • 许多之前安装/编译的程序可能依赖于旧的 GLIBC,它们会在新环境中崩溃(例如您的 Python IDE)。包括大多数基本的 bash 命令,如“lc”、“cd”等。

  • 也可能出现其他副作用,例如严重的内存泄漏。

  • 因此,向您的正常环境添加新的 GLIBC(例如通过)是一个非常糟糕的主意.bashrc

  • 另一方面,如果你在新的虚拟环境中需要某些特定工具,你可以重新编译它,并链接到新的 GLIBC。这样它就可以在新环境中正常工作。

  • 但是,就我个人而言,我很快就放弃了在新的环境中(没有 root 和包管理器)重新编译我需要的所有内容。

  • GLIBC 开发人员正式提供了一种略有不同的方法来测试新的 GLIBC 构建。

选项 3 - 修补 TensorFlow

这可能适用于 TF 0.6.0,但当每个新的 tensorflow 版本发布时,您可能必须从头开始。例如,这是针对 0.9.0 的修复。

选项 4 - 从源代码编译 TensorFlow

如果您从源代码重新编译它并链接到您现有的 GLIBC,则不再需要较新的 GLIBC。不知何故,这里的任何答案中都没有提到此选项。恕我直言,这是最好的选择,无论是“一般而言”,还是“专门针对 tensorflow”。

  • 这在 r0.11 上运行良好,并且可能会运行数年,但理论上,如果他们决定实际使用旧版本中不存在的一些新 GLIBC 功能,它可能会在某些较新的 tensorflow 版本中失效。

  • 老实说,从源代码构建 TensorFlow 并不简单,特别是在过时的系统上。

关于“在过时的系统上构建 TensorFlow”的快速摘要:

尽管官方指南提供了“从源代码安装”部分,但您需要使用一些技巧才能在过时的系统上构建它。在这里,我假设您没有 root 权限(如果有 - 您可能能够使用包管理器安装相同的预请求,而不是手动从源代码构建它们)。

我找到了两个有据可查的成功案例:#1、#2以及官方 github 上的一些有用的帖子(主要是关于二进制文件中链接的一组库):#1、#2、#3、#4。我必须结合那里描述的技巧才能成功编译 TF。

  1. 首先,检查你的gcc --version,并验证它是否支持 c++11。我的是 4.4.7,所以它不起作用。我已经下载了gcc-4.9.4 源代码,并对其进行了编译。此步骤非常简单,但编译本身可能需要几个小时。作为 bazel 中问题的解决方法,我使用硬编码路径编译了 gcc,并指向asldnm。但是,您可以尝试其他解决方法:(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 \n             --disable-multilib \n             --disable-nls \n             --enable-languages=c,c++ \n             --with-ld=/usr/bin/ld \n             --with-nm=/usr/bin/nm \n             --with-as=/usr/bin/as

make        
make install
  1. 检查你的java --version。Bazel 需要 JDK 8,如有必要请安装。(他们仍然提供一些与 jdk7 相关的下载,适用于 bazel-0.4.1,但看起来他们认为它已被弃用)

  2. 我创建了一个单独的use_gcc_4.9.4.sh文件,其中包含必要的环境变量。source ./use_gcc_4.9.4.sh当我需要与这个较新的编译器相关的内容时,我会使用它。

#!/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
  1. 当前的 bazel 二进制文件 (0.4.1)需要 GLIBC 2.14,因此我们还必须从源代码编译 bazel(使用我们的新 gcc)。工作正常,除非您只允许在目标机器上运行非常有限数量的线程。(这篇文章描述了一些额外的解决方法,但就我而言,它们并不需要,可能是因为 bazel 代码最近更新了。)

  2. 获取 tensorflow 源代码git clone https://github.com/tensorflow/tensorflow,并安装所需的先决条件(CUDA、cuDNN、python 等)。请参阅官方指南。

  3. 如果您没有使用默认系统 gcc(例如如果您必须编译较新的 gcc,如上所述),请将以下链接器标志添加到第 59 行tensorflow/third_party/gpus/crosstool/CROSSTOOL.tpl

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"

如果没有这个步骤,您可能会遇到如下错误消息:

# 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)
  1. 最后,为了避免 GLIBC 依赖,我们必须通过添加-lrt链接器标志(也许 -lm也可以)来静态链接一些库。我发现了多篇帖子,建议以不同的方式添加它:

* 通过bazel 命令行(听起来可能很合理,但不知何故在当前的 tensorflow 版本上不起作用),
* 通过“bazel-tensorflow/external/protobuf/BUILD”(不确定它是否有效,但这看起来不方便 - 此文件仅在构建尝试期间创建)
* 通过“third_party/gpus/crosstool/CROSSTOOL.tpl”(与我们在上一步中编辑的文件相同,就在我们已经添加的行下方)。


linker_flag: "-lrt"
linker_flag: "-lm"
* 通过“tensorflow/tensorflow.bzl”(对我有用,但不太方便,因为你必须编辑一个文件。我不确定它是否 100% 等同于上一点)我再次`-lrt`遇到了特定于 GLIBC 版本的错误,尝试`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)

如果没有的话,-lm你可能会遇到这种情况(对我来说,这没有必要)。

  1. 运行构建过程。

    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
  1. 尝试运行以下简单的 Python 脚本来测试最基本的内容是否正常运行:

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))

解决方案 2:

我尝试了BR_User 解决方案,但仍然有一个烦人的问题:

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

我在 CentOS 6.7 上,它也缺少更新的 c++ 标准库,因此为了在 BR_User 解决方案上构建,我提取了正确的 libstdc++ 包,但是我发现不需要虚拟环境。

假设你已经安装了 tensorflow,它会给出:

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

然后使用以下命令运行 python:

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`

如果这不起作用,我还有其他解决方案,但你不会喜欢它。

解决方案 3:

我遇到了同样的问题,因此通过谷歌搜索我采取了以下步骤:

$ 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

退出:

$ deactivate 

这对我有用。

解决方案 4:

好的,这是我在上一个回答中提到的另一个解决方案,它更棘手,但应该始终适用于 GLIBC>=2.12 和 GLIBCXX>=3.4.13 的系统。在我的情况下,它是在 CentOS 6.7 上,但它也适用于 Ubuntu 12.04。

我们需要一个支持 c++11 的 gcc 版本,可以在另一台机器上安装,也可以单独安装;但目前还不行。

我们在这里要做的是编辑 _pywrap_tensorflow.so 二进制文件,以“弱化”其 libc 和 libstdc++ 依赖项,以便 ld 接受链接我们要创建的存根。然后,我们将为缺失的符号创建这些存根,最后,我们将在运行 python 时预加载所有这些。

首先,我要感谢 James 的精彩文章(http://www.lightofdawn.org/wiki/wiki.cgi/NewAppsOnOldGlibc)和宝贵建议,没有他我不可能做到这一点。

因此,让我们从弱化依赖关系开始,这只需要替换 _pywrap_tensorflow.so 中的正确字节。请注意,此步骤仅适用于当前版本的 tensorflow (0.6.0)。因此,如果尚未完成,请创建并激活虚拟环境(如果您有的话)(如果您不是管理员,虚拟环境是一种解决方案,另一种方法是--user向 pip 命令添加标志),然后安装 tensorflow 0.6.0(如果您想要 gpu 版本,请在 url 中将 cpu 替换为 gpu):

pip install --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.6.0-cp27-none-linux_x86_64.whl

让我们弱化所有烦人的依赖关系,这是针对 tensorflow 的 cpu 版本的命令:

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

这是 gpu 版本(仅运行正确的版本,否则您将损坏二进制文件):

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

您可以使用以下方法进行检查:

readelf -V ${TENSORFLOW_DIR}/python/_pywrap_tensorflow.so

如果您想了解这里发生的事情,请看一下这篇文章。

现在我们要为缺失的 libc 符号制作存根:

mkdir ~/my_stubs
cd ~/my_stubs
MYSTUBS=~/my_stubs
printf "#include <time.h>
#include <string.h>
void* memcpy(void *dest, const void *src, size_t n) {
return memmove(dest, src, n);
}
int clock_gettime(clockid_t clk_id, struct timespec *tp) {
return clock_gettime(clk_id, tp);
}" > mylibc.c
gcc -s -shared -o mylibc.so -fPIC -fno-builtin mylibc.c

需要在缺少依赖项的机器(或具有类似版本标准库的机器(例如在集群中))上执行该步骤。

现在我们可能会更换机器,因为我们需要支持 c++11 的 gcc,而它可能不在缺少所有依赖项的机器上(或者您可以使用最新 gcc 的独立安装)。接下来我假设我们仍在,~/my_stubs并且您以某种方式在机器之间共享您的主目录,否则您只需复制完成后我们将要生成的 .so 文件。

因此,我们可以为 libstdc++ 做一个存根,对于剩余的缺失部分,我们将从 gcc 源代码进行编译(克隆存储库可能需要一些时间):

printf "#include <functional>
void std::__throw_bad_function_call(void) {
exit(1);
}" > 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

就这样!现在,您可以通过预加载所有共享库(以及本地 libstdc++)来运行 tensorflow python 脚本:

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

:)

解决方案 5:

注意 Theo Trouillon 的“弱化”解决方案。它仅适用于 Tensorflow 0.6.0。如果您想将其应用于 Tensorflow 0.9.0,那就更棘手了。我的情况是 CPU 模式,Centos 6.7,其中 GLIBC 2.12 GLIBCXX 3.4.13。

安装 tensorflow:

pip uninstall protobuf 
pip install --upgrade https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-0.9.0-cp27-none-linux_x86_64.whl

应更改“弱化”代码:

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

并且应将以下代码添加到较新的机器上的存根生成代码中。

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

当然,最终运行的代码应该进行修改以包含额外的存根。

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

解决方案 6:

如果您的 GNU C 库不是最新的,则主要会出现此错误。您可以使用简单的

$ ldd --version

输出应该是这样的:

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.

2.19 是您的 GLIBC 版本。要升级,您可以访问 GNU-C 库项目网站并下载最新版本。最新 glibc 的链接在这里:GNU-C 库下载
在撰写此答案时,最新稳定版本是 2.22

我尝试在 Ubuntu 12.04 和 14.04 上运行 tensorflow。Ubuntu 14.04 不会出现此问题,因为它默认安装了 glibc 2.19。

希望有帮助。

解决方案 7:

我的解决方案与 Theo T 的解决方案类似;尽管针对 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>
#include <string.h>
void* memcpy(void *dest, const void *src, size_t n) {
return memmove(dest, src, n);
}
int clock_gettime(clockid_t clk_id, struct timespec *tp) {
return clock_gettime(clk_id, tp);
}" > mylibc.c
gcc -s -shared -o mylibc.so -fPIC -fno-builtin mylibc.c

printf "#include <functional>
void std::__throw_bad_function_call(void) {
exit(1);
}" > 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

以下两个步骤将运行位于 tensorflow/models/image/mnist 目录中的 convolution.py 脚本:

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

如果您希望 python 始终加载这些减少的依赖项,只需按照以下步骤将其添加到 .bashrc 文件中:

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

如果你有 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

基本上,我将其更新为在 dist_packages 而不是 site-packages 中完成的 python 安装。此外,我从gcc-mirror而不是 gcc 的本机 git 页面进行克隆。其余的都一样。

最后几个步骤确保每次运行 python 或 ipython 时,它都会加载减少的依赖项。

解决方案 8:

@Théo T 的答案中的链接不再有效,所以我不得不尝试几种替代方法才最终找到一种有效的方法。

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

使用 tensorflow 运行 python 代码

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

解决方案 9:

我试过https://stackoverflow.com/a/34897674/5929065解决方案,效果很好。但是 libstdc++-4.8.2-7 下载链接无法访问,请尝试从此页面获取新链接:http://rpm.pbone.net/index.php3/stat/4/idpl/31981489/dir/centos_7/com/libstdc++-4.8.5-4.el7.x86_64.rpm.html

对我来说,我用的是这个:

wget ftp://mirror.switch.ch/pool/4/mirror/centos/7.2.1511/os/x86_64/Packages/libstdc++-4.8.5-4.el7.x86_64.rpm

解决方案 10:

注意:你需要根据你的平台下载 deb 包:

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

在我的 12.04 Ubuntu x64 上测试。

解决方案 11:

上面的答案很好,但即使这样做了,我仍然遇到一些问题。我按照 @Theo 在 rhel 上的回答操作,并尝试导出引发了一些错误的 LD_LIBRARY_PATH,同时 LD_LIBRARY_PATH 还包括 LD_PRELOAD,因为

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`

你必须在运行 Python 时始终执行此操作,因此请编写一个脚本来加载这些变量并调用 Python 解释器

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`

解决方案 12:

在 python 中导入 tensorflow 时,我收到“未找到版本‘GLIBC_2.14’”的提示。使用 virtualenv 在 Centos6.6 上的 python3.5 中成功导入 tensorflow:

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

解决方案 13:

numba我在尝试在运行 SUSE Linux Enterprise Server 11 的旧 HPC Linux 系统上安装时遇到了类似的问题,该系统具有 glibc 2.11.3(根据ldd --version)。 我没有超级用户权限,任何常规 conda 安装(无论是从defaultsconda-forge还是频道)都会因GLIBC_2.12numba而失败。 我设法按照以下步骤进行安装:OSError: /lib64/libpthread.so.0: version`not found (required by ...envs/test1-py37/lib/python3.7/site-packages/llvmlite/binding/libllvmlite.so`numba

  1. 创建 conda 环境

  2. 在 conda 环境中,glibcnlsec环境中安装

  3. 然后使用pip安装numballvmlite根据新安装进行构建glibc

因此:

conda create -n test -c nlesc glibc
conda activate test
pip install numba

然后导入 numba 就可以了。但是,随后应注意conda install不要将任何后续版本“升级”llvmlite到与 不兼容的版本numba,否则旧问题会再次出现。您可能需要固定其中一个或两个版本以实现此效果。您必须固定构建版本和版本。我创建了一个pinned包含以下内容的文件:

llvmlite==0.27.0-pypi
numba==0.42.0-pypi

并将其放在我的 conda 环境中的文本文件中conda-meta/pinned

解决方案 14:

我遇到了同样的问题并找到了以下解决方案:

conda install tensorflow
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   4008  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   2751  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Freshdesk、ClickUp、nTask、Hubstaff、Plutio、Productive、Targa、Bonsai、Wrike。在当今快速变化的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多企业在项目管理过程中面临着诸多痛点,如任务分配不...
项目管理系统   86  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Monday、TeamGantt、Filestage、Chanty、Visor、Smartsheet、Productive、Quire、Planview。在当今快速变化的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多项目经理和团队在管理复杂项目时,常...
开源项目管理工具   97  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Smartsheet、GanttPRO、Backlog、Visor、ResourceGuru、Productive、Xebrio、Hive、Quire。在当今快节奏的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多企业在选择项目管理工具时常常面临困惑:...
项目管理系统   85  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用