如何在Red Hat 6.7上安装Bazel和TensorFlow

4
我希望能从源代码中安装bazel,并在运行redhat 6.7的集群上使用bazel编译tensorflow。当我尝试安装bazel时,glibc版本(2.12)过旧。我没有对该集群拥有root访问权限。在这种情况下,是否可能安装tensorflow?
我的系统信息:
-bash-4.1$ cat /etc/redhat-release
Red Hat Enterprise Linux Server release 6.7 (Santiago)
-bash-4.1$ which gcc
/usr/bin/gcc
-bash-4.1$ gcc -v
Using built-in specs.
Target: x86_64-redhat-linux
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-languages=c,c++,objc,obj-c++,java,fortran,ada --enable-java-awt=gtk --disable-dssi --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-1.5.0.0/jre --enable-libgcj-multifile --enable-java-maintainer-mode --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --disable-libjava-multilib --with-ppl --with-cloog --with-tune=generic --with-arch_32=i686 --build=x86_64-redhat-linux
Thread model: posix
gcc version 4.4.7 20120313 (Red Hat 4.4.7-16) (GCC) 
-bash-4.1$ ldd --version
ldd (GNU libc) 2.12

系统安装了更新的gcc。我尝试使用它,但bazel仍无法编译。

-bash-4.1$ /usr/local/gcc/4.8.4/bin/gcc -v
Using built-in specs.
COLLECT_GCC=/usr/local/gcc/4.8.4/bin/gcc
COLLECT_LTO_WRAPPER=/usr/local/gcc/4.8.4/libexec/gcc/x86_64-unknown-linux-gnu/4.8.4/lto-wrapper
Target: x86_64-unknown-linux-gnu
Configured with: ../configure --prefix=/usr/local/gcc/4.8.4
Thread model: posix
gcc version 4.8.4 (GCC) 

当我在编译Bazel时,遇到了以下错误:
bazel-0.1.1/_bin/build-runfiles: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.14' not found

有些人也报告了这个问题:https://github.com/tensorflow/tensorflow/issues/110https://github.com/tensorflow/tensorflow/issues/527

我该如何在本地安装缺失的依赖项,并让bazel选择正确的库?


我猜你甚至没有安装Docker,对吧?问问管理员或使用AWS实例。 - fabrizioM
@fabrizioM 我想管理员不愿意安装Docker。Docker在Redhat 6.X上不受Redhat支持。此外,我不确定Docker将如何与Torque(作业分配系统)交互。AWS对我来说也不是一个选项。 - read Read
现在已经过去一年了,我正在尝试在Redhat 6.9上安装Bazel(用于tenserflow)。同样的问题。 - Gadi
2个回答

3
你应该能够使用新版本的Bazel编译源代码,导出LD_FLAGS、CXX和CC,并调整Bazel中的tools/cpp/CROSSTOOL文件。如果有进一步问题,请在Bazel(https://github.com/bazelbuild/bazel/issues)上开一个Github issue。我正在努力让这一切变得更简单。对于混乱造成的不便,我感到非常抱歉。

你所说的新版本是指 Bazel 0.1.2 吗?我正在编译 bazel 0.1.1,因为只有 bazel 0.1.1 能够编译 tensorflow。在 tensorflow 的 github 上,人们也建议不要使用 Bazel 0.1.2 来编译 tensorflow。 - read Read

1

如果有人需要手动完成此操作:

  1. 使用选项--disable-rpath从源代码编译最新的glibc、gcc及其所有依赖项,以避免将glibc路径硬编码为系统默认值。不要直接将glibc添加到LD_LIBRARY_PATH中,否则所有可执行文件(包括rm)都将停止工作。

  2. 使用您的gcc编译python,安装pip和官方wheel

./configure --prefix=$PWD/build --enable-unicode=ucs4 --with-cxx-main=g++ && make && make install

  1. 使用以下命令启动python以加载正确的glibc,其中${GLIBC_PATH}是您的glibc安装位置,请创建别名

alias tensorflow='${GLIBC_PATH}/lib/ld-2.23.so --library-path ${GLIBC_PATH}/lib:${LD_LIBRARY_PATH}which python'

  1. 导入tensorflow以检查是否出现错误
在能够无误导入tensorflow模块后,您可以使用其他计算机(可能是PC上的Ubuntu虚拟机)编译带有特定机器选项的自定义轮,并按照指南将其复制到集群。
bazel build -c opt --copt=-mavx --copt=-mavx2 --copt=-mfma --copt=-mfpmath=both --copt=-msse4.2 --copt=-msse4.1 //tensorflow/tools/pip_package:build_pip_package

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接