最近比較熱門的PyTorch是使用GPU和CPU優化的深度學習框架。Theano、TensorFlow、Torch、MXNet 再到近日比較熱門的 PyTorch 等等,深度學習框架之間的比較一直以來都是非常受人關注的熱點話題。
2017 年初,Facebook 在機器學習和科學計算工具 Torch 的基礎上,針對 Python 語言釋出了一個全新的機器學習工具包 PyTorch。一經發布,這款開源工具包就受到廣泛關注和討論,經過幾個月的發展,目前 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 上我不確定其他的框架能很好地支援這種方式。