AArch64编译安装特定GPU版本TensorFlow及Bazel

本文详细记录了在Jetson TX2上编译安装带有CUDA支持的TensorFlow 1.15.2版本的过程。包括解决编译过程中遇到的各种问题,如Bazel版本冲突、cuDNN兼容性问题等。

前排提示:如果使用的 cuDNN 版本高于 7,会无法编译安装带 CUDA 支持的 TensorFlow 1 版本。

本文基于 Jetson TX2。

ALBERT 的 requirements.txt 要求 tensorflow==1.15.2,而这显然是不能通过 Ubuntu apt 安装的,也根本没有为 aarch64 架构编译好的 binary,所以采用编译安装。

首先在 tensorflow 的 GitHub Release 中找到 1.15.2 版本,下载 Assets 中的 Source code (tar.gz),然后解压。这时如果直接执行 sudo ./configure 会报错找不到 bazel。参考最新版本的 bazelbuild 的文档:Installing Bazel on Ubuntu - Bazel 4.2.1

一、使用 Bazelisk 安装。第一种方法使用

npm install -g @bazel/bazelisk

可以成功安装 Bezelisk;第二种方法直接下载 GitHub Release;第三种方法要求 MacOS 的 homebrew,不适用;第四种方法

go get github.com/bazelbuild/bazelisk

要求安装 Go,在下载了最新版 Go 的 Linux aarch64 版本的 binary 后移动到 /usr/local 目录下并添加至 $PATH,安装完成,但是 go 安装包很慢,所以不采用。

然而,bazelisk 默认安装的 bazel 版本过高,提示要求 0.26.1 及以下版本,无法使用。

二、使用定制的 APT 仓库

sudo apt install curl gnupg
curl -fsSL https://bazel.build/bazel-release.pub.gpg | gpg --dearmor > bazel.gpg
sudo mv bazel.gpg /etc/apt/trusted.gpg.d/
echo "deb [arch=amd64] https://storage.googleapis.com/bazel-apt stable jdk1.8" | sudo tee /etc/apt/sources.list.d/bazel.list
sudo apt update && sudo apt install bazel=0.26.1

虽然能成功 update,但是安装时仍会提示找不到包,因为 googleapis.com 是无法访问的。

三、使用 binary 安装程序

同样,0.26.1 版本没有 Linux aarch64 的 binary,无法使用。

四、只能手动编译 bazel-0.26.1。你可以参考 0.26.0 版本的文档,安装指导部分的内容与最新版本差异很小:Compiling Bazel from source - Bazel 0.26.0。

方法一:使用 Bazel 构建 Bazel:

从 GitHub Release 下载 bazel-0.26.1 Source code (tar.gz) 并解压,执行

bazel build //src:bazel-dev

类似命令都需要访问 googleapis.com,无法使用。

方法二:使用 scratch 构建 Bazel:

从 GitHub Release 下载 bazel-0.26.1-dist.zip (注意不是 Source code,如果直接用 Source Code 会提示需要设置 PROTOC,设置 PROTOC 后会提示需要设置 GRPC_JAVA_PLUGIN,提示出现错误的原因是在编译一个 develop checkout)并解压,执行

sudo apt-get install build-essential openjdk-11-jdk python zip unzip

安装编译所需依赖。切换到解压后的目录下,执行

env EXTRA_BAZEL_ARGS="--host_javabase=@local_jdk//:jdk" bash ./compile.sh

注意:如果你已安装 CUDA,那么需要使用 root 权限执行这条命令,然后你仍会遇到报错:

ERROR: /home/yihua/bazel-0.26.1-dist/src/BUILD:339:2: Executing genrule
//src:package-zip_nojdk failed (Exit 126): bash failed: error executing
command 
  (cd /tmp/bazel_fMnQfyqa/out/execroot/io_bazel && \
  exec env - \
    PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
\
  /bin/bash -c 'source external/bazel_tools/tools/genrule/genrule-setup.sh;
src/package-bazel.sh bazel-out/aarch64-opt/bin/src/package_nojdk.zip
bazel-out/aarch64-opt/bin/src/embedded_tools_nojdk.zip
bazel-out/aarch64-opt/bin/src/main/java/com/google/devtools/build/lib/bazel/BazelServer_deploy.jar
bazel-out/aarch64-opt/bin/src/install_base_key_nojdk
bazel-out/aarch64-opt/bin/src/main/native/libunix.so
bazel-out/aarch64-opt/bin/src/main/tools/build-runfiles
bazel-out/aarch64-opt/bin/src/main/tools/process-wrapper
src/main/tools/jdk.BUILD
bazel-out/aarch64-opt/bin/src/main/tools/linux-sandbox
bazel-out/aarch64-opt/bin/tools/osx/xcode-locator
bazel-out/aarch64-opt/bin/src/main/tools/daemonize')
Execution platform: @bazel_tools//platforms:host_platform
/bin/bash: src/package-bazel.sh: Permission denied
Target //src:bazel_nojdk failed to build
INFO: Elapsed time: 1144.984s, Critical Path: 263.94s
INFO: 1749 processes: 1514 local, 235 worker.
FAILED: Build did NOT complete successfully

ERROR: Could not build Bazel

参考 Bazel 0.11.0 cant be built from source on Linux because of missing execute bits · Issue #4733 · bazelbuild/bazel (github.com)https://github.com/bazelbuild/bazel/issues/4733

执行

find -name '*.sh' -exec chmod a+x '{}' \;

 后重新 compile。

经过较长时间的编译(Elapsed time: 1164.949s, Critical Path: 469.78s)(1751 processes: 1516 local, 235 worker)后成功编译:

Build successful! Binary is here: /home/nvidia/Downloads/bazel-0.26.1-dist/output/bazel

将其移动至 /usr/local/bin。 

如果安装了 CUDA,bazel 需要额外编译内容,这就需要 root 权限。但使用 root 权限后仍然会报错 Permission denied 的问题,参考 Bazel 0.11.0 cant be built from source on Linux because of missing execute bits · Issue #4733 · bazelbuild/bazel (github.com)

执行

find -name '*.sh' -exec chmod a+x '{}' \;

后重新 compile 即可。

回到 tensorflow-1.15.2 目录下,参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ayka

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值