PyTorch 1.5 發佈,C++ 前端重大更新、引入新存儲格式提高性能

PyTorch 1.5 發佈了,此版本包括新增加了幾個主要的 API 和一些改進、對 C++ 前端有重大更新、用於計算機視覺模型的“通道維持(channels last)”存儲格式,以及用於模型並行訓練的分佈式 RPC 框架的穩定版本。

同時,此版本還提供了針對 hessian 和 jacobian 的 autograd 的新 API,以及一個受 pybind 啟發的允許創建 Custom C++ Class(定製類)的 API。

PyTorch 1.5 發佈,C++ 前端重大更新、引入新存儲格式提高性能

C++ FRONTEND API (STABLE)

之前被標記為實驗性質的 C++ 前端 API 現在已經與 Python 地位相當,並且總體特性已移至“穩定”狀態。一些主要亮點包括:

  • 現在覆蓋率達到約 100%,並提供有關 C++ torch::nn 模塊/函數的文檔,開發者可以輕鬆地將其模型從 Python API 轉換為 C++ API。
  • C++ 中的優化器與 Python 中的有所不同:C++ 優化器不能將參數組作為輸入,而 Python 可以。此外,步驟函數的實現也不完全相同。在 1.5 版本中,C++ 優化器的行為將始終與 Python 等效器相同。
  • C++ 中缺少張量多維度索引 API 是一個眾所周知的問題,並在 PyTorch GitHub issue 跟蹤器和論壇中引起了很多討論。以前的解決方法是結合使用 arrow/select/index_select/masked_select,與 Python API 的優雅張量 [:, 0, ..., mask] 語法相比,它比較笨拙且容易出錯。在 1.5 版本中,開發者可以使用 tensor.index({Slice(), 0, “...”, mask}) 達到相同的目的。

‘CHANNELS LAST’ MEMORY FORMAT FOR COMPUTER VISION MODELS (EXPERIMENTAL)

用於計算機視覺模型的“通道維持(channels last)”存儲格式,目前處於實驗階段。該格式的內存佈局可以充分發揮性能高效的卷積算法和硬件(NVIDIA 的 Tensor Core、FBGEMM、QNNPACK)的能力。此外,它被設計為通過運算符自動傳播,從而允許在內存佈局之間輕鬆切換。

CUSTOM C++ CLASSES (EXPERIMENTAL)

此版本添加了一個新的 API torch.CutomClassHolder,用於將自定義 C++ 類同時綁定到 TorchScript 和 Python,該 API 的語法與 pybind11 幾乎相同。它允許開發者向 TorchScript 類型系統和運行時系統暴露其 C++ 類及其方法,以便他們可以實例化和操作 TorchScript/Python 中的任意 C++ 對象。C++ 綁定示例:

<code>template <class>
struct MyStackClass : torch::CustomClassHolder {
std::vector stack_;
MyStackClass(std::vector init) : stack_(std::move(init)) {}

void push(T x) {
stack_.push_back(x);
}
T pop() {
auto val = stack_.back();
stack_.pop_back();
return val;
}
};

static auto testStack =
torch::class_<mystackclass>>("myclasses", "MyStackClass")
.def(torch::init<:vector>>())
.def("push", &MyStackClass<:string>::push)
.def("pop", &MyStackClass<:string>::pop)
.def("size", [](const c10::intrusive_ptr<mystackclass>& self) {
return self->stack_.size();
});/<mystackclass>/<mystackclass>
/<class>/<code>

它暴露了可以在 Python 和 TorchScript 中使用的類,如下所示:

<code>@torch.jit.script
def do_stacks(s : torch.classes.myclasses.MyStackClass):
s2 = torch.classes.myclasses.MyStackClass(["hi", "mom"])
print(s2.pop()) # "mom"
s2.push("foobar")
return s2 # ["hi", "foobar"]/<code>

DISTRIBUTED RPC FRAMEWORK APIS (NOW STABLE)

分佈式 RPC 框架在 1.4 版本中以實驗性形式出現,現在它已經處於穩定狀態。此過程涉及許多增強功能和 bug 修復,以使分佈式 RPC 框架總體上更可靠和更健壯。同時還添加了兩個新特性,包括概要分析支持,在 RPC 中使用 TorchScript 函數以及一些易於使用的增強功能。

此外,從 1.5 開始,PyTorch 不再支持 Python 2,今後,對 Python 的支持將僅限於 Python 3,特別是 Python 3.5、3.6、3.7 和 3.8。

更多具體的細節見發佈公告:

https://pytorch.org/blog/pytorch-1-dot-5-released-with-new-and-updated-apis


分享到:


相關文章: