AArch64编译安装特定GPU版本TensorFlow及Bazel
前排提⽰:如果使⽤的 cuDNN 版本⾼于 7,会⽆法编译安装带 CUDA ⽀持的 TensorFlow 1 版本。
本⽂基于 Jetson TX2。
ALBERT 的 要求 tensorflow==1.15.2,⽽这显然是不能通过 Ubuntu apt 安装的,也根本没有为 aarch64 架构编译好的 binary,所以采⽤编译安装。
⾸先在 tensorflow 的 GitHub Relea 中找到 1.15.2 版本,下载 Asts 中的 Source code (),然后解压。这时如果直接执⾏sudo ./configure 会报错找不到 bazel。参考最新版本的 bazelbuild 的⽂档::
⼀、使⽤ Bazelisk 安装。第⼀种⽅法使⽤
npm install -g @bazel/bazelisk
可以成功安装 Bezelisk;第⼆种⽅法直接下载 GitHub Relea;第三种⽅法要求 MacOS 的 homebrew,不适⽤;第四种⽅法
go /bazelbuild/bazelisk
keep childlike要求安装 Go,在下载了最新版 Go 的 Linux aarch64 版本的 binary 后移动到 /usr/local ⽬录下并添加⾄ $PATH,安装完成,但是 go 安装包很慢,所以不采⽤。
然⽽,bazelisk 默认安装的 bazel 版本过⾼,提⽰要求 0.26.1 及以下版本,⽆法使⽤。
⼆、使⽤定制的 APT 仓库
sudo apt install curl gnupg
curl -fsSL bazel.build/bazel-relea.pub.gpg | gpg --dearmor > bazel.gpg
sudo mv bazel.gpg /etc/apt/trusted.gpg.d/
echo "deb [arch=amd64] /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,但是安装时仍会提⽰找不到包,因为 是⽆法访问的。
三、使⽤ binary 安装程序
六一儿童节歌曲同样,0.26.1 版本没有 Linux aarch64 的 binary,⽆法使⽤。
100percent四、只能⼿动编译 bazel-0.26.1。你可以参考 0.26.0 版本的⽂档,安装指导部分的内容与最新版本差异很⼩:
⽅法⼀:使⽤ Bazel 构建 Bazel:
从 GitHub Relea 下载 bazel-0.26.1 Source code () 并解压,执⾏
bazel build //src:bazel-dev
类似命令都需要访问 ,⽆法使⽤。
fukushima⽅法⼆:使⽤ scratch 构建 Bazel:
从 GitHub Relea 下载 (注意不是 Source code,如果直接⽤ Source Code 会提⽰需要设置 PROTOC,设置 PROTOC 后会提⽰需要设置 GRPC_JAVA_PLUGIN,提⽰出现错误的原因是在编译⼀个 develop checkout)并解压,执⾏
sudo apt-get install build-esntial openjdk-11-jdk python zip unzip
安装编译所需依赖。切换到解压后的⽬录下,执⾏ilunch
env EXTRA_BAZEL_ARGS="--host_javaba=@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
commandpursue
(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-tup.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_ba_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
glowbazel-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: Elapd time: 1144.984s, Critical Path: 263.94s
INFO: 1749 process: 1514 local, 235 worker.
FAILED: Build did NOT complete successfully
ERROR: Could not build Bazel
执⾏
find -name '*.sh' -exec chmod a+x '{}' \;
后重新 compile。
经过较长时间的编译(Elapd time: 1164.949s, Critical Path: 469.78s)(1751 process: 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 的问题,参考 执⾏
find -name '*.sh' -exec chmod a+x '{}' \;
后重新 compile 即可。
pip install -U --ur pip numpy wheel
pip install -U --ur keras_preprocessing --no-deps
sudo ./configure
在 下载最新版本的 computecpp 解压 ComputeCpp-CE-2.7.0-aarch64-linux-gnu,移动到 /usr/local 并重命名为 computecpp。参考 cuDNN 已包含在 JetPack 内,可通过在 /usr/lib/aarch64-linux-gnu 下寻找 cuDNN 版本,我的是 8.2.1。
前两步选项使⽤ /usr/bin/python3 和 /usr/lib/python3/dist-packages。注意不要选 OpenCL SYCL 和 ROCm,⽽选 CUDA,如果同时选会报错
Traceback (most recent call last):
File "./configure.py", line 1602, in <module>
main()
File "./configure.py", line 1549, in main
rai UrInputError('SYCL / CUDA / ROCm are mututally exclusive. '
__main__.UrInputError: SYCL / CUDA / ROCm are mututally exclusive. At most 1
GPU platform can be configured.
在指定 CUDA compute capabilities ⼀步通过 查询,对于 Jetson TX2 是 6.2。
如果报错
Traceback (most recent call last):
File "configure.py", line 1571, in <module>
main()
File "configure.py", line 1448, in main
if validate_cuda_config(environ_cp):
File "configure.py", line 1340, in validate_cuda_config
tuple(line.decode('ascii').rstrip().split(': ')) for line in proc.stdout)
ValueError: dictionary update quence element #9 has length 1; 2 is required
参考
在 third_part/gpus/find_cuda_config.py ⽂件的第 355 ⾏将 cudnn_version ⼿动指定为 8。
参考 先将
deb apt.llvm/bionic/ llvm-toolchain-bionic main
e mail地址
deb-src apt.llvm/bionic/ llvm-toolchain-bionic main
添加到源,然后执⾏ sudo apt update,如果报错
执⾏
sudo apt-key adv --keyrver --recv-keys 15CF4D18AF4F7421
sudo apt update
即可。如果报错
Cannot initiate the connection to apt.llvm:80 (2a04:4e42:6::561). - connect (101: Network is unreachable) Could
not connect to apt.llvm:80 (151.101.198.49), Connection timed out
重试即可。执⾏
sudo apt install clang-format clang-tidy clang-tools clang clangd libc++-dev libc++1 libc++abi-dev libc++abi1 libclang-dev libclang1 liblldb-dev libllvm-ocaml-dev libo 参考 安装 Open MPI。先从 下载
最新版本的 *.tar.bz2 / *. 压缩包,然后解压,参考 执⾏
gunzip -c openmpi-4.1. | tar xf -
cd openmpi-4.1.1
sudo ./configure --prefix=/usr/local
sudo make all install
安装时间较长。安装成功后在 Plea specify the MPI toolkit folder 时 Default 就会从 /usr 改成 /usr/local。
注意不要勾选 否则会报错
ERROR: Config value download_clang_u_lld is not defined in any .rc file
执⾏完 configure 后配置上⽹,具体⽅法可参考 ,把⽹址改成正确的⽹址,把 fhs-install-<name> 克隆下来,然后下载最新 <name>-
core 的 relea ⾥的 <name>-linux-arm64-v8a.zip 和 <name>-linux-arm64-v8a.zip.dgst 到 fhs-install-
<name> ⾥,将 install-
relea.sh 的 282-285 和 287-290 ⾏注释掉,然后添加
cp <name>-linux-$MACHINE.zip $ZIP_FILE
cp <name>-linux-$MACHINE.zip.dgst $ZIP_FILE.dgst
执⾏
sudo bash ./install-relea.sh
sudo systemctl enable <name>
sudo systemctl start <name>
sudo systemctl status <name>.rvice
显⽰为 Active: active (running),也可以看到配置⽂件路径在 /usr/local/etc/<name>/config.json。
参考 下载
go1.17.3.
执⾏
agent
sudo rm -rf /usr/local/go && sudo tar -C /usr/local -xzf go1.17.3.
export PATH=$PATH:/usr/local/go/bin
go version
⽹络问题还可参考、注意:在 Do you want to u clang as CUDA compiler? [y/N] 时选择 N,否则会报错。参考:
Auto-Configuration Warning: 'TMP' environment variable is not t, using 'C:\Windows\Temp' as default ERROR: /home/yihua/tensorflow-1.15.2/tensorflow/tools/pip_package/BUILD:35:1:
Illegal ambiguous match on configurable attribute "deps" in
//tensorflow/tools/pip_package:included_headers_gather:
社交网络下载@local_config_cuda//cuda:using_nvcc
@local_config_cuda//cuda:using_clang
Multiple matches are not allowed unless one is unambiguously more specialized.
ERROR: Analysis of target '//tensorflow/tools/pip_package:build_pip_package'
failed; build aborted:
/home/yihua/tensorflow-1.15.2/tensorflow/tools/pip_package/BUILD:35:1: Illegal
ambiguous match on configurable attribute "deps" in
//tensorflow/tools/pip_package:included_headers_gather:
@local_config_cuda//cuda:using_nvcc
@local_config_cuda//cuda:using_clang
Multiple matches are not allowed unless one is unambiguously more specialized.
INFO: Elapd time: 46.883s
INFO: 0 process.
FAILED: Build did NOT complete successfully (41 packages loaded, 54 targets
co\
nfigured)
currently loading: tensorflow/core/kernels
Fetching @local_config_cc; fetching
注意:根据 TensorFlow 的版本不同可能⽆法兼容 cuDNN 8 和 TensorRT 8,报错: