PyTorch C ++ API

2020-09-11 11:25 更新
原文: https://pytorch.org/cppdocs/

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

  • ATen :所有其他基礎都建立在其上的基礎張量和數(shù)學運算庫;
  • Autograd :具有自動微分的增強 ATen;
  • C ++前端:用于訓練和評估機器學習模型的高級構造;
  • TorchScript :TorchScript JIT 編譯器和解釋器的接口;
  • C ++擴展:一種使用自定義 C ++和 CUDA 例程擴展 Python API 的方法。

這些構建模塊一起構成了一個可用于張量計算和動態(tài)神經(jīng)網(wǎng)絡的研究和生產(chǎn)就緒的 C ++庫,其中特別強調(diào) GPU 加速以及快速的 CPU 性能。 目前,F(xiàn)acebook 正在研究和生產(chǎn)中使用它。 我們期待歡迎更多的 PyTorch C ++ API 用戶。

警告

目前,應將 C ++ API 視為“測試版”穩(wěn)定性。 我們可能會對后端進行重大更改,以改進 API,或者在為 PyTorch 提供 Python 接口(這是我們最穩(wěn)定和最受支持的接口)時使用。

en

ATen 從根本上講是一個張量庫,在 PyTorch 中幾乎所有其他 Python 和 C ++接口都在其上構建。 它提供了一個核心Tensor類,在該類上定義了數(shù)百種操作。 這些操作大多數(shù)都具有 CPU 和 GPU 實現(xiàn),Tensor類將根據(jù)其類型向其動態(tài)調(diào)度。 使用 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 是 PyTorch C ++ API 的一部分,這些部分通過涉及自動區(qū)分的功能擴展了 ATen Tensor類。 autograd 系統(tǒng)在張量上記錄操作,以形成 autograd 圖。 在該圖中的葉變量上調(diào)用backwards(),可通過跨越 autograd 圖的函數(shù)和張量網(wǎng)絡執(zhí)行反向模式微分,最終產(chǎn)生梯度。 以下示例提供了該界面的外觀:

#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類不可區(qū)分。 若要增加 autograd API 提供的張量的可微性,必須使用 <cite>torch ::</cite> 命名空間中的張量工廠函數(shù),而不是位于::: 命名空間中的<cite>。 例如,使用<cite>在:: ones</cite> 創(chuàng)建的張量將是不可微的,而使用 <cite>Torch :: ones</cite> 創(chuàng)建的張量將是可微的。</cite>

C ++前端

PyTorch C ++前端為神經(jīng)網(wǎng)絡以及一般的機器學習研究和生產(chǎn)用例提供了一個高級的純 C ++建模接口,在設計和提供的功能上很大程度上遵循了 Python API。 C ++前端包括以下內(nèi)容:

  • 通過分層模塊系統(tǒng)(例如torch.nn.Module)定義機器學習模型的接口;
  • 用于最常見建模目的的預先存在模塊的“標準庫”(例如卷積,RNN,批處理規(guī)范化等);
  • 優(yōu)化 API,包括流行的優(yōu)化器(例如 SGD,Adam,RMSprop 等)的實現(xiàn);
  • 一種表示數(shù)據(jù)集和數(shù)據(jù)管道的方法,包括在許多 CPU 內(nèi)核上并行加載數(shù)據(jù)的功能;
  • 用于存儲和加載訓練檢查點的序列化格式(例如torch.utils.data.DataLoader);
  • 將模型自動并行化到多個 GPU(例如torch.nn.parallel.DataParallel);
  • 支持代碼,可以使用 pybind11 輕松將 C ++模型綁定到 Python;
  • 入口指向 TorchScript JIT 編譯器;
  • 有用的實用程序,可促進與 ATen 和 Autograd API 的接口。

有關 C ++前端的詳細說明,請參見本文檔的。 與 C ++前端相關的 <cite>torch ::</cite> 命名空間的相關部分包括 torch :: nn ,  torch :: optim 和 [torch :: data  , torch :: serialize , torch :: jit 和 torch :: python 。 C ++前端的示例可以在該存儲庫的中找到,該存儲庫正在持續(xù)不斷地擴展。

注意

除非有特殊原因要專門限制自己使用 ATen 或 Autograd API,否則 C ++前端是 PyTorch C ++生態(tài)系統(tǒng)的推薦入口點。 盡管它仍處于測試階段,因為我們收集了您的用戶反饋,但與 ATen 和 Autograd API 相比,它提供了更多的功能和更好的穩(wěn)定性保證。

torch腳本

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

  • 一種用于加載和執(zhí)行 Python 中定義的序列化 TorchScript 模型的機制;
  • 用于定義自定義運算符的 API,用于擴展 TorchScript 標準運算庫;
  • 從 C ++實時編譯 TorchScript 程序。

如果您想盡可能地在 Python 中定義模型,但是隨后將它們導出到 C ++進行生產(chǎn)環(huán)境和無 Python 推斷,第一種機制可能對您很感興趣。 您可以通過以下鏈接找到有關此內(nèi)容的更多信息。 第二個 API 涉及您想使用自定義運算符擴展 TorchScript 的場景,可以類似地在推理過程中從 C ++對其進行序列化和調(diào)用。 最后,torch :: jit :: compile 函數(shù)可用于直接從 C ++訪問 TorchScript 編譯器。

C ++擴展

C ++擴展提供了一種簡單而強大的方法來訪問上述所有接口,以擴展 PyTorch 的常規(guī) Python 用例。 C ++擴展最常用于在 C ++或 CUDA 中實現(xiàn)自定義運算符,以加快對原始 PyTorch 設置的研究。 C ++擴展 API 不會向 PyTorch C ++ API 添加任何新功能。 相反,它提供了與 Python setuptool 以及 JIT 編譯機制的集成,該機制允許從 Python 訪問 ATen,autograd 和其他 C ++ API。 


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號