从源代码编译bazel
要在32位的arm Linux上编译tensorflow,安装bazel编译工具是必不可少的。bazel对64位操作系统的支持较为完善,但对于32位系统就不那么友好了。
安装编译工具
sudo apt-get install build-essential openjdk-11-jdk python zip unzip
这一步大多不会有什么问题,需要注意的是JDK的版本可能无法装上当前的系统,需要换成openjdk-8-jdk
。当然也可以通过下载JDK的安装文件进行配置:参考教程。
下载bazel源码
安装完成上述工具后,到官方的Github上获取bazel的源码。可供编译的bazel源码在文件名为bazel-XXX-dist.zip
的压缩包里,有多种版本的bazel可供选择。
这里需要注意的一点是编译不同版本bazel对JDK工具是有版本限制的,比如bazel-3.4.1
的版本不支持用JDK 8
来编译。
我使用的是JDK 8
版本,因此先下载了bazel-0.16.0
的源码来编译。
解压和编译
将下好的bazel-XXX-dist.zip
文件放入到系统文件目录中,并解压到一个新文件夹内。
sudo unzip bazel-XXX-dist.zip
进入文件夹,使用命令开始编译。
env BAZEL_JAVAC_OPTS="-J-Xms384m -J-Xmx1g" bash ./compile.sh
出现以下内容时说明开始编译了,时间较长(2小时左右)需要耐心等待。
🍃 Building Bazel from scratch......
🍃 Building Bazel with Bazel.
可能出现的编译错误
- 也许会出现以下错误:
java.lang.OutOfMemoryError: Java heap space
说明Java的heap space太小了,适当调大点,如:
env BAZEL_JAVAC_OPTS="-J-Xms384m -J-Xmx2g" bash ./compile.sh
- 还可能出现以下错误:
Configurable attribute "actual" doesn't match this configuration: Could not find a JDK for host execution environment, please explicitly provide one using `--host_javabase.`
说明目前使用的JDK版本太低不支持编译该版本的bazel,因此需要更新的JDK或者先选择版本较低的bazel编译,之后再通过bazel进行升级。
安装bazel
编译成功后会输出信息,如:
Build successful! Binary is here: /home/xilinx/jupyter_notebooks/building_environment/bazel_old/output/bazel
到输出目录下,执行:
./bazel
如果成功安装,会输出一些说明
此时可以把bazel拷贝出来,并且在环境变量中添加命令。
sudo cp ./bazel /home/xilinx/
打开profile文件
sudo nano /etc/profile
在profile最后一行添加环境变量:
export PATH=/home/xilinx/:$PATH
针对内存不足的一些补充
过了几天又需要编译bazel了,但是换了个bazel版本怎么调大heap space都不行。机器内存还是太小了,只能尝试调大swap空间。
查看当前的swap大小
swapon -s
只有1GB的内存和1GB的swap
增加swap大小
sudo dd if=/dev/zero of=/home/swap bs=1024 count=1048576
sudo mkswap /home/swap
sudo swapon /home/swap
重新查看
swapon -s
swap增大到了2G