• 文档 >
  • Pytorch/XLA 中的 Bazel
快捷方式

Pytorch/XLA 中的 Bazel

Bazel 是一个用于自动化构建和测试软件的免费软件工具。TensorFlowOpenXLA 都使用它,这使得它也非常适合 PyTorch/XLA。

Bazel 依赖项

Tensorflow 是 PyTorch/XLA 的一个 bazel 外部依赖项,这可以在 WORKSPACE 文件中看到

WORKSPACE

http_archive(
    name = "org_tensorflow",
    strip_prefix = "tensorflow-f7759359f8420d3ca7b9fd19493f2a01bd47b4ef",
    urls = [
        "https://github.com/tensorflow/tensorflow/archive/f7759359f8420d3ca7b9fd19493f2a01bd47b4ef.tar.gz",
    ],
)

可以通过将此仓库指向不同的修订版本来更新 TensorFlow 版本。可以根据需要添加补丁。Bazel 将解析依赖项,准备代码并以密封方式对其进行修补。

对于 PyTorch,部署了不同的依赖项机制,因为使用了本地 PyTorch 检出,并且必须从源代码 built 此本地检出,并理想情况下安装在系统上以实现版本兼容性(例如,PyTorch/XLA 中的代码生成使用 torchgen python 模块,该模块应安装在系统中)。

本地目录可以在 bazel/dependencies.bzl 中设置,也可以在命令行上覆盖

bazel build --override_repository=org_tensorflow=/path/to/exported/tf_repo //...
bazel build --override_repository=torch=/path/to/exported/and/built/torch_repo //...

请确保覆盖的仓库位于适当的修订版本中,并且对于 torch,已使用 USE_CUDA=0 python setup.py bdist_wheel 构建,以确保所有预期的构建对象都存在;理想情况下安装到系统中。

WORKSPACE

new_local_repository(
    name = "torch",
    build_file = "//bazel:torch.BUILD",
    path = PYTORCH_LOCAL_DIR,
)

PyTorch 标头直接从 torch 依赖项(PyTorch 的本地检出)中获取。共享库(例如,libtorch.so)来自代码已构建且 build/lib/ 包含构建对象的同一本地检出。为了使其工作,需要将 -isystemexternal/torch 传递给编译器,以便它可以找到 system 库并从本地检出中满足它们。一些作为 <system> 包含,一些作为 "user" 标头包含。

Bazel 引入 pybind11 嵌入式 python 并链接到它,以使用此机制向插件提供 libpython。Python 标头也从那里获取,而不是依赖于系统版本。这些从 "@pybind11//:pybind11_embed" 中满足,它为与 libpython 传递链接设置编译器选项。

如何构建 XLA 库

构建库很简单

bazel build //torch_xla/csrc/runtime/...

Bazel 通过 .bazelrc 配置,但它也可以在命令行上接受标志。

bazel build --config=remote_cache //torch_xla/csrc/runtime/...

remote_cache 配置使用 gcloud 进行缓存,通常更快,但需要使用 gcloud 进行身份验证。 有关配置,请参见 .bazelrc

使用 bazel 可以轻松表达复杂的依赖关系,并且通过使用相同的方式表达所有内容来获得巨大的收益。因此,无需像以前那样将 XLA 库与插件的其余部分分开构建,构建整个仓库或链接其他所有内容的插件共享对象就足够了。

如何构建 Torch/XLA 插件

可以通过调用标准 python setup.py bdist_wheel 来实现正常构建,但可以使用以下命令简单地构建 C++ 绑定:

bazel build //:_XLAC.so

这将构建 XLA 客户端和 PyTorch 插件,并将它们全部链接在一起。 这在测试更改时可能很有用,以便能够编译 C++ 代码,而无需构建 python 插件以实现更快的迭代周期。

远程缓存

