PyTorch團隊發布
今天,我們宣布PyTorch 1.5以及新的和更新的庫的可用性。此版本包括幾個主要的新API添加和改進。PyTorch現在包括對C ++前端的重大更新,用於計算機視覺模型的「通道最後」存儲格式,以及用於模型並行訓練的分布式RPC框架的穩定版本。該發行版還提供了針對粗麻布和雅各布派的autograd的新API,以及一個允許創建受pybind啟發的Custom 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 ++綁定示例:
template <class T>
struct MyStackClass : torch::CustomClassHolder {
std::vector<T> stack_;
MyStackClass(std::vector<T> 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<std::string>>("myclasses", "MyStackClass")
.def(torch::init<std::vector<std::string>>())
.def("push", &MyStackClass<std::string>::push)
.def("pop", &MyStackClass<std::string>::pop)
.def("size", [](const c10::intrusive_ptr<MyStackClass>& self) {
return self->stack_.size();
});
它公開了可以在Python和TorchScript中使用的類,如下所示:
@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"]
您可以在這裡的教程中嘗試一下。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團隊和社區為這項工作做出的所有貢獻。