基于飞腾CPU+银河麒麟操作系统编译安装tensorflow

为什么80%的码农都做不了架构师?>>>   hot3.png

由于飞腾CPU是aarch64指令集,当前并不存在可以通过pip直接安装的tensorflow包。因此我们只能通过编译安装。但是,要编译安装Tensorflow,必须要首先安装Bazel,而要安装Bazel必须要解决相关的各种包依赖问题。

飞腾CPU+银河麒麟基础依赖安装

首先要安装pip:

sudo apt update
sudo apt install python-pip
pip install --upgrade pip
sudo apt-get install pkg-config zip g++ zlib1g-dev unzip

安装上述包一般都没有问题,但是下面这些包就不一定了:

sudo apt-get install python-dev
sudo apt-get install python-numpy python-wheel python-virtualenv

银河麒麟的服务器源我没找到,手头只有桌面版本的源,可以发现这些包不够新。对于python-dev这个包,可以通过ubuntu的相应包进行安装。在一台Ubuntu上执行:

apt-get download python-dev

会得到一个以python-dev-…….deb命名的一个包,然后在银河麒麟机器上你可以这样安装这个包:

sudo dpkg -i python-dev-…….deb

对于python-numpy python-wheel python-virtualenv这几个包,可以通过pip来安装:

sudo pip install numpy wheel virtualenv

基于飞腾CPU+银河麒麟操作系统的Bazel编译与安装

首先我们要获得一份Bazel-0.5.4版本源码:

wget https://github.com/bazelbuild/bazel/releases/download/0.5.4/bazel-0.5.4-dist.zip
mkdir bazel-0.5.4
unzip bazel-0.5.4-dist.zip -d bazel-0.5.4

为什么要用这个版本呢?因为最新的不同版本Bazel对于飞腾CPU的aarch64指令集的处理方法是不确定的,我经过搜索,只能找到一篇国外博客是在这个指令集上对Bazel进行了编译(https://collaborate.linaro.org/display/BDTS/Building+and+Installing+Tensorflow+on+AArch64#BuildingandInstallingTensorflowonAArch64-Installotherdependencies )。 参考相关博客,需要修改相应的编译脚本:

diff --git a/scripts/bootstrap/buildenv.sh b/scripts/bootstrap/buildenv.sh
index 502f2c1..a2ab4dc 100755
--- a/scripts/bootstrap/buildenv.sh
+++ b/scripts/bootstrap/buildenv.sh
@@ -40,7 +40,7 @@ PLATFORM="$(uname -s | tr 'A-Z' 'a-z')"
 
 MACHINE_TYPE="$(uname -m)"
 MACHINE_IS_64BIT='no'
-if [ "${MACHINE_TYPE}" = 'amd64' -o "${MACHINE_TYPE}" = 'x86_64' -o "${MACHINE_TYPE}" = 's390x' ]; then
+if [ "${MACHINE_TYPE}" = 'amd64' -o "${MACHINE_TYPE}" = 'x86_64' -o "${MACHINE_TYPE}" = 's390x'  -o "${MACHINE_TYPE}" = 'aarch64' ]; then
   MACHINE_IS_64BIT='yes'
 fi
 
diff --git a/src/main/java/com/google/devtools/build/lib/util/CPU.java b/src/main/java/com/google/devtools/build/lib/util/CPU.java
index 7a85c29..e5f3eae 100755
--- a/src/main/java/com/google/devtools/build/lib/util/CPU.java
+++ b/src/main/java/com/google/devtools/build/lib/util/CPU.java
@@ -26,6 +26,7 @@ public enum CPU {
   X86_64("x86_64", ImmutableSet.of("amd64", "x86_64", "x64")),
   PPC("ppc", ImmutableSet.of("ppc", "ppc64", "ppc64le")),
   ARM("arm", ImmutableSet.of("arm", "armv7l")),
+  AARCH64("aarch64", ImmutableSet.of("aarch64")),
   S390X("s390x", ImmutableSet.of("s390x", "s390")),
   UNKNOWN("unknown", ImmutableSet.of());
  
diff --git a/third_party/BUILD b/third_party/BUILD
index 9cd2fac..f1cd14c 100755
--- a/third_party/BUILD
+++ b/third_party/BUILD
@@ -583,6 +583,11 @@ config_setting(
 )
 
 config_setting(
+    name = "aarch64",
+    values = {"host_cpu": "aarch64"},
+)
+
+config_setting(
     name = "freebsd",
     values = {"host_cpu": "freebsd"},
 )

上面是常规操作,但是并不能保证Bazel在银河麒麟系统上正确编译:银河麒麟系统自己源里面的jdk似乎做了一些设置,导致找不到rt.jar里面的一些类和一些包。这是因为javac在运行的时候会默认在符号表ct.sym (同样在jre/lib/下)中查找该类是否存在。解决的方法是在javac中加上编译选项-XDignore.symbol.file,这就需要修改两处代码。 一处是bazel-0.5.4/script/bootstrap/compile.sh的122行,本来是

run "${JAVAC}" -classpath "${classpath}" -sourcepath "${sourcepath}" \

现在改成

run "${JAVAC}" -XDignore.symbol.file -classpath "${classpath}" -sourcepath "${sourcepath}" \

另外一处是bazel-0.5.4/compile.sh的123行:

bazel_build "src:bazel${EXE_EXT}" \

现在改成

bazel_build --javacopt="-XDignore.symbol.file" "src:bazel${EXE_EXT}" \

然后运行bazel-0.5.4/compile.sh即可获得bazel-0.5.4/output/bazel,将这个文件复制到/usr/bin/bazel即可成功安装bazel。

使用Bazel编译Tensorflow

首先要从github下载tensorflow的1.5.0版本,一定要是这个版本,因为只有这个版本我能告诉你在编译的时候可以选什么选项。获得了这个版本的代码解压到tf文件夹以后,运行如下命令

./configure

这个过程中会让你选择众多编译选项,记住俩事儿:只打开jemalloc的相关选项,别的都不要打开。然后运行:

bazel build -c opt --copt="-funsafe-math-optimizations" --copt="-ftree-vectorize" --copt="-fomit-frame-pointer" --verbose_failures tensorflow/tools/pip_package:build_pip_package
bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg

接下来编译会进行相当长的时间。编译完成后就可以通过pip安装了:

sudo pip install /tmp/tensorflow_pkg/tensorflow-1.5.0rc0-cp27-cp27mu-linux_aarch64.whl

转载于:https://my.oschina.net/ufopc/blog/2243288

你可能感兴趣的:(基于飞腾CPU+银河麒麟操作系统编译安装tensorflow)