重磅 | PyTorch 0.4.0和官方升級指南,支持Windows

策劃編輯|Natalie
編譯|無明
來源 | PyTorch 官網
AI 前線導讀: 今天,PyTorch 官方在 GitHub 上發佈了 0.4.0 版本,新版本作了很是多的改進,其中最重要的改進就是終於官方支持 Windows 系統了!另外還有一個大福利,爲了幫助舊版本用戶更快地升級到新版本,PyTorch 官方撰寫了一份代碼遷移指南,AI 前線對這份遷移指南進行了全文編譯,若是你正在使用舊版本的 PyTorch 並想要馬上升級到最新版本,千萬不要錯過!

更多幹貨內容請關注微信公衆號「AI 前線」,(ID:ai-front)

做爲 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 支持

PyTorch 官方遷移指南

爲了幫助老版本用戶更輕鬆地將代碼轉換爲新的 API 和 Style,也爲了吸引更多的新用戶,PyTorch 團隊還編寫了一份遷移指南。AI 前線對該遷移指南完整編譯以下,若是你想要快速升級之前版本的 PyTorch 代碼,請接着往下看!

PyTorch 0.4.0 帶來了不少使人興奮的新特性和一些重要的 Bug 修復,旨在爲用戶提供更好、更乾淨的接口。在這篇升級指南中,咱們將介紹在從舊版本 PyTorch 升級到最新版本時須要作出哪些重要的改動:

  • Tensor 和 Variable 已合併

  • 支持零維度(標量)Tensor

  • 棄用 volatile 標誌

  • dtype、device 和 Numpy 風格的 Tensor 建立函數

  • 編寫具備設備無關性的代碼

合併 Tensor 和 Variable

torch.Tensor 和 torch.autograd.Variable 如今合併到同一個類中。更確切地說,torch.Tensor 可用於跟蹤歷史,並具備與舊 Variable 同樣的行爲。Variable 基本不變,只是返回類型變成了 torch.Tensor。這意味着咱們再也不須要在代碼中使用 Variable 包裝器。

Tensor 的 type() 發生變化

須要注意的是,Tensor 的 type() 沒法反映出數據類型,可以使用 isinstance() 或 x.type() 代替:

autograd 如今何時跟蹤歷史記錄?

requires_grad 是 autograd 的主要標誌,如今變成 Tensor 的一個屬性。以前用於 Variables 的規則一樣適用於 Tensor。只要某個操做的輸入 Tensor 包含了 require_grad=True 時,autograd 就會開始跟蹤歷史記錄。例如:

requires_grad 標誌

除了能夠直接設置這個屬性以外,還能夠經過 my_tensor.requires_grad_() 來就地更改這個標誌,或者如上例所示,在建立 Tensor 時將它做爲參數傳遞進去(默認爲 False),例如:

.data 的變化

.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

以前,索引一個 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 標誌

volatile 標誌如今已經被棄用。以前,autograd 不會跟蹤任何包含 volatile=True 的 Variable 計算。如今能夠經過一組更靈活的上下文管理器來實現相同的功能,包括 torch.no_grad()、torch.set_grad_enabled(grad_mode)等。

dtype、device 和 NumPy 風格的建立函數

在之前的版本中,咱們須要指定數據類型(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 時還能夠經過指定 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


更多幹貨內容請關注微信公衆號「AI 前線」,(ID:ai-front)
相關文章
相關標籤/搜索