Bazel 内置 远程缓存。可以使用很多缓存后端;我们在 (GCS)[https://bazel.build/remote/caching#cloud-storage] 上部署缓存。 您可以在 .bazelrc 的配置名称 remote_cache 下看到配置。

默认情况下禁用远程缓存,但由于它可以大幅加快增量构建速度,因此几乎总是建议使用它,并且默认情况下在 CI 自动化和 Cloud Build 中启用它。

要在机器上进行身份验证,请确保您拥有以下凭据:

gcloud auth application-default login --no-launch-browser

使用 remote_cache 配置设置的远程缓存需要使用 GCP 进行身份验证。 有多种使用 GCP 进行身份验证的方法。 对于有权访问开发 GCP 项目的个人开发者,只需为 bazel 指定 --config=remote_cache 标志,默认的 --google_default_credentials 将被使用,如果 gcloud 令牌存在于机器上,它将开箱即用,使用登录用户进行身份验证。 用户需要在 GCP 中具有远程构建权限(将新开发者添加到 Remote Bazel 角色)。 在 CI 中,服务帐户密钥用于身份验证,并通过 --config=remote_cache --google_credentials=path/to/service.key 传递给 bazel。 在 Cloud Build 上,docker build --network=cloudbuild 用于将身份验证从运行云构建的服务帐户传递到执行编译的 docker 镜像中:应用程序默认凭据 在那里完成工作并作为服务帐户进行身份验证。 所有帐户(包括用户帐户和服务帐户)都需要具有远程缓存读/写权限。

远程缓存使用缓存 silo。 每个唯一的机器和构建都应指定唯一的 silo 密钥,以从一致的缓存中受益。 可以使用标志传递 silo 密钥:-remote_default_exec_properties=cache-silo-key=SOME_SILO_KEY'

使用远程缓存运行构建

BAZEL_REMOTE_CACHE=1 SILO_NAME="cache-silo-YOUR-USER" TPUVM_MODE=1 python setup.py bdist_wheel

添加

GCLOUD_SERVICE_KEY_FILE=~/.config/gcloud/application_default_credentials.json

如果 bazel 找不到身份验证令牌,则可能也有帮助。

此处的 YOUR-USER 可以是作者的用户名或机器名,这是一个唯一的名称,可确保良好的缓存行为。 其他 setup.py 功能也按预期工作(例如 develop)。

首次使用新的缓存密钥编译代码时会很慢,因为它将从头开始编译所有内容,但是增量编译将非常快。 在更新 TensorFlow 版本时,每个密钥的第一次也会稍微慢一些,然后直到下一次更新之前,速度又会很快。

运行测试

当前,C++ 代码由 bazel 构建和测试。 Python 代码将在未来迁移。

Bazel 也是一个测试平台,可以轻松运行测试

bazel test //test/cpp:main

当然,XLA 和 PJRT 配置必须存在于环境中才能运行测试。 并非所有环境变量都传递到 bazel 测试环境中,以确保远程缓存未命中不会太常见(环境是缓存密钥的一部分),请参见 .bazelrc 测试配置以查看哪些环境变量已传入,并根据需要添加新的环境变量。

您也可以使用 helper 脚本运行测试

BAZEL_REMOTE_CACHE=1 SILO_NAME="cache-silo-YOUR-USER" ./test/cpp/run_tests.sh -R

xla_client 测试是纯粹的密封测试,可以轻松执行。 torch_xla 插件测试更复杂:它们需要安装 torchtorch_xla,并且它们无法并行运行,因为它们在同一端口上使用 XRT 服务器/客户端,或者因为它们使用 GPU 或 TPU 设备,而一次只有一个可用。 因此,torch_xla/csrc/ 下的所有测试都捆绑到一个目标 :main 中,该目标按顺序运行所有测试。

代码覆盖率

运行测试时,计算代码覆盖率可能很有用。

bazel coverage //torch_xla/csrc/runtime/...

代码覆盖率可以使用 lcov 进行可视化,如 Bazel 的文档 中所述。您也可以在您选择的编辑器中使用 lcov 插件进行可视化,例如 VSCode 的 Coverage Gutters 插件。

语言服务器

Bazel 可以驱动像 clangd 这样的语言服务器,为您的编辑器带来代码引用、自动补全和对底层代码的语义理解。对于 VSCode,可以使用 Bazel Stack,它可以与 Visual Studio clangd 扩展 功能结合使用,从而为代码编辑提供强大的辅助功能。

构建 PyTorch/XLA

与往常一样,PyTorch/XLA 可以使用 Python distutils 构建

BAZEL_REMOTE_CACHE=1 SILO_NAME="cache-silo-YOUR-USER" TPUVM_MODE=1 python setup.py bdist_wheel

文档

访问 PyTorch 的综合开发者文档

查看文档

教程

获取面向初学者和高级开发者的深入教程

查看教程

资源

查找开发资源并解答您的问题

查看资源