基于Bzlmod的C++项目引入TensorFlow作为Bazel依赖的问题
问题:Bzlmod模式下配置TensorFlow C++依赖(Mac环境)
我正在启动一个依赖TensorFlow的新C项目,希望通过GitHub导入TensorFlow,避免每个环境手动构建。使用Bazel+Bzlmod管理依赖,但找不到适配的文档。从Java/Node转来,对C构建不熟悉,尝试模仿TensorFlow Serving的配置无效,在CLion同步Bazel时遇到以下错误:
error loading package '@@org_tensorflow~//tensorflow/core': Unable to find package for @@[unknown repo 'local_config_cuda' requested from @@org_tensorflow~]//cuda:build_defs.bzl: The repository '@@[unknown repo 'local_config_cuda' requested from @@org_tensorflow~]' could not be resolved: No repository visible as '@local_config_cuda' from repository '@@org_tensorflow~'. and referenced by '//src/main:my_project_main'
使用MacBook,推测是缺少CUDA组件,需要实现根据操作系统自动开关CUDA(生产环境启用,Mac禁用)。同时不确定C++代码中使用tf.Tensor()、tf.float()等基础类时,应该依赖TensorFlow的哪个Bazel目标。
当前项目配置结构
registry/ modules/ org_tensorflow/ 2.15.1/ MODULE.bazel source.json metadata.json bazel_registry.json src/ main/ BUILD.bazel main.cc .bazelrc MODULE.bazel WORKSPACE.bazel
registry已正确配置GitHub归档地址,可正常拉取文件。
.bazelrc 配置
# Enable Bzlmod for every Bazel command common --enable_bzlmod --registry=https://bcr.bazel.build --registry=file://%workspace%/registry --experimental_repo_remote_exec
MODULE.bazel 配置
module( name = "my_project", repo_name = "my_project", ) bazel_dep(name = "bazel_skylib", version = "1.6.1") bazel_dep(name = "rules_java", version = "7.5.0") bazel_dep(name = "rules_python", version = "0.31.0") bazel_dep(name = "org_tensorflow", version = "2.15.1")
WORKSPACE.bazel 配置
load("@rules_python//python:repositories.bzl", "py_repositories", "python_register_toolchains") py_repositories() python_register_toolchains( name = "python", ignore_root_user_error = True, python_version = "3.9", ) load("@python//:defs.bzl", "interpreter") load("@rules_python//python:pip.bzl", "package_annotation", "pip_parse") NUMPY_ANNOTATIONS = { "numpy": package_annotation( additive_build_content = """\ filegroup( name = "includes", srcs = glob(["site-packages/numpy/core/include/**/*.h"]), ) cc_library( name = "numpy_headers", hdrs = [":includes"], strip_include_prefix="site-packages/numpy/core/include/", ) """, ), } pip_parse( name = "pypi", annotations = NUMPY_ANNOTATIONS, python_interpreter_target = interpreter, requirements_lock = "@org_tensorflow//:requirements_lock_3_9.txt", ) load("@pypi//:requirements.bzl", "install_deps") install_deps() load("@org_tensorflow//tensorflow:workspace3.bzl", "tf_workspace3") tf_workspace3() load("@org_tensorflow//tensorflow:workspace2.bzl", "tf_workspace2") tf_workspace2() load("@org_tensorflow//tensorflow:workspace1.bzl", "tf_workspace1") tf_workspace1() load("@org_tensorflow//tensorflow:workspace0.bzl", "tf_workspace0") tf_workspace0()
src/main/BUILD.bazel 配置
cc_binary( name = "my_project_main", srcs = [ "main.cc", ], deps = [ "@org_tensorflow//tensorflow/core:tensorflow", ], )
更新说明
已创建公开仓库,调整配置后仍出现相同错误。尝试在模块扩展中运行TensorFlow的Python配置文件,但扩展未执行(print日志无输出)。
解决方案
1. 修复CUDA依赖问题(Mac环境禁用CUDA)
在.bazelrc中添加平台条件,自动禁用Mac上的CUDA:
# 针对Mac平台禁用CUDA build:macos --define=tf_cuda_enable=0 build:macos --define=tf_rocm_enable=0 build:macos --host_force_python=PY3 # 自动识别Mac平台 common --config=macos:darwin
2. 适配Bzlmod的TensorFlow配置
Bzlmod模式下,WORKSPACE中的tf_workspace*调用会和模块系统冲突,需要改用TensorFlow的模块扩展来配置依赖:
- 修改
MODULE.bazel,添加TensorFlow的模块扩展:
module( name = "my_project", repo_name = "my_project", ) bazel_dep(name = "bazel_skylib", version = "1.6.1") bazel_dep(name = "rules_python", version = "0.31.0") # 加载TensorFlow的模块扩展 load("@org_tensorflow//tensorflow:module_extension.bzl", "tensorflow_module_extension") tensorflow_module_extension( name = "tensorflow", version = "2.15.1", # 禁用CUDA(Mac环境),生产环境可改为True enable_cuda = False, )
- 删除WORKSPACE中所有
tf_workspace*相关代码,避免和Bzlmod冲突。
3. 确保Python依赖正确配置
在MODULE.bazel中添加Python工具链的模块配置,替代WORKSPACE中的python_register_toolchains:
python.toolchain( name = "python", python_version = "3.9", )
正确的依赖目标选择
- 若使用
tf.Tensor()、tf.float()等基础核心类,依赖目标应为@org_tensorflow//tensorflow/core:framework,这个目标包含了TensorFlow核心框架的所有基础类型和API。 @org_tensorflow//tensorflow/core:lib是底层工具库,不包含Tensor等核心类,适合仅使用基础工具函数的场景。@org_tensorflow//tensorflow/core:tensorflow是更完整的目标,但包含了较多非必要组件,会增加构建时间。
内容的提问来源于stack exchange,提问作者Lucien Perouze
相关产品推荐
相关产品推荐

