做爲 Facebook 人工智能團隊(FAIR)提供支持的深度學習框架,PyTorch 自 2017 年 1 月推出以來當即成爲了一種流行開發工具。其在調試、編譯等方面的優點使其受到了學界研究者們的廣泛歡迎。這個月月初,Caffe2 代碼併入 PyTorch 的消息也在業界引發熱烈的討論。html
今天,PyTorch 官方在 GitHub 上重磅發佈了 0.4.0 版本,這一次更新從 0.3.1 到 0.4.0 有很是多的改進,最重要的就是, PyTorch 如今正式支持 Windows! 在沒有官方支持前,廣大煉丹師們在 Windows 上安裝 PyTorch 須要藉助其它開發者發佈的第三方 Conda 包,如今官方爲 Python 3.5 和 3.6 提供預編譯的 Conda 二進制文件和 pip wheels。不過 Windows 上的 PyTorch 不支持分佈式訓練,可能比 Linux/OSX 慢一點,由於 Visual Studio 支持較早版本的 OpenMP。git
與往常同樣,你可使用 http://pytorch.org 上的命令在 Windows 上安裝 PyTorch。github
這裏有一個常見問題解答,能夠解答你在 Windows 上可能遇到的大多數問題:windows
http://pytorch.org/docs/stable/notes/windows.html後端
除了 Windows 支持外,0.4.0 版的 PyTorch 還重點權衡了計算中的內存、支持多種機率分佈、優化數據類型和修正張量等。數組
如下爲本次版本更新目錄:安全
Tensor/Variable 合併微信
零維張量網絡
數據類型框架
遷移指南
Tensors:
全面支持高級索引
快速傅立葉變換
神經網絡:
計算時的存儲權衡
bottleneck,識別代碼中熱點(hotspots)的工具
torch.distributions
24 個基礎的機率分佈
增長 cdf、方差、信息熵、困惑度等
分佈式訓練
易於使用的 Launcher utility
NCCL2 後端
C++ 拓展
Windows 支持
ONNX 改進
RNN 支持
爲了幫助老版本用戶更輕鬆地將代碼轉換爲新的 API 和 Style,也爲了吸引更多的新用戶,PyTorch 團隊還編寫了一份遷移指南。AI 前線對該遷移指南完整編譯以下,若是你想要快速升級之前版本的 PyTorch 代碼,請接着往下看!
PyTorch 0.4.0 帶來了不少使人興奮的新特性和一些重要的 Bug 修復,旨在爲用戶提供更好、更乾淨的接口。在這篇升級指南中,咱們將介紹在從舊版本 PyTorch 升級到最新版本時須要作出哪些重要的改動:
Tensor 和 Variable 已合併
支持零維度(標量)Tensor
棄用 volatile 標誌
dtype、device 和 Numpy 風格的 Tensor 建立函數
編寫具備設備無關性的代碼
torch.Tensor 和 torch.autograd.Variable 如今合併到同一個類中。更確切地說,torch.Tensor 可用於跟蹤歷史,並具備與舊 Variable 同樣的行爲。Variable 基本不變,只是返回類型變成了 torch.Tensor。這意味着咱們再也不須要在代碼中使用 Variable 包裝器。
須要注意的是,Tensor 的 type() 沒法反映出數據類型,可以使用 isinstance() 或 x.type() 代替:
requires_grad 是 autograd 的主要標誌,如今變成 Tensor 的一個屬性。以前用於 Variables 的規則一樣適用於 Tensor。只要某個操做的輸入 Tensor 包含了 require_grad=True 時,autograd 就會開始跟蹤歷史記錄。例如:
除了能夠直接設置這個屬性以外,還能夠經過 my_tensor.requires_grad_() 來就地更改這個標誌,或者如上例所示,在建立 Tensor 時將它做爲參數傳遞進去(默認爲 False),例如:
.data 是從 Variable 中獲取底層 Tensor 的主要方式。在合併後,仍然能夠繼續使用 y=x.data 這種方式,它的語義保持不變。因此,y 是一個與 x 共享相同數據的 Tensor,與 x 的計算曆史無關,而且它的 requires_grad 值爲 False。
可是,在某些狀況下,.data 可能不安全。對 x.data 的任何更改都不會被 autograd 跟蹤到,若是在逆推中須要用到 x,那麼計算出的梯度可能不正確。更安全的方法是使用 x.detach(),它會返回一個共享數據的 Tensor(requires_grad=False),但若是在逆推中須要用到 x,autograd 將會跟蹤到它的變化。
以前,索引一個 Tensor 向量(1 維 Tensor)會獲得一個 Python 數字,而索引一個 Variable 向量會獲得(有時候也不必定)一個大小爲(1,)的向量!reduction 函數也存在相似的狀況,例如 tensor.sum() 將返回一個 Python 數字,可是 variable.sum() 會返回一個大小爲(1,)的向量。
幸運的是,新版本適當引入了對標量(0 維 Tensor)的支持!可使用新的 torch.tensor 函數來建立標量(這將在後面更詳細地解釋)。如今咱們能夠作這樣的事情:
以普遍使用的模式 total_loss+=loss.data [0] 爲例,在 0.4.0 以前,損失是一個 Variable,包裝了大小爲(1,)的 Tensor,而在 0.4.0 中,損失是一個零維度的標量。索引標量是沒有意義的(如今會給出一個警告,但在 0.5.0 中將變成一個錯誤)。咱們可使用 loss.item() 從標量中獲取 Python 數字。
請注意,若是在累積損失時未將其轉換爲 Python 數字,可能會消耗大量內存。這是由於上面表達式的右側以前是一個 Python 浮點數,而如今變成了一個零維度的 Tensor。所以,總損失是 Tensor 和它們的梯度歷史累積起來的,這可能會使 autograd 圖保留更長的時間。
volatile 標誌如今已經被棄用。以前,autograd 不會跟蹤任何包含 volatile=True 的 Variable 計算。如今能夠經過一組更靈活的上下文管理器來實現相同的功能,包括 torch.no_grad()、torch.set_grad_enabled(grad_mode)等。
在之前的版本中,咱們須要指定數據類型(float 仍是 double?)、設備類型(cpu 仍是 cuda?)和佈局(dense 仍是 sparse?)做爲「Tensor 類型」。例如,torch.cuda.sparse.DoubleTensor 表示駐存在 CUDA 設備上具備 COO sparse 佈局的 double 數據類型。
在新版本中,咱們引入了 torch.dtype、torch.device 和 torch.layout 類,可經過 NumPy 風格的建立函數更好地管理這些屬性。
torch.dtype
如下是可用的 torch.dtype(數據類型)及其相應 Tensor 類型的完整列表。
如今能夠經過訪問 Tensor 的 dtype 屬性獲取到它的 dtype 數據類型。
torch.device
torch.device 包含設備類型(cpu 或 cuda)和可選的設備序號(id)。它能夠經過 torch.device('{device_type}')或 torch.device('{device_type}:{device_ordinal}')進行初始化。
若是設備序號不存在,則表示是當前設備。例如,torch.device(’cuda')等同於 torch.device('cuda:X'),其中 X 是 torch.cuda.current_device() 返回的結果。
如今能夠經過訪問 Tensor 的 device 屬性獲取它的設備類型。
torch.layout
torch.layout 表示 Tensor 的數據佈局,目前能夠支持 Currentlytorch.strided(密集 Tensor,默認值)和 torch.sparse_coo(具備 COO 格式的稀疏 Tensor)。
如今能夠經過訪問 Tensor 的 layout 屬性獲取它的數據佈局。
如今在建立 Tensor 時還能夠經過指定 Tensor 的 dtype、device、layout 和 requires_grad 選項。例如:
torch.tensor(data, ...)
torch.tensor 是新引入的一個 Tensor 建立方法,將各類數組風格的數據複製到新 Tensor 中。如前所述,torch.tensor 等同於 NumPy 的 numpy.array 構造函數。與 torch*Tensor 建立方法不一樣的是,咱們能夠經過這種方式建立零維度 Tensor(也稱爲標量)。並且,若是沒有給出 dtype 參數,它會推斷出合適的 dtype。在基於已有數據(如 Python 列表)建立 Tensor 時,咱們推薦使用這種方法。例如:
咱們還添加了更多建立 Tensor 的方法,其中一些還具備 torch.*_like 和 tensor.new_ * 的變種。
1.torch.*_like 接收 Tensor 做爲輸入,而不是 shape。 除非另有說明,不然它默認返回一個與輸入 Tensor 具備相同屬性的 Tensor:
2.tensor.new_ * 也能夠用於建立與 tensor 具備相同屬性的 Tensor,但它須要一個 shape 輸入參數:
在大多數狀況下,若是要指定 shape,可使用元組(例如 torch.zeros((2,3)))或可變參數(例如 torch.zeros(2,3))。
在以前的版本中,編寫具備設備無關性的代碼十分困難(設備無關性是指在不須要作出修改的狀況下可同時運行在 CUDA 和 CPU 設備上)。
PyTorch 0.4.0 經過兩種方式實現了設備無關性:
經過 device 屬性得到全部 Tensor 的 torch.device(get_device 僅適用於 CUDA Tensor)
Tensor 和 Module 的 to 方法可用於將對象輕鬆移動到不一樣的設備(而沒必要調用 cpu() 或 cuda())
咱們推薦如下這種方式:
爲了瞭解 0.4.0 的總體變化,咱們經過常見代碼的示例來比較 0.3.1 和 0.4.0 的不一樣:
0.3.1(舊版本)
0.4.0(新版本)
遷移指南原文:
http://pytorch.org/2018/04/22/0_4_0-migration-guide.html
關於新版本的更多更新細節,請參考 PyTorch 的 GitHub 頁面:
https://github.com/pytorch/pytorch/releases/tag/v0.4.0