PyTorch C++ API#

這些頁面提供了 PyTorch C++ API 公共部分的文件。此 API 大致可分為五個部分

  • ATen:作為所有其他元件基礎的張量和數學運算庫。

  • Autograd:透過自動微分增強 ATen。

  • C++ 前端:用於訓練和評估機器學習模型的高階結構。

  • TorchScript:TorchScript JIT 編譯器和直譯器的介面。

  • C++ 擴充套件:用於使用自定義 C++ 和 CUDA 例程擴充套件 Python API 的方法。

這些構建塊結合起來,形成了一個可用於研究和生產的 C++ 庫,用於張量計算和動態神經網路,並重點強調 GPU 加速和快速 CPU 效能。它目前正在 Facebook 的研究和生產中被使用;我們期待著更多 PyTorch C++ API 使用者加入。

警告

目前,C++ API 應被視為處於“beta”穩定性;我們可能會對後端進行重大突破性更改以改進 API,或為了提供 PyTorch 的 Python 介面,這是我們最穩定且支援最好的介面。

ATen#

ATen 本質上是一個張量庫,PyTorch 中幾乎所有其他 Python 和 C++ 介面都構建在其之上。它提供了一個核心的 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 中增強 ATen Tensor 類自動微分能力的功能。autograd 系統記錄張量上的操作以形成一個 autograd 圖。在此圖中的葉子變數上呼叫 backwards() 會透過跨越 autograd 圖的函式和張量網路執行反向模式微分,最終得到梯度。以下示例展示了該介面的用法

#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() will now hold the gradient of c w.r.t. a.

ATen 中的 at::Tensor 類預設不可微分。要新增 autograd API 提供的張量可微分性,您必須使用 torch:: 名稱空間中的張量工廠函式,而不是 at:: 名稱空間中的函式。例如,使用 at::ones 建立的張量不可微分,而使用 torch::ones 建立的張量則可微分。

C++ 前端#

PyTorch C++ 前端提供了一個高階的、純 C++ 模型介面,用於神經網路和通用 ML (機器學習) 的研究和生產用例,其設計和提供的功能很大程度上遵循了 Python API。C++ 前端包含以下內容

  • 透過分層模組系統(如 torch.nn.Module)定義機器學習模型的介面;

  • 一個預先存在的模組“標準庫”,用於最常見的模型目的(例如,卷積、RNN、批歸一化等);

  • 一個最佳化器 API,包括 SGD、Adam、RMSprop 等常用最佳化器的實現;

  • 一種表示資料集和資料管道的方法,包括在多個 CPU 核心上並行載入資料的功能;

  • 一種序列化格式,用於儲存和載入訓練會話的檢查點(如 torch.utils.data.DataLoader);

  • 模型到多個 GPU 的自動並行化(如 torch.nn.parallel.DataParallel);

  • 支援使用 pybind11 輕鬆將 C++ 模型繫結到 Python 的程式碼;

  • TorchScript JIT 編譯器的入口點;

  • 有助於與 ATen 和 Autograd API 互動的實用工具。

有關 C++ 前端的更詳細描述,請參閱此文件。與 C++ 前端相關的 torch:: 名稱空間部分包括 torch::nntorch::optimtorch::datatorch::serializetorch::jittorch::python。C++ 前端的示例可以在此儲存庫中找到,該儲存庫正在持續積極地擴充套件。

注意

除非您有特殊原因需要僅限於使用 ATen 或 Autograd API,否則 C++ 前端是 PyTorch C++ 生態系統的推薦入口點。雖然它仍處於 beta 階段,我們正在收集使用者反饋(包括您的!),但與 ATen 和 Autograd API 相比,它提供了更多功能和更好的穩定性保證。

TorchScript#

TorchScript 是 PyTorch 模型的一種表示形式,可以被 TorchScript 編譯器理解、編譯和序列化。從根本上說,TorchScript 是一種獨立的程式語言。它是使用 PyTorch API 的 Python 子集。TorchScript 的 C++ 介面包含三個主要功能

  • 載入和執行在 Python 中定義的序列化 TorchScript 模型的功能;

  • 一個用於定義擴充套件 TorchScript 標準操作庫的自定義運算子的 API;

  • 從 C++ 進行 TorchScript 程式的即時編譯 (JIT)。

如果您想盡可能在 Python 中定義模型,然後將其匯出到 C++ 用於生產環境和無 Python 推理,那麼第一個機制可能會讓您非常感興趣。您可以按照此連結瞭解更多資訊。第二個 API 涉及您希望使用自定義運算子擴充套件 TorchScript 的場景,這些運算子同樣可以在推理期間從 C++ 序列化和呼叫。最後,torch::jit::compile 函式可用於直接從 C++ 訪問 TorchScript 編譯器。

C++ 擴充套件#

C++ 擴充套件提供了一種簡單而強大的方式來訪問上述所有介面,以便擴充套件 PyTorch 的常規 Python 用例。C++ 擴充套件最常用於在 C++ 或 CUDA 中實現自定義運算子,以加速普通 PyTorch 配置中的研究。C++ 擴充套件 API 不會為 PyTorch C++ API 新增任何新功能。相反,它提供了與 Python setuptools 的整合以及 JIT 編譯機制,允許從 Python 訪問 ATen、autograd 和其他 C++ API。要了解有關 C++ 擴充套件 API 的更多資訊,請參閱本教程

索引和表格#

致謝#

PyTorch C++ 領域的此文件網站得益於 Exhale 專案及其維護者 svenevs 的慷慨時間和精力投入。我們感謝 Stephen 的工作以及他在 PyTorch C++ 文件方面提供的幫助。