PyTorch C++ API#
這些頁面提供了 PyTorch C++ API 公共部分的程式碼文件。該 API 大致可以分為五個部分:
ATen:所有其他部分的基礎,是基礎張量(tensor)和數學運算庫。
Autograd:為 ATen 添加了自動微分功能。
C++ Frontend:用於訓練和評估機器學習模型的高階構造。
TorchScript:與 TorchScript JIT 編譯器和直譯器的介面。
C++ Extensions:透過自定義 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++ Frontend#
PyTorch C++ frontend 提供了一個高階的、純 C++ 的建模介面,用於神經網路和通用的機器學習(ML)研究和生產用例,在設計和提供的功能上很大程度上遵循了 Python API。C++ frontend 包括以下內容:
一種透過分層模組系統定義機器學習模型(類似於
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++ frontend 的更詳細描述,請參閱 本文件。與 C++ Frontend 相關的 torch:: 名稱空間的部分包括 torch::nn、torch::optim、torch::data、torch::serialize、torch::jit 和 torch::python。C++ frontend 的示例可以在 此倉庫 中找到,該倉庫正在持續積極地擴充套件。
注意
除非你有特定原因要嚴格限制自己僅使用 ATen 或 Autograd API,否則 C++ frontend 是 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++ Extensions#
C++ Extensions 提供了一種簡單而強大的方式,用於訪問上述所有介面,以擴充套件 PyTorch 的常規 Python 用例。C++ 擴充套件最常用於在 C++ 或 CUDA 中實現自定義運算子,以加速在標準 PyTorch 設定下的研究。C++ 擴充套件 API 不會為 PyTorch C++ API 新增任何新功能。相反,它提供了與 Python setuptools 以及 JIT 編譯機制的整合,這些機制允許從 Python 訪問 ATen、autograd 和其他 C++ API。要了解更多關於 C++ 擴充套件 API 的資訊,請參閱 本教程。