请认真阅读以下内容:
本人应该把能踩过的坑全部都踩了(2days)
我把所有坑和解决方案都记录下来(纯文字)
建议先看完某一个大步骤以及了解踩坑原因再执行对应的命令能够有效避免踩坑
本文包括:
(1)官方编译好的动态库(x86,x64)以及我编译好的动态库(arm64)
(2)安装树莓派64位系统
(3)安装bazel(编译tensorflow工具):脚本和编译两个方式
(4)安装tensorflow:编译和直接下载使用两个方式
x86和x64可以直接下载官方编译好的动态链接库,然后跳到安装tensorflow编译完成:
Linux(仅支持 CPU) https://storage.googleapis.com/tensorflow/libtensorflow/libtensorflow-cpu-linux-x86_64-2.6.0.tar.gz
Linux(支持 GPU) https://storage.googleapis.com/tensorflow/libtensorflow/libtensorflow-gpu-linux-x86_64-2.6.0.tar.gz
macOS(仅支持 CPU) https://storage.googleapis.com/tensorflow/libtensorflow/libtensorflow-cpu-darwin-x86_64-2.6.0.tar.gz
Windows(仅支持 CPU) https://storage.googleapis.com/tensorflow/libtensorflow/libtensorflow-cpu-windows-x86_64-2.6.0.zip
Windows(仅支持 GPU) https://storage.googleapis.com/tensorflow/libtensorflow/libtensorflow-gpu-windows-x86_64-2.6.0.zip
我编译的树莓派arm64版本:
libtensorflow: 树莓派编译而成的tensorflow动态库
bazel(不下载不影响安装tensorflw): bazel树莓派arm64编译-Linux文档类资源-CSDN下载
下载完直接跳到安装步骤
观前提醒(背景):
1.
编译过程十分漫长,你可能需要一天的时间来搞,建议看剧消磨时间
影视推荐:猎魔人,纸牌屋,洛基
2.
如果想要尝试,建议树莓派4B(64位)配置:4G内存+32Gtf卡
编译过程十分耗资源,当然,内存2G应该也行,就是要慢一点(我会有提示,请注意)
我就是4+32,,重装了树莓派64位系统后直接下载编译tensorflow过程中
tf卡占用如下:
Filesystem Size Used Avail Use% Mounted on
/dev/root 29G 14G 15G 49% /
devtmpfs 1.7G 0 1.7G 0% /dev
tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs 1.9G 492K 1.9G 1% /run
tmpfs 5.0M 4.0K 5.0M 1% /run/lock
tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
/dev/mmcblk0p1 253M 30M 223M 12% /boot
tmpfs 380M 0 380M 0% /run/user/1000
编译时某一时刻内存占用如下:
total used free shared buff/cache available
Mem: 3.7Gi 3.6Gi 34Mi 0.0Ki 104Mi 63Mi
Swap: 4.0Gi 933Mi 3.1Gi
以及
total used free shared buff/cache available
Mem: 3.7Gi 3.5Gi 43Mi 0.0Ki 137Mi 105Mi
Swap: 4.0Gi 1.1Gi 2.9Gi
大部分时候内存占用基本情况(具有一定代表性):
total used free shared buff/cache available
Mem: 3.7Gi 1.9Gi 1.6Gi 0.0Ki 263Mi 1.8Gi
Swap: 4.0Gi 597Mi 3.4Gi
以及
total used free shared buff/cache available
Mem: 3.7Gi 2.7Gi 786Mi 0.0Ki 215Mi 925Mi
Swap: 4.0Gi 420Mi 3.6Gi
3.
我的环境:
- 系统64位,没超频
- 内核:Linux raspberrypi 5.10.63-v8+ #1496 SMP PREEMPT Wed Dec 1 15:59:46 GMT 2021 aarch64 GNU/Linux
- 硬件 :4+32
----------------------------------------正片开始----------------------------------------
树莓派64位系统下载地址:
https://downloads.raspberrypi.org/raspios_arm64/images/raspios_arm64-2020-05-28/2020-05-27-raspios-buster-arm64.zip
安装工具可以使用官方工具:
https://www.raspberrypi.com/software/
没有显示器查看教程中的远程连接教程:https://wiki.dfrobot.com.cn/detailed_operation_steps_of_burning_system_c
踩坑点一:树莓派脚本安装bazel
1.
链接:https://github.com/bazelbuild/bazel/releases
下载内容:bazel-4.2.2-installer-darwin-arm64.sh
执行安装脚本:
sudo ./bazel-4.2.2-installer-darwin-arm64.sh --prefix=/usr/local --bin=/usr/local/bin --base=/usr/local/lib/bazel --user
2.
根据提示做:
Make sure you have "/usr/local/bin" in your path.
For bash completion, add the following line to your ~/.bashrc:
source /usr/local/lib/bazel/bin/bazel-complete.bash
For fish shell completion, link this file into your
/root/.config/fish/completions/ directory:
ln -s /usr/local/lib/bazel/bin/bazel.fish /root/.config/fish/completions/bazel.fish
See http://bazel.build/docs/getting-started.html to start a new project!
3.
输入:
bazel
返回:
/usr/local/bin/bazel:行220: /usr/local/lib/bazel/bin/bazel-real:无法执行二进制文件: 可执行文件格式错误
/usr/local/bin/bazel:行220: /usr/local/lib/bazel/bin/bazel-real: 成功
错误!
可能原因:
a.脚本不支持arm32系统
b.脚本不支持arm系统
把usr/local/bin usr/local/lib /root/bin ~/.bazel或/root/bazel 有关东西删除
解决踩坑点一:树莓派编译安装bazel
(遇到坑中坑,换个64位系统)
1.
环境:
Bash
zip, unzip
C++ build toolchain
JDK. Versions 8 and 11 are supported.
Python. Versions 2 and 3 are supported, installing one of them is enough.
执行命令:
sudo apt-get install build-essential openjdk-11-jdk python zip unzip
2.
下载bazel-
链接:https://github.com/bazelbuild/bazel/releases
解压到你想要的位置
cd 到解压位置
3.
正式编译安装
执行命令:
nv EXTRA_BAZEL_ARGS="--host_javabase=@local_jdk//:jdk" bash ./compile.sh
结果依然不成功:
ERROR: Could not build Bazel
4.
输入:getconf LONG_BIT
输出:32
修改内核为64位再试一次
(1)
cd /boot
(2)
ls | grep kernel
出现kernel8.img即可
(3)
vi config.txt
末尾添加:
kernel=kernel8.img
arm_64bit=1
(4)
sudo rpi-update
(5)
reboot
算啦,不试了,我不如直接换个arm64的系统
5.
你可以尝试一下再次使用脚本安装,我没试过
或者
再次执行上述编译安装操作
编译成功:Build successful! Binary is here: /home/pi/myfile/bazel_source/output/bazel
6.
检查文件:
file output/bazel
=》 输出:output/bazel: ELF 64-bit LSB shared object, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, for GNU/Linux 3.7.0, BuildID[sha1]=38603f1578ca16e7650ba3a38fbc7527b6e439da, not stripped
输出文件是ELF,正确!
7.
把编译出来的二进制文件output/bazel放到/usr/local/bin:
sudo cp bazel /usr/local/bin/
8.
输入命令:
bazel
(1)
正常情况
=》输出:Extracting Bazel installation...
Starting local Bazel server and connecting to it...
[bazel release 4.2.2- (@non-git)]
Usage: bazel
...
...
...
(2)
异常情况
若输出说没有找到(command not found),检查是否包含路径/usr/local/bin:echo $PATH
来查看输出有没有/usr/local/bin
若没有:vi ~/.bashrc或vi ~/.zshrc(取决于你用的是bash还是zsh,可以用echo $0查看)
在末尾加入 export PATH=$PATH:/usr/local/bin
踩坑点二:编译tensorflow
1.
git clone https://github.com/tensorflow/tensorflow.git
cd tensorflow
2.
例如安装tensorflow版本2.7
git checkout r2.7 # r2.2, r2.3, etc.
注意检查configure.py文件里面的变量:
_TF_MIN_BAZEL_VERSION
_TF_MAX_BAZEL_VERSION
确保bazel版本符合要求,不行就换个版本编译(建议)或重新安装bazel
3.
./configure
都选n(树莓派没有英伟达显卡)
4.
在这个文件夹下运行官方提供的c语言安装指令:
bazel test --config opt //tensorflow/tools/lib_package:libtensorflow_test
=》结果:gcc: fatal error: Killed signal terminated program cc1plus
搜索结果:可能我内存小了!我树莓派4G内存!
解决踩坑点二:扩大swap
1.
在之后的编译步骤中的某个编译比较慢的时刻,我的内存情况:
pi@raspberrypi:~/myfile/tensorflow $ free -h
total used free shared buff/cache available
Mem: 3.7Gi 3.6Gi 34Mi 0.0Ki 104Mi 63Mi
Swap: 4.0Gi 933Mi 3.1Gi
修改swap为4G(默认为100M),之后编译特别耗内存,我之前已经修改了的4G+1G(swap)都不够用
解决方案:
sudo vi /etc/dphys-swapfile
修改为:
CONF_SWAPSIZE=4096
CONF_MAXSWAP=4096
重新启动 dphys-swapfile 文件服务:
sudo /etc/init.d/dphys-swapfile restart
PS:
还是不够,请按照以下修改:
CONF_SWAPSIZE=8192
CONF_MAXSWAP=8192
内存占用如下:
total used free shared buff/cache available
Mem: 3.7Gi 3.6Gi 38Mi 0.0Ki 84Mi 48Mi
Swap: 8.0Gi 4.6Gi 3.4Gi
2.
限制bazel使用内存为2G进行编译:
bazel test --local_ram_resources=2048 --config=opt //tensorflow/tools/lib_package:libtensorflow_test
test老是不过,算啦,希望和编译没什么关系,直接下一步build
3.
默认应该是4线程编译:
bazel build --config=opt //tensorflow/tools/lib_package:libtensorflow
如果内存小可以2线程编译:
bazel build --jobs=2 --config=opt //tensorflow/tools/lib_package:libtensorflow
或者1线程编译:
bazel build --jobs=1 --config=opt //tensorflow/tools/lib_package:libtensorflow
四线程编译大概需要10h以上吧,记不太清时间了,反正蛮久
4.
编译完成!安装
编译的东西在:bazel-bin/tensorflow/tools/lib_package/libtensorflow.tar.gz
cd 到对应目录
tar -C /usr/local -xzf libtensorflow.tar.gz
5.
设置ldconfig
sudo ldconfig /usr/local/lib
或者
linux:
export LIBRARY_PATH=$LIBRARY_PATH:/usr/local/lib
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
macos:
export LIBRARY_PATH=$LIBRARY_PATH:/usr/local/lib
export DYLD_LIBRARY_PATH=$DYLD_LIBRARY_PATH:/usr/local/lib
最后:测试代码
源文件 hello_tf.c:
#include
#include
int main() {
printf("Hello from TensorFlow C library version %s\n", TF_Version());
return 0;
}
编译:
gcc hello_tf.c -ltensorflow -o hello_tf
执行:
./hello_tf
输出:
Hello from TensorFlow C library version 2.7.0