XLA 如何用 Bazel 从源码构建并配置 CUDA 后端?
【免费下载链接】tensorflowAn Open Source Machine Learning Framework for Everyone项目地址: https://gitcode.com/GitHub_Trending/te/tensorflow
XLA(Accelerated Linear Algebra)是 TensorFlow 仓库中以独立仓库形式内置的机器学习编译器,源码位于third_party/xla/目录下。如果你的任务是修改编译器本身、调试 XLA 集成,或者需要一个带 CUDA 后端可执行文件(例如hlo_runner_main)的开发环境,就需要从源码构建 XLA 的 GPU 目标。本文基于仓库内的 build_from_source.md 与 developer_guide.md,给出在 Linux 上用 Bazel 构建 XLA 并配置 CUDA 后端(--backend=CUDA)的完整操作路径,包括无 GPU 机器上交叉构建的方法。
开始前先明确适用前提:
- 文档中所有命令都假定你在 XLA 仓库根目录(独立 checkout 的
xla/目录,即本仓库中的third_party/xla/)执行,./configure.py、bazel build均以该目录为起点; - 构建依赖 Bazel。推荐的安装方式是通过 Bazelisk 自动下载 XLA 要求的 Bazel 版本;Bazelisk 不可用时再手动安装 Bazel。Bazel 版本由仓库根目录的
.bazelversion文件声明(third_party/xla/.bazelversion),仓库已启用 bzlmod(见 third_party/xla/.bazelrc 中的common --enable_bzlmod --noenable_workspace); - GPU 构建依赖 Docker(推荐路径),且镜像
us-docker.pkg.dev/ml-oss-artifacts-published/ml-public-container/ml-build:latest已预装 Clang 18——这正是 XLA 在 CI 中使用的编译器版本。
启动 ml-build 容器并让容器访问 GPU
文档推荐直接用 XLA CI 使用的 ml-build 镜像。启动容器并授予全部 GPU 访问权限:
docker run -itd --rm \ --gpus all \ --name xla_gpu \ -w /xla \ -v $PWD:/xla \ us-docker.pkg.dev/ml-oss-artifacts-published/ml-public-container/ml-build:latest \ bash这条命令的副作用说明:它创建一个名为xla_gpu的容器并把当前目录挂载为/xla(-v $PWD:/xla,请在本机 XLA 仓库根目录执行);--gpus all让容器内可自动探测 CUDA compute capabilities,因此需要宿主机装有 NVIDIA 驱动且 GPU 可用。如果你后续要改用 CPU 配置构建,用的是不带--gpus all的普通容器(文档中容器名为xla)。
配置 CUDA 后端
在容器内运行配置脚本,指定 CUDA 后端:
docker exec xla_gpu ./configure.py --backend=CUDA./configure.py(实际脚本为 build_tools/configure/configure.py,仓库根目录的入口是它的符号链接)负责把编译器路径、CUDA 版本、compute capabilities 等信息写入仓库中的xla_configure.bazelrc,再由 Bazel 加载(third_party/xla/.bazelrc 最后一行try-import %workspace%/xla_configure.bazelrc)。配置时的关键行为:
- 带 GPU 的机器上,compute capabilities 通过
nvidia-smi --query-gpu=compute_cap自动探测; - 不带 GPU 的机器上探测必然失败,此时必须手动传参,文档给出的示例:
docker exec xla_gpu ./configure.py --backend=CUDA \ --cuda_compute_capabilities="9.0"同时不要在启动容器时使用--gpus all。文档中的"9.0"只是示例值,应按你目标 GPU 的实际 compute capability 替换,不能照抄。
脚本还支持若干可选参数(详见 configure.py 的参数定义):--cuda_version/--cudnn_version设置后由 Bazel 下载对应版本;--local_cuda_path/--local_cudnn_path/--local_nccl_path指向本机目录;--cuda_compiler可选nvcc(默认)或clang;--nccl开启后不加nonccl配置,否则生成的 bazelrc 默认包含build --config nonccl,即不含 NCCL。
执行 Bazel 构建
配置完成后构建全部 XLA 目标:
docker exec xla_gpu bazel build \ --spawn_strategy=sandboxed \ --test_output=all \ //xla/...--spawn_strategy=sandboxed指定 Bazel 的动作执行沙箱策略;--test_output=all使测试输出完整打印。文档明确提示:首次构建耗时很长,因为要构建整条技术栈,包括 XLA、MLIR 和 StableHLO——构建期间没有输出不代表卡死,耐心等待即可。
构建以 Bazel 的成功结论收尾即为完成:所有//xla/...目标编译、链接通过,输出 Bazel 的 "Build completed successfully"。注意这条命令构建的是全部目标,不是某个单独的二进制;如果你的最终目的是某个具体产物(如hlo_runner_main),可直接只构建该目标(见下文 JAX 容器路径中的示例)。
可选路径:不用 Docker 直接构建 CUDA
文档说明,得益于 hermetic CUDA rules,可以在不装 Docker 的情况下直接在本机构建 XLA 的 GPU 目标——即使这台机器没有 GPU、没有 NVIDIA 驱动:
./configure.py --backend=CUDA bazel build \ --spawn_strategy=sandboxed \ --test_output=all \ //xla/...无 GPU 时同样要手动指定 compute capabilities:
./configure.py --backend=CUDA --cuda_compute_capabilities="9.0"文档同时说明:不走 Docker 构建 XLA 目标需要本机安装 Clang(CI 使用 Clang 18,更早版本"should also work",原文未承诺全部旧版本兼容)。另外在 Linux 上 CUDA 后端属于 hermetic 构建,编译器默认走rules_ml_toolchain提供的 hermetic Clang 18,./configure.py会在找不到本地 Clang 时按 hermetic 工具链处理(见 configure.py 中is_hermetic_build与 hermetic 版本逻辑)。
可选路径:在 JAX CI 容器内构建 XLA 的 CUDA 目标
如果你的目标是让 XLA 目标的构建配置与 JAX/XLA 发行版保持一致(例如用 XLA 工具复现 JAX 中产生的 workload),build_from_source.md 给出了基于 JAX CI/Release 容器的完整流程:
- 克隆 JAX 仓库并进入
jax目录,运行./ci/utilities/run_docker_container.sh启动名为jax的容器(该脚本属于 JAX 仓库,不在本仓库内); - 容器内构建
jax-cuda-plugin目标:docker exec jax ./ci/build_artifacts.sh jax-cuda-plugin,此步骤会生成带 CUDA/cuDNN 支持所需的构建配置(.jax_configure.bazelrc); - 进入容器交互 shell:
docker exec -ti jax /bin/bash(此时位于容器内/jax目录); - 构建 XLA 目标,文档给出的示例目标:
/usr/local/bin/bazel build \ --config=cuda_libraries_from_stubs \ --verbose_failures=true \ @xla//xla/tools/multihost_hlo_runner:hlo_runner_main需要覆盖 hermetic 环境变量时追加,例如--repo_env=HERMETIC_CUDA_COMPUTE_CAPABILITIES="sm_90";
- 产物拷回宿主机:
cp bazel-bin/external/xla/xla/tools/multihost_hlo_runner/hlo_runner_main ./dist/,然后exit退出容器。
这条路径的产物是hlo_runner_main可执行文件,可用于运行 HLO workload。
验证与已知限制
文档没有给出独立的构建后检查命令,验证方式就是 Bazel 构建本身://xla/...(或你指定的目标)全部编译链接成功,且带--test_output=all时相关测试输出打印完整。构建失败时优先看 Bazel 报告的最后一条 action 错误;--verbose_failures=true(JAX 容器路径中已带上)会给出更详细的失败信息。
已知限制,均来自源文档:
- 无 GPU 机器:可以构建 CUDA 目标,但启动容器时不能带
--gpus all,且./configure.py阶段必须手动传--cuda_compute_capabilities; - Windows 不支持直接构建 CUDA:文档明确 XLA 在 Windows 上原生构建是 CPU-only 的,需要 CUDA 支持必须使用 WSL2;
- 首次构建耗时:整栈(XLA、MLIR、StableHLO)从零构建,时间显著,这是预期行为而非故障;
- 仓库内的 third_party/xla/README.md 提醒:如果你只是用 XLA 编译 PyTorch / TensorFlow / JAX 项目,不需要克隆并构建此仓库,构建文档面向 XLA 贡献者和集成调试者。
需要继续深入了解构建产物用途(如 multihost hlo runner)时,可参考 tools_multihost_hlo_runner.md;构建环境的完整准备(克隆代码、Bazelisk 安装、Docker 配置)见 developer_guide.md。
【免费下载链接】tensorflowAn Open Source Machine Learning Framework for Everyone项目地址: https://gitcode.com/GitHub_Trending/te/tensorflow
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考