如何使用Bazel保存TensorFlow源码编译进度
解决Docker容器内Bazel编译TensorFlow的持久化缓存问题
你遇到的问题核心是Bazel默认缓存仅存在容器内部,容器销毁或重启后缓存丢失;之前用--disk_cache未生效,大概率是路径配置或Docker挂载逻辑有误。以下是可行的解决方法:
方案1:正确配置磁盘缓存并挂载本地目录
Bazel的--disk_cache需要指向容器内的一个路径,同时要将本地主机的目录挂载到该容器路径,确保缓存持久化到本地而非容器内部。
步骤:
- 在本地主机创建缓存目录,比如
~/bazel-tf-cache
- 在本地主机创建缓存目录,比如
- 启动Docker容器时,通过
-v参数将本地目录挂载到容器内的指定路径(如/bazel-cache)
- 启动Docker容器时,通过
- 编译时指定
--disk_cache路径,同时确保动作缓存未被禁用
- 编译时指定
示例命令:
# 本地创建缓存目录 mkdir -p ~/bazel-tf-cache # 启动容器并挂载目录(替换为你使用的TensorFlow编译镜像) docker run -it -v ~/bazel-tf-cache:/bazel-cache -v /本地TF源码路径:/tensorflow tensorflow/build:latest bash # 容器内执行编译 bazel build //tensorflow/tools/pip_package:build_pip_package --disk_cache=/bazel-cache
方案2:指定Bazel全局输出根目录
Bazel的默认输出目录(bazel-*)位于项目工作目录下,若未挂载到本地,容器销毁后输出文件和缓存都会丢失。使用--output_user_root可以指定全局输出根目录,将所有编译产物、缓存统一存储到该路径,再通过Docker挂载本地目录到该路径。
示例:
# 本地创建输出根目录 mkdir -p ~/bazel-tf-output # 启动容器并挂载目录 docker run -it -v ~/bazel-tf-output:/bazel-output -v /本地TF源码路径:/tensorflow tensorflow/build:latest bash # 编译时指定输出根目录 bazel build //tensorflow/tools/pip_package:build_pip_package --output_user_root=/bazel-output
方案3:通过Bazel配置文件默认启用持久化缓存
在容器内的~/.bazelrc或TensorFlow项目根目录的.bazelrc中添加配置,避免每次编译手动输入参数:
build --disk_cache=/bazel-cache build --output_user_root=/bazel-output
注意要确保/bazel-cache和/bazel-output是挂载自本地主机的目录。
排查之前--disk_cache失效的原因
- 未将容器内的缓存路径挂载到本地主机,容器销毁后缓存被清除
- 多次编译使用了不同的容器实例,未复用之前的缓存目录
- 编译时意外设置了
--nouse_disk_cache或--nouse_action_cache参数,禁用了缓存功能
内容的提问来源于stack exchange,提问作者George Vasilakopoulos
相关产品推荐
相关产品推荐

