1. 程式人生 > 實用技巧 >將PyTorch投入生產的5個常見錯誤

將PyTorch投入生產的5個常見錯誤

公眾號關注 “程式設計師遇見GitHub”

設為“星標”,重磅乾貨,第一時間送達。


作者:Taras Matsyk

轉載:Ai公園

導讀

本文列舉了5個將PyTorch應用到生產時容易遇到的5個錯誤操作。

ML是有趣的,ML是受歡迎的,ML無處不在。大多數公司要麼使用TensorFlow,要麼使用PyTorch,還有些老傢伙喜歡Caffe。

儘管大多數教程和線上教程使用TensofFlow,但我的大部分經驗都是使用PyTorch。在這裡,我想分享在生產中使用PyTorch最常見的5個錯誤。考慮過使用CPU嗎?使用多執行緒?使用更多的GPU記憶體?這些坑我們都踩過。

錯誤 #1 — 在推理模式下儲存動態圖

如果你以前使用過TensorFlow,那麼你可能知道TensorFlow和PyTorch之間的關鍵區別 —— 靜態圖和動態圖。除錯TensorFlow非常困難,因為每次模型更改時都要重新構建graph。這需要時間、努力和你的希望。當然,TensorFlow現在更好了。

總的來說,為了使除錯更容易,ML框架使用動態圖,這些圖與PyTorch中所謂的Variables有關。你使用的每個變數都連結到前一個變數,以構建反向傳播的關係。

下面是它在實際中的樣子:

在大多數情況下,你希望在模型訓練完成後優化所有的計算。如果你看一下torch的介面,有很多可選項,特別是在優化方面。eval模式、detach

no_grad的方法造成了很多混亂。讓我來解釋一下它們是如何工作的。在模型被訓練和部署之後,以下是你所關心的事情:速度、速度和CUDA記憶體溢位異常。

為了加速PyTorch模型,你需要將它切換到eval模式。它通知所有層在推理模式下使用batchnorm和dropout層(簡單地說就是不使用dropout)。現在,有一個detach方法可以將變數從它的計算圖中分離出來。當你從頭開始構建模型時,它很有用,但當你想重用SOTA的模型時,它就不太有用了。一個更全域性性的解決方案將是在前向傳播的時候在上下文中使用torch.no_grad。這樣可以不用在在結果中儲存圖中變數的梯度,從而減少記憶體消耗。它節省記憶體,簡化計算,因此,你得到更多的速度和更少的記憶體使用。

錯誤 #2 — 沒有使能cudnn優化演算法

你可以在nn.Module中設定很多布林標誌,有一個是你必須知道的。使用cudnn.benchmark = True來對cudnn進行優化。通過設定cudnn.enabled = True,可以確保cudnn確實在尋找最優演算法。NVIDIA在優化方面為你提供了很多神奇的功能,你可以從中受益。

請注意你的資料必須在GPU上,模型輸入大小不應該改變。資料的形狀的變化越多,可以做的優化就越少。例如,要對資料進行歸一化,可以對影象進行預處理。總之,可以有變化,但不要太多。

錯誤 #3 — 重用 JIT-compilation

PyTorch提供了一種簡單的方法來優化和重用來自不同語言的模型(見Python-To-Cpp)。如果你足夠勇敢,你可能會更有創造力,並將你的模型嵌入到其他語言中。

JIT-compilation允許在輸入形狀不變的情況下優化計算圖。它的意思是,如果你的資料形狀變化不大(參見錯誤#2),JIT是一種選擇。老實說,和上面提到的no_gradcudnn相比,它並沒有太大的區別,但可能有。這只是第一個版本,有巨大的潛力。

請注意,如果你的模型中有conditions,這在RNNs中很常見,它就沒法用了。

錯誤 #4 — 嘗試擴充套件使用CPU

GPU很貴,雲虛擬機器也一樣很貴。即使使用AWS,一個例項也將花費你大約100美元/天(最低價格是0.7美元/小時)。也許有人會想“如果我用5個CPU來代替1個GPU可以嗎?”。所有試過的人都知道這是一個死衚衕。是的,你可以為CPU優化一個模型,但是最終它還是會比GPU慢。相信我,我強烈建議忘記這個想法。

錯誤 #5 — 處理向量而不是矩陣

  • cudnn- check

  • no_grad- check

  • GPU with correct version of CUDA- check

  • JIT-compilation- check

一切都準備好了,還能做什麼?

現在是時候使用一點數學了。如果你還記得大部分NN是如何用所謂的張量訓練的。張量在數學上是一個n維陣列或多線性幾何向量。你能做的就是把輸入(如果你有足夠的時間的話)分組成張量或者矩陣,然後把它輸入到你的模型中。例如,使用影象陣列作為傳送到PyTorch的矩陣。效能增益等於同時傳遞的物件數量。

這是一個顯而易見的解決方案,但是很少有人真正使用它,因為大多數時候物件都是一個一個地處理的,而且在流程上設定這樣的流可能有點困難。別擔心,你會成功的!

—END—

英文原文:https://towardsdatascience.com/how-to-pytorch-in-production-743cb6aac9d4

下載1:動手學深度學習

在機器學習演算法與自然語言處理公眾號後臺回覆“動手學”,
即可獲取547頁《動手學深度學習》電子書和原始碼。
本書同時覆蓋深度學習的方法和實踐,
不僅從數學的角度闡述深度學習的技術和應用,
還包含可執行的程式碼,
為讀者展示如何在實際中解決問題。

在這裡插入圖片描述

下載2:倉庫地址共享
在機器學習演算法與自然語言處理公眾號後臺回覆“程式碼”,
即可獲取195篇NAACL+295篇ACL2019有程式碼開源的論文。開源地址如下:https://github.com/yizhen20133868/NLP-Conferences-Code

倉庫地址共享:
在機器學習演算法與自然語言處理公眾號後臺回覆“程式碼”,
即可獲取195篇NAACL+295篇ACL2019有程式碼開源的論文。
開源地址如下: https://github.com/yizhen20133868/NLP-Conferences-Code
重磅!機器學習演算法與自然語言處理交流群已正式成立
群內有大量資源,歡迎大家進群學習!
額外贈送福利資源!邱錫鵬深度學習與神經網路,pytorch官方中文教程,利用Python進行資料分析,機器學習學習筆記,pandas官方文件中文版,effective java(中文版)等20項福利資源

Alt

注意:請大家新增時修改備註為 [學校/公司 + 姓名 + 方向]

例如 —— 哈工大+張三+對話系統。

號主,微商請自覺繞道。謝謝!

在這裡插入圖片描述

Alt

推薦閱讀:
Longformer:超越RoBERTa,為長文件而生的預訓練模型
一文直觀理解KL散度
機器學習必讀TOP 100論文清單:高引用、分類全、覆蓋面廣丨GitHub 21.4k星

在這裡插入圖片描述