PyTorch1.5更新發布,與Python配合使用的C ++前端API奇偶校驗

PyTorch團隊發佈

今天,我們宣佈PyTorch 1.5以及新的和更新的庫的可用性。此版本包括幾個主要的新API添加和改進。PyTorch現在包括對C ++前端的重大更新,用於計算機視覺模型的“通道最後”存儲格式,以及用於模型並行訓練的分佈式RPC框架的穩定版本。該發行版還提供了針對粗麻布和雅各布派的autograd的新API,以及一個允許創建受pybind啟發的Custom C ++類的API。

PyTorch1.5更新發布,與Python配合使用的C ++前端API奇偶校驗

你可以在下面的鏈接中找到詳細的發行說明:
https://github.com/pytorch/pytorch/releases

C ++前端API(穩定)

現在,C ++前端API與Python相當,並且總體功能已移至“穩定”狀態(以前標記為實驗性)。一些主要亮點包括:

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

COMPUTER VISION模型的“ CHANNELS LAST”存儲格式(實驗性)

“最後使用通道”的內存佈局釋放了使用高效性能卷積算法和硬件(NVIDIA的Tensor Core,FBGEMM,QNNPACK)的能力。此外,它被設計為通過運算符自動傳播,從而允許在內存佈局之間輕鬆切換。

在此處瞭解更多有關如何編寫內存格式感知運算符的信息。

自定義C ++類(實驗性)

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

<code>template 
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_>("myclasses", "MyStackClass")
      .def(torch::init>())
      .def("push", &MyStackClass::push)
      .def("pop", &MyStackClass::pop)
      .def("size", [](const c10::intrusive_ptr& self) {
        return self->stack_.size();
      });
/<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>

您可以在這裡的教程中嘗試一下。
https://pytorch.org/tutorials/recipes/recipes/torsh_script_custom_classes.html

分佈式RPC框架API(現在穩定)

分佈式RPC框架在1.4版本中以實驗性形式啟動,該提議是將分佈式RPC框架標記為穩定且不再具有實驗性。這項工作涉及許多增強功能和錯誤修復,以使分佈式RPC框架總體上更可靠和更健壯,並添加了兩個新功能,包括概要分析支持,在RPC中使用TorchScript函數以及多項易於使用的增強功能。以下是框架內各種API的概述:

RPC API

RPC API允許用戶指定要在遠程節點上運行的函數和要實例化的對象。這些功能被透明記錄,因此可以使用Distributed Autograd通過遠程需求反向傳播梯度。

分佈式Autograd

分佈式Autograd連接跨多個節點的autograd圖,並允許在向後傳遞過程中流經漸變。漸變被累積到一個上下文中(與Autograd中的.grad字段相反),用戶必須在with dist_autograd.context()管理器下指定其模型的前向傳遞,以確保正確記錄所有RPC通信。當前,僅實現FAST模式(有關FAST和SMART模式之間的差異,請參見
https://pytorch.org/docs/stable/notes/distributed_autograd.html#smart-mode-algorithm)。

分佈式優化器

分佈式優化器使用需要漸變的參數在每個工作器上為優化器創建RRef,然後使用RPC API遠程運行優化器。用戶必須收集所有遠程參數並將它們包裝在中RRef,因為這是對分佈式優化器的必需輸入。用戶還必須指定分佈式自動梯度,context_id以便優化器知道在哪個上下文中尋找梯度。

在此處瞭解有關分佈式RPC框架API的更多信息。

新的高級AUTOGRAD API(實驗性)

PyTorch 1.5為torch.autograd.functional子模塊帶來了新功能,包括jacobian,hessian,jvp,vjp,hvp和vhp 。此功能建立在當前API的基礎上,並允許用戶輕鬆執行這些功能。

不再支持PYTHON 2

從PyTorch 1.5.0開始,我們將不再支持Python 2,特別是2.7版。今後,對Python的支持將僅限於Python 3,特別是Python 3.5、3.6、3.7和3.8(在PyTorch 1.4.0中首次啟用)。

感謝整個PyTorch團隊和社區為這項工作做出的所有貢獻。


分享到:


相關文章: