arm64/x64/x86/macos安装tensorflow c语言版本

请认真阅读以下内容:
本人应该把能踩过的坑全部都踩了(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--dist.zip文件
链接: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
 

你可能感兴趣的:(tensorflow,macos,c语言,arm,raspberry,pi)