捷徑

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 應被視為「測試版」穩定性;我們可能會對後端進行重大變更,以改進 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 類別。自動微分系統記錄張量上的操作以形成自動微分圖。在此圖中的葉變數上呼叫 backwards() 會執行透過函數網路和跨越自動微分圖的張量的反向模式微分,最終產生梯度。以下範例提供了此介面的概況

#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 模型的方法;

  • 一個 API,用於定義擴充 TorchScript 標準運算函式庫的自訂運算子;

  • 從 C++ 即時編譯 TorchScript 程式。

如果您希望盡可能在 Python 中定義模型,但隨後將其匯出到 C++ 以用於生產環境和無 Python 的推論,那麼第一種機制可能會引起您的極大興趣。 您可以透過追蹤 連結來了解更多資訊。 第二個 API 關注的是您想要使用自訂運算子擴充 TorchScript 的情況,這些運算子同樣可以序列化並在推論期間從 C++ 呼叫。 最後,可以使用 torch::jit::compile 函數直接從 C++ 存取 TorchScript 編譯器。

C++ 擴充

C++ 擴充提供了一種簡單但強大的方式來存取上述所有介面,以擴充 PyTorch 的常規 Python 使用案例。 C++ 擴充最常用於在 C++ 或 CUDA 中實作自訂運算子,以加速 vanilla PyTorch 設定中的研究。 C++ 擴充 API 不會向 PyTorch C++ API 新增任何新功能。 相反,它提供了與 Python setuptools 的整合以及 JIT 編譯機制,允許從 Python 存取 ATen、autograd 和其他 C++ API。 若要了解有關 C++ 擴充 API 的更多資訊,請閱讀 本教學課程

索引和表格

致謝

這個 PyTorch C++ 世界的文件網站由 Exhale 專案及其維護者 svenevs 大量投入的時間和精力所啟用。 我們感謝 Stephen 的工作以及他為提供 PyTorch C++ 文件所做的努力。

文件

存取 PyTorch 的完整開發人員文件

檢視文件

教學課程

取得初學者和高級開發人員的深入教學課程

檢視教學課程

資源

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

檢視資源