PyTorch C++ API libtorch 简介
PyTorch C++ API libtorch 簡(jiǎn)介
翻譯自 PyTorch 官方文檔:https://pytorch.org/cppdocs/index.html#acknowledgements
整體劃分
根據(jù) PyTorch 官方文檔 的介紹,PyTorch的C++ API可以粗略分為以下五個(gè)部分:
- ATen:基礎(chǔ)的張量和數(shù)學(xué)計(jì)算庫(kù),其他的部分都以此為基礎(chǔ)。
- Autograd:多 ATen 的擴(kuò)展,包含自動(dòng)微分功能。
- C++ Frontend:用于訓(xùn)練和驗(yàn)證機(jī)器學(xué)習(xí)模型的高層架構(gòu)。
- TorchScript:TorchScipt JIT 編譯器 / 解釋器的接口。
- C++ Extensions:一系列使用 C++ 和 CUDA 例程擴(kuò)展 Python API 的方法。
ATen
ATen 是一個(gè)基礎(chǔ)的張量庫(kù),幾乎所有 PyTorch 中的 Python 和 C++ 接口的以此為基礎(chǔ)。ATen 提供了一個(gè)核心的 Tensor 類,并定義了它的幾百種操作。大部分這些操作既可以在 CPU 上進(jìn)行,也可以在 GPU 上進(jìn)行。Tensor 類可以根據(jù)其類型動(dòng)態(tài)地調(diào)度它們。一個(gè) 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 中所有其他的符號(hào)都可以在 at:: 命名空間中,可參考文檔。
Autograd
Autograd 是 PyTorch 的 C++ API 的一部分,它通過增加自動(dòng)求導(dǎo)功能擴(kuò)展增強(qiáng)了 Tensor 類。自動(dòng)求導(dǎo)系統(tǒng)記錄了 Tensor 的操作來(lái)形成一張自動(dòng)求導(dǎo)圖。并在該圖的葉節(jié)點(diǎn)上調(diào)用 backward() 通過跨越圖中的函數(shù)和張量網(wǎng)絡(luò)執(zhí)行反向模式微分,最終產(chǎn)生梯度。以下是一個(gè)示例:
#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()將會(huì)保存c關(guān)于a的導(dǎo)數(shù)ATen 中的類 at::Tensor 默認(rèn)是不可微的。要添加 Autograd API 提供的張量的可微性,要使用torch:: 命名空間而不是 at:: 命名空間的張量工廠函數(shù)。也就是說,使用 at::ones 創(chuàng)建的張量是不可微的,但使用torch::ones 創(chuàng)建的張量是可微的。
C++ Frontend
PyTorch C++ 前端為神經(jīng)網(wǎng)絡(luò)和通用 ML(機(jī)器學(xué)習(xí))研究和生產(chǎn)用例提供了一個(gè)高級(jí)的純 C++ 建模接口,在設(shè)計(jì)和提供的功能上很大程度上與 Python API 保持一致。C++ 前端包括以下內(nèi)容:
- 通過多層模塊系統(tǒng)(如torch.nn.Module)定義機(jī)器學(xué)習(xí)模型的接口;
- 一些已有模塊的的常見的建模方法(例如卷積、RNN、BN等)的“標(biāo)準(zhǔn)庫(kù)”;
- 優(yōu)化器 API,包括流行優(yōu)化器的實(shí)現(xiàn),如 SGD、Adam、RMSprop 等;
- 一系列表示數(shù)據(jù)集和數(shù)據(jù)處理管道的方法,包括在多個(gè) CPU 內(nèi)核上并行加載數(shù)據(jù)的功能;
- 用于保存和加載訓(xùn)練會(huì)話 checkpoint 的序列化格式(如torch.utils.data.DataLoader);
- 將模型自動(dòng)并行化到多個(gè) GPU(如torch.nn.parallel.DataParallel);
- 支持使用pybind11輕松將C++模型綁定到Python的代碼;
- TorchScript JIT 編譯器的入口點(diǎn);
- 有助于與 ATen 和 Autograd API 接口的有用實(shí)用程序。
有關(guān)C++ 前端的更詳細(xì)說明,可參閱此文檔。 與 C++ 前端相關(guān)的torch::命名空間的相關(guān)部分包括torch::nn、 torch::optim、 torch::data、 torch::serialize、 torch::jit 和torch::python。C++ 前端的示例可以在此存儲(chǔ)庫(kù)中找到,該存儲(chǔ)庫(kù)正在持續(xù)且積極地?cái)U(kuò)展。
一般不推薦用 ATen 和 Autograd,除非有定制化的需求,否則建議直接使用更穩(wěn)定的 C++ 前端。
TorchScript
TorchScript 是一種 PyTorch 模型的表示,可以被 TorchScript 編譯器理解、編譯和序列化。從根本上說,TorchScript 本身就是一種編程語(yǔ)言。它是使用 PyTorch API 的 Python 子集。TorchScript 的 C++ 接口包含三個(gè)主要功能:
- 一種在 Python 中定義的用于加載和執(zhí)行序列化 TorchScript 模型的機(jī)制;
- 用于定義擴(kuò)展 TorchScript 標(biāo)準(zhǔn)操作庫(kù)的自定義操作符的 API;
- 從 C++ 實(shí)時(shí)編譯 TorchScript 程序。
如果您想盡可能在 Python 中定義模型,但隨后將它們導(dǎo)出到 C++ 以用于生產(chǎn)環(huán)境和非 Python 推理,則第一種機(jī)制可能對(duì)您很感興趣。您可以通過此鏈接了解更多信息。第二個(gè) API 涉及您希望使用自定義算子擴(kuò)展 TorchScript 的場(chǎng)景,這些算子同樣可以在推理期間從 C++ 序列化和調(diào)用。最后,torch::jit::compile 函數(shù)可用于直接從 C++ 訪問 TorchScript 編譯器。
C++ Extension
C++ Extension 提供了一種訪問上述所有接口的簡(jiǎn)單而強(qiáng)大的方法,目的是擴(kuò)展 PyTorch 的常規(guī) Python 用例。C++ 擴(kuò)展最常用于在 C++ 或 CUDA 中實(shí)現(xiàn)自定義算子。C++ 擴(kuò)展 API 沒有向 PyTorch C++ API 添加任何新功能。而是提供了與 Python setuptools 的集成以及允許從 Python 訪問 ATen、Autograd 和其他 C++ API 的 JIT 編譯機(jī)制來(lái)進(jìn)行自定義擴(kuò)展。要了解有關(guān) C++ 擴(kuò)展 API 的更多信息,請(qǐng)閱讀 本教程。
Ref:
https://pytorch.org/cppdocs/index.html#acknowledgements
總結(jié)
以上是生活随笔為你收集整理的PyTorch C++ API libtorch 简介的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微星系统怎么进bios 微星系统如何进入
- 下一篇: 11年xp怎么u盘启动不了 11年XP无