从源码构建Bazel失败:Jetson TK1平台TensorFlow源码构建受阻
我之前在Jetson TK1上折腾过TensorFlow源码编译,完全明白卡在Bazel这一步有多崩溃——毕竟官方连ARM架构的预构建包都没有,只能硬啃源码编译的坑,而且TK1的硬件限制(2GB内存、ARMv7架构)又给这个过程添了不少麻烦。我当时试了一堆博客和GitHub方案也踩了不少坑,最后摸索出一套适配TK1的Bazel编译流程,你可以试试:
针对Jetson TK1的Bazel编译适配方案
1. 先解决内存瓶颈,避免编译OOM
TK1只有2GB物理内存,编译Bazel这种大型项目很容易直接内存溢出卡死,这是大部分通用方案忽略的关键点:
- 临时创建4GB swap分区(编译完可以删掉):
sudo fallocate -l 4G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile - 强制限制并行编译线程数,别用默认的4核(内存扛不住),建议用
-j2甚至-j1:
后续编译Bazel和TensorFlow时都要加上这个参数。
2. 选对Bazel版本,别用最新版
新版本Bazel已经放弃了对ARMv7的官方支持,强行编译只会遇到一堆兼容问题。亲测Bazel 0.26.1是最后几个能稳定在TK1上编译的版本,别选更高的。
3. 源码编译Bazel的针对性修改
- 先克隆对应版本的源码并切换分支:
git clone https://github.com/bazelbuild/bazel.git cd bazel git checkout 0.26.1 - 修改编译器配置文件,适配ARMv7架构:
打开tools/cpp/cc_configure.bzl,找到find_cc_toolchain函数,添加ARMv7专属编译 flags:
在文件开头插入这段代码:
然后在函数中找到添加编译flags的位置,把def _get_arm_compiler_flags(): return ["-march=armv7-a", "-mfpu=neon", "-mfloat-abi=hard"]_get_arm_compiler_flags()的结果加进去,确保编译器用TK1的硬件优化参数。 - 开始编译,指定Java环境和线程数:
先确保TK1上装了openjdk-8-jdk(Bazel 0.26.1只支持Java 8,别装更高版本),然后执行:./compile.sh --host_javabase=@local_jdk//:jdk --jobs 2
4. 编译完成后的收尾与TensorFlow准备
- 把编译好的Bazel放到系统路径:
sudo cp output/bazel /usr/local/bin/ - 编译TensorFlow时也要适配TK1:
运行./configure时,记得开启ARM NEON和CUDA支持(TK1带NVIDIA GPU,CUDA能大幅提升性能);编译命令同样限制线程数:bazel build --config=opt --config=cuda //tensorflow/tools/pip_package:build_pip_package --jobs 2
常见坑的快速解决
- 如果还是出现“out of memory”,把swap分区加到6GB,或者改用
-j1单线程编译(虽然慢,但能保证不崩溃)。 - 别随便升级TK1的gcc版本,默认的gcc 4.8和TK1的内核是兼容的,升级到gcc 5+会出现内核头文件不兼容的问题。
- 遇到Java相关错误,检查是否装的是
openjdk-8-jdk,用java -version确认版本。
内容的提问来源于stack exchange,提问作者Karthik
相关产品推荐
相关产品推荐

