Python深度學習框架PyTorch迎來重大更新

pythontab發表於2017-12-08

最近比較熱門的PyTorch是使用GPU和CPU優化的深度學習框架。Theano、TensorFlow、Torch、MXNet 再到近日比較熱門的 PyTorch 等等,深度學習框架之間的比較一直以來都是非常受人關注的熱點話題。

2017 年初,Facebook 在機器學習和科學計算工具 Torch 的基礎上,針對 Python 語言釋出了一個全新的機器學習工具包 PyTorch。一經發布,這款開源工具包就受到廣泛關注和討論,經過幾個月的發展,目前 PyTorch 已經成為從業者最重要的研發工具之一。

Python深度學習框架PyTorch迎來重大更新

經過將近一年的發展,日前,迎來了 PyTorch 0.3.0 版本。

根據官方文件的介紹,此次增加了多個函式和功能,多方面的效能均實現提升。

重大變更

0.3 版本中刪掉了 Variable.reinforce() 等隨機函式,因為它們的功能有限,並且會影響到效能。設定隨機函式的初衷是為了避免取樣值的 book-keeping,在實際中,由於各種各樣的原因,使用者的程式碼中仍然會包括 book-keeping。他們引入了 torch.distributions 包來代替隨機函式。

之前的程式碼如下:

probs = policy_network(state)
action = probs.multinomial()
next_state, reward = env.step(action)
action.reinforce(reward)
action.backward()

現在的程式碼如下:

probs = policy_network(state)
# NOTE: categorical is equivalent to what used to be called multinomial
m = torch.distributions.Categorical(probs)
action = m.sample()
next_state, reward = env.step(action)
loss = -m.log_prob(action) * reward
loss.backward()

新的功能

1、目前,有些損失函式能直接計算 mini-batch 中每個 sample 的損失值。

2、構建了一個 in-built Profiler,能對模型進行瓶頸分析,這個 Profiler 同時支援 CPU 和 CUDA 模型。

3、增加 Higher order gradients 模組

支援如下層:

ConvTranspose, AvgPool1d, AvgPool2d, LPPool2d, AvgPool3d, MaxPool1d, MaxPool2d, AdaptiveMaxPool, AdaptiveAvgPool, FractionalMaxPool2d, MaxUnpool1d, MaxUnpool2d, nn.Upsample, ReplicationPad2d, ReplicationPad3d, ReflectionPad2d

PReLU, HardTanh, L1Loss, SoftSign, ELU, RReLU, Hardshrink, Softplus, SoftShrink, LogSigmoid, Softmin, GLU

MSELoss, SmoothL1Loss, KLDivLoss, HingeEmbeddingLoss, SoftMarginLoss, MarginRankingLoss, CrossEntropyLoss

DataParallel

4、優化器

optim.SparseAdam:能實現適用於稀疏張量的簡單亞當演算法

優化器中增加了 add_param_group 函式,能在構建好的優化器中增加新的引數組。

除此之外,還增加了新的張量函式和功能,在新版本中,能通過 ONNX 將模型遷移到其他框架上。另外,在加速方面,重寫 gpu kernel 之後,softmax 和 log_softmax 的速度能實現 4-256 倍的提升;在分散式 AllReduce 中,能實現 2.5-3 倍的效能提升;torch.norm 函式的 backward 能實現 1.5 倍的加速;pack_padded_sequence 的效能也有提升。

PyTorch優缺點

優勢:

它屬於輕量級;

它目前位於 Python 中;

它使你能夠明確地控制計算。沒有編譯器能自己妄圖變聰明來「幫助你」,或是將你的程式碼加速;事實上大多編譯器在除錯中會產生大量麻煩;

它使 GPU 核心呼叫之上僅有少量(可解釋的)抽象層,而這恰恰是高效能的保證;

也許這是個人偏好,但我得到了與抽象有關的特定 OCD。每當我要做艱鉅的工作時都會很緊張,因為一旦我的未來被洩漏,我便能感覺到它那些無法擺脫且難以忍受的痛苦。相對簡單的事情理應在引擎蓋之下發生的大多數情況下,這種感覺尤為強烈;

除錯更容易,因為特定程式碼中會是特定行(而不是在距離使用大型或生成的 Graph 物件的 sess.run()很遠的地方)失敗。你的堆疊跟蹤不會填滿三個螢幕來讓你玩「找找錯誤在哪裡!」的豎版卷軸遊戲;

不存在編譯時間。我無法理解 Theano 使用者是如何處理的,他們一定更有耐心;

你可以直接操作漸變,顯然,做一些事情時可以更容易,也更自然(如在反向傳播過程中的漸變剪輯,或各種「破碎的反向傳播」的有關想法,就像最近的 Shake Shake reg 命令一樣;的確,我認為你可以用 stop_gradient 破解一個解決方案);

它對動態圖的支援從一開始就是自上而下的設計原則,而非隨之而至的事後想法。並且我們會看到更多的動態圖表,如做成一大塊 NLP,或是神經模組網 ;

它沒有縮排或膨脹你的程式碼的顯式會話物件;

它獲得的抽象是正確的:raw numpy - > Tensors(但 GPU 上的 raw numpy 可能對深度學習一無所知!)- >變數(它們瞭解深度學習),並且 Modules 或 Optim 等等會稍有益處。

動態計算使很多事情更加容易,如 seq2seq + attention 的神經翻譯很難通過 keras + tf 來實現,但使用 PyTorch 便會很容易;

更容易除錯,因為你可以只使用標準的 PyThon 工具;

PyTorch 讓自定義的實現更加容易,所以你得以將更多時間專注於演算法中,這樣往往能夠改進主要效能;

使 Multi-gpu 簡單易懂;

Torch-vision 使載入和變換影像變得容易。

PyTorch 提供了一個強化功能。增強功能基本上不會在實現中產生過多資源消耗,能有一些內建函式來呼叫 RL 的感覺真棒。

我遇到的錯誤或問題得到PyTorch 團隊及時的反映,通常會在當天修復,或者得到解決方法或得到問題跟蹤。

PyTorch 是可以立即使用的,在我當前的專案的單 GPU 的訓練時間比 theano+lasagne 快 100%。我測試過,100% 逐字地在 CIFAR100 上從(在最簡單的情況下)5 分/曆元到 2.5 分/曆元,並且在某些情況下降到 2 分鐘/曆元(即,快兩倍)

缺點:

PyTorch 的 API感覺有些粗糙,但對它有一些限定詞。如果你只是做一些標準的任務(實現 ResNet 或者 VGG)我認為你不會有問題,但我一直都有一些分歧因為我所做的一切都有些奇怪。

對於 PyTorch 我最大的「抱怨」基本上是在神經網路 API 方面「事情並未按照我讓他們組合的方式進行放置」。具體來說,我非常喜歡 Lasagne 的「層次(layers)」正規化—但是一點點批判性的思維就會讓你得出這個結論,這個正規化尤其不適合動態圖框架。

PyTorch 沒有為部署設計,開發團隊它看上去並沒有把重心放在 PyTorch 上(雖然在這方面,我可能看錯了,我模糊的記得我在論壇的帖子上看到過這個)。我想要練習將一些東西放置在網站或者 droid app 上我不確定其他的框架能很好地支援這種方式。


相關文章