PyTorch C++ API libtorch 簡介
翻譯自 PyTorch 官方文檔:https://pytorch.org/cppdocs/index.html#acknowledgements
整體劃分
根據 PyTorch 官方文檔 的介紹,PyTorch的C++ API可以粗略分為以下五個部分:
- ATen:基礎的張量和數學計算庫,其他的部分都以此為基礎。
- Autograd:多 ATen 的擴展,包含自動微分功能。
- C++ Frontend:用于訓練和驗證機器學習模型的高層架構。
- TorchScript:TorchScipt JIT 編譯器 / 解釋器的接口。
- C++ Extensions:一系列使用 C++ 和 CUDA 例程擴展 Python API 的方法。
ATen
ATen 是一個基礎的張量庫,幾乎所有 PyTorch 中的 Python 和 C++ 接口的以此為基礎。ATen 提供了一個核心的 Tensor
類,并定義了它的幾百種操作。大部分這些操作既可以在 CPU 上進行,也可以在 GPU 上進行。Tensor
類可以根據其類型動態地調度它們。一個 ATen 的小例子:
#include <ATen/ATen.h>at::Tensor a = at::ones({2, 2}, at::kInt);
at::Tensor b = at::randn({2, 2});
auto c = a + b.to(at::kInt);
Tensor
類在 ATen 中所有其他的符號都可以在 at::
命名空間中,可參考文檔。
Autograd
Autograd 是 PyTorch 的 C++ API 的一部分,它通過增加自動求導功能擴展增強了 Tensor
類。自動求導系統記錄了 Tensor 的操作來形成一張自動求導圖。并在該圖的葉節點上調用 backward()
通過跨越圖中的函數和張量網絡執行反向模式微分,最終產生梯度。以下是一個示例:
#include <torch/csrc/autograd/variable.h>
#include <torch/csrc/autograd/function.h>torch::Tensor a = torch::ones({2, 2}, torch::requires_grad());
torch::Tensor b = torch::randn({2, 2});
auto c = a + b;
c.backward(); // a.grad()將會保存c關于a的導數
ATen 中的類 at::Tensor
默認是不可微的。要添加 Autograd API 提供的張量的可微性,要使用torch::
命名空間而不是 at::
命名空間的張量工廠函數。也就是說,使用 at::ones
創建的張量是不可微的,但使用torch::ones
創建的張量是可微的。
C++ Frontend
PyTorch C++ 前端為神經網絡和通用 ML(機器學習)研究和生產用例提供了一個高級的純 C++ 建模接口,在設計和提供的功能上很大程度上與 Python API 保持一致。C++ 前端包括以下內容:
- 通過多層模塊系統(如
torch.nn.Module
)定義機器學習模型的接口; - 一些已有模塊的的常見的建模方法(例如卷積、RNN、BN等)的“標準庫”;
- 優化器 API,包括流行優化器的實現,如 SGD、Adam、RMSprop 等;
- 一系列表示數據集和數據處理管道的方法,包括在多個 CPU 內核上并行加載數據的功能;
- 用于保存和加載訓練會話 checkpoint 的序列化格式(如
torch.utils.data.DataLoader
); - 將模型自動并行化到多個 GPU(如
torch.nn.parallel.DataParallel
); - 支持使用pybind11輕松將C++模型綁定到Python的代碼;
- TorchScript JIT 編譯器的入口點;
- 有助于與 ATen 和 Autograd API 接口的有用實用程序。
有關C++ 前端的更詳細說明,可參閱此文檔。 與 C++ 前端相關的torch::命名空間的相關部分包括torch::nn、 torch::optim、 torch::data、 torch::serialize、 torch::jit 和torch::python。C++ 前端的示例可以在此存儲庫中找到,該存儲庫正在持續且積極地擴展。
一般不推薦用 ATen 和 Autograd,除非有定制化的需求,否則建議直接使用更穩定的 C++ 前端。
TorchScript
TorchScript 是一種 PyTorch 模型的表示,可以被 TorchScript 編譯器理解、編譯和序列化。從根本上說,TorchScript 本身就是一種編程語言。它是使用 PyTorch API 的 Python 子集。TorchScript 的 C++ 接口包含三個主要功能:
- 一種在 Python 中定義的用于加載和執行序列化 TorchScript 模型的機制;
- 用于定義擴展 TorchScript 標準操作庫的自定義操作符的 API;
- 從 C++ 實時編譯 TorchScript 程序。
如果您想盡可能在 Python 中定義模型,但隨后將它們導出到 C++ 以用于生產環境和非 Python 推理,則第一種機制可能對您很感興趣。您可以通過此鏈接了解更多信息。第二個 API 涉及您希望使用自定義算子擴展 TorchScript 的場景,這些算子同樣可以在推理期間從 C++ 序列化和調用。最后,torch::jit::compile 函數可用于直接從 C++ 訪問 TorchScript 編譯器。
C++ Extension
C++ Extension 提供了一種訪問上述所有接口的簡單而強大的方法,目的是擴展 PyTorch 的常規 Python 用例。C++ 擴展最常用于在 C++ 或 CUDA 中實現自定義算子。C++ 擴展 API 沒有向 PyTorch C++ API 添加任何新功能。而是提供了與 Python setuptools 的集成以及允許從 Python 訪問 ATen、Autograd 和其他 C++ API 的 JIT 編譯機制來進行自定義擴展。要了解有關 C++ 擴展 API 的更多信息,請閱讀 本教程。
Ref:
https://pytorch.org/cppdocs/index.html#acknowledgements