• 文件 >
  • 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 pin 可以透過將此儲存庫指向不同的修訂版本來更新。可以根據需要新增修補程式。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 專案的個別開發人員,只需指定 --config=remote_cache 標記給 bazel,並且將使用預設 --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 映像:應用程式預設憑證 在那裡完成工作,並以服務帳戶身分進行驗證。所有帳戶 (使用者和服務帳戶) 都需要具有遠端快取讀取/寫入權限。

遠端快取使用快取儲存區。每個唯一的機器和建置都應指定唯一的儲存區金鑰,以從一致的快取中受益。可以使用標記傳遞儲存區金鑰:-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 pin 時,第一次每個金鑰也會稍微慢一些,然後在下次更新之前會再次非常快。

執行測試

目前 C++ 程式碼由 bazel 建置和測試。Python 程式碼將在未來遷移。

Bazel 也是一個測試平台,可以輕鬆執行測試

bazel test //test/cpp:main

當然,XLA 和 PJRT 設定必須存在於環境中才能執行測試。並非所有環境變數都傳遞到 bazel 測試環境中,以確保遠端快取未命中不會太常見 (環境是快取金鑰的一部分),請參閱 .bazelrc 測試設定以查看哪些變數已傳遞,並根據需要新增變數。

您也可以使用輔助指令碼執行測試

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 的完整開發者文件

查看文件

教學

取得初學者和進階開發人員的深入教學

查看教學

資源

尋找開發資源並獲得問題解答

查看資源