如何修复用Bazel编译TensorFlow 2.0时的"Received RST_STREAM error 8"错误
解决Bazel 0.24.1编译TensorFlow 2.0时服务器异常终止的问题
我之前也碰到过一模一样的问题,这本质是旧版Bazel与JDK 9及以上版本的兼容性冲突导致的:Bazel 0.24.1依赖的Netty库会尝试反射访问JDK内部API,而JDK 9+引入的模块化系统默认阻止了这类操作,最终触发Bazel服务器突然终止。结合你的错误日志和场景,这里有几个靠谱的解决办法:
方案一:降级JDK到8版本(最稳妥)
旧版Bazel对JDK 8的支持最完善,完全不会有这类反射权限问题:
- 安装OpenJDK 8(比如通过包管理器:
sudo apt install openjdk-8-jdk,不同系统命令略有差异) - 设置Bazel使用这个JDK:
- 临时生效:在终端执行
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64(路径根据你的实际安装位置调整) - 永久生效:把上述命令添加到你的
~/.bashrc或~/.zshrc文件中,然后执行source ~/.bashrc生效
- 临时生效:在终端执行
- 清理Bazel缓存避免残留问题:
bazel clean --expunge - 重新运行你的编译命令
方案二:给Bazel添加JVM参数允许非法反射访问
如果不想降级JDK,可以通过JVM参数放宽反射限制:
- 修改你的编译命令,添加
--host_jvm_args="--illegal-access=permit"参数:~/bin/bazel build -c opt --verbose_failures --host_jvm_args="--illegal-access=permit" --copt=-msse3 --copt=-msse4.1 --copt=-msse4.2 --copt=-mavx --copt=-mavx2 --copt=-mfma //tensorflow/tools/pip_package:build_pip_package - 或者永久配置到Bazel:在你的
~/.bazelrc文件中添加一行:build --host_jvm_args="--illegal-access=permit" - 同样建议先清理缓存:
bazel clean --expunge再重新编译
方案三:升级Bazel到兼容JDK 9+的版本
如果你想保留新版JDK,也可以升级Bazel到对模块化JDK支持更好的版本,但要注意TensorFlow 2.0对Bazel版本有要求:TensorFlow 2.0官方推荐使用Bazel 0.26.1及以上(但不超过0.29.x),你可以:
- 下载对应版本的Bazel替换当前的0.24.1
- 清理缓存后重新尝试编译
额外提示
你的编译命令里已经添加了不少CPU优化参数,确保你的CPU确实支持这些指令集(比如AVX2、FMA),如果不确定可以通过cat /proc/cpuinfo查看,避免不必要的编译问题。
内容的提问来源于stack exchange,提问作者user2352910
相关产品推荐
相关产品推荐

