使用Bazel编译TensorFlow时报错gcc: internal compiler error: Killed (program cc1plus)
问题原因
gcc: internal compiler error: Killed (program cc1plus) 绝大多数场景下是编译进程被系统OOM(内存溢出)杀手强制终止导致的,属于内存资源不足触发的系统保护机制。你虽然已经添加了Bazel资源限制参数,但依然存在两点问题:
- 你设置的
local_ram_resources=HOST_RAM*.5预留的内存不足以支撑LLVM等大模块的编译需求,单个LLVM编译单元的峰值内存占用可达到4~8G,若机器总内存偏低、或者有其他进程占用内存,依然会触发OOM。 - Bazel的资源限制是全局配额,不会限制单个编译进程的内存占用,你报错的LLVM CodeGen模块本身内存需求较高,峰值超过剩余可用内存时依然会被系统杀掉。
解决方法
- 收紧Bazel并行任务数和资源配额
直接指定固定并行数替代动态CPU/内存计算,比如限制同时最多跑2个编译任务,内存配额调整为总内存的30%:
如果仍然报错,可以把env BAZEL_LINKOPTS=-static-libstdc++:-static-libgcc BAZEL_LINKLIBS=-l%:libstdc++.a:-lm BAZEL_CXXOPTS="-std=c++17" bazel build -c opt --verbose_failures //tensorflow:libtensorflow_cc.so --action_env="LD_LIBRARY_PATH=${LD_LIBRARY_PATH}" --jobs=2 --local_ram_resources=HOST_RAM*.3 --local_cpu_resources=2--jobs参数改为1,完全串行编译,虽然速度较慢但内存占用最低。 - 添加交换分区兜底
若机器未开启swap或者swap空间偏小,可临时添加4~8G交换文件,避免直接触发OOM杀进程:
编译完成后可手动关闭删除swap文件释放空间:# 创建4G交换文件 sudo fallocate -l 4G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfilesudo swapoff /swapfile sudo rm /swapfile - 升级GCC版本
GCC 7.x版本编译C++17代码的内存优化较差,升级到GCC 9及以上版本可显著降低编译时内存占用,同时可规避大量旧版本编译器的已知BUG。 - 清理内存占用进程
编译前关闭浏览器、IDE、其他后台服务等内存占用较高的进程,保证编译阶段可用内存充足。
内容的提问来源于stack exchange,提问作者Er g Ch
相关产品推荐
相关产品推荐

