技術干貨 | 模型優化精度、速度我全都要!MindSpore模型精度調優實戰(二)
引言:在模型的開發過程中,精度達不到預期常常讓人頭疼。為了幫助用戶解決模型調試調優的問題,我們為MindSpore量身定做了可視化調試調優組件:MindInsight。我們還梳理了針對常見精度問題的調試調優指南,將以“MindSpore模型精度調優實戰”系列文章的形式分享出來,希望能幫助用戶輕松定位精度問題,快速優化模型精度。
回顧MindSpore模型精度調優實戰系列點擊跳轉鏈接→技術干貨 | 更快定位精度問題!MindSpore模型精度調優實戰(一)。
本文是系列分享的第二篇,將給出常用的精度調試調優思路。本系列分享假設您的腳本已經能夠運行并算出loss值。如果腳本還不能運行,請先參考相關報錯提示進行修改。
遇到精度問題時,常用調試調優思路如下:
1. 檢查代碼和超參
2. 檢查模型結構
3. 檢查輸入數據
4. 檢查loss曲線
5. 檢查精度是否達到預期
01精度調優準備
1.1 回顧算法設計,全面熟悉模型
精度調優前,要先對算法設計做回顧,確保算法設計明確。如果參考論文實現模型,則應回顧論文中的全部設計細節和超參選擇情況;如果參考其它框架腳本實現模型,則應確保有一個唯一的、精度能夠達標的標桿腳本;如果是新開發的算法,也應將重要的設計細節和超參選擇明確出來。這些信息是后面檢查腳本步驟的重要依據。
精度調優前,還要全面熟悉模型。只有熟悉了模型,才能準確理解MindInsight提供的信息,判斷是否存在問題,查找問題源頭。因此,花時間理解模型算法和結構、理解模型中算子的作用和參數的含義、理解模型所用優化器的特性等模型要素是很重要的。動手分析精度問題細節前,建議先帶著問題加深對這些模型要素的了解。
前,要先對算法設計做回顧,確保算法設計明確。如果參考論文實現模型,則應回顧論文中的全部設計細節和超參選擇情況;如果參考其它框架腳本實現模型,則應確保有一個唯一的、精度能夠達標的標桿腳本;如果是新開發的算法,也應將重要的設計細節和超參選擇明確出來。這些信息是后面檢查腳本步驟的重要依據。
精度調優前,還要全面熟悉模型。只有熟悉了模型,才能準確理解MindInsight提供的信息,判斷是否存在問題,查找問題源頭。因此,花時間理解模型算法和結構、理解模型中算子的作用和參數的含義、理解模型所用優化器的特性等模型要素是很重要的。動手分析精度問題細節前,建議先帶著問題加深對這些模型要素的了解。
1.2 熟悉工具
MindInsight功能豐富,建議用戶簡單閱讀MindInsight教程(https://www.mindspore.cn/tutorial/training/zh-CN/master/advanced_use/visualization_tutorials.html),了解主要功能。定位精度問題時,建議使能summary訓練信息收集功能,在腳本中加入SummaryCollector,并使用訓練看板查看訓練過程數據,如下圖所示。Summary功能的使用指南請見 (https://www.mindspore.cn/tutorial/training/zh-CN/master/advanced_use/summary_record.html),訓練可視功能的使用指南請見(https://www.mindspore.cn/tutorial/training/zh-CN/master/advanced_use/dashboard.html)?。
https://www.mindspore.cn/tutorial/training/zh-CN/master/advanced_use/debugger.html
02檢查代碼和超參
檢查腳本時,也要關注超參的情況,超參問題主要體現為超參取值不合理,例如
1. 學習率設置不合理;
2. loss_scale參數不合理;
03檢查模型結構
在模型結構方面,常見的問題有:
1. 算子使用錯誤(使用的算子不適用于目標場景,如應該使用浮點除,錯誤地使用了整數除);
2. 權重共享錯誤(共享了不應共享的權重);
3. 權重凍結錯誤(凍結了不應凍結的權重);
4. 節點連接錯誤(應該連接到計算圖中的block未連接);
5. loss函數錯誤;
注2:腳本遷移工具可以將PyTorch、TensorFlow框架下編寫的模型轉換為MindSpore腳本,請訪問教程(https://www.mindspore.cn/tutorial/training/zh-CN/master/advanced_use/migrate_3rd_scripts_mindconverter.html)?以了解更多信息。
04檢查輸入數據
1. 數據缺失值過多;
2. 每個類別中的樣本數目不均衡;
3. 數據中存在異常值;
4. 數據標簽錯誤;
5. 訓練樣本不足;
6. 未對數據進行標準化,輸入模型的數據不在正確的范圍內;
7. finetune和pretrain的數據處理方式不同;
8. 訓練階段和推理階段的數據處理方式不同;
若數據處理流水線未發現問題,可以手動檢查數據集是否存在分類不均衡、標簽匹配錯誤、缺失值過多、訓練樣本不足等問題。
05檢查loss曲線
很多精度問題會在網絡訓練過程中發現,常見的問題或現象有:
1. 權重初始化不合理(例如初始值為0,初始值范圍不合理等);
2. 權重中存在過大、過小值;
3. 權重變化過大;
4. 權重凍結不正確;
5. 權重共享不正確;
6. 激活值飽和或過弱(例如Sigmoid的輸出接近1,Relu的輸出全為0);
7. 梯度爆炸、消失;
8. 訓練epoch不足;
9. 算子計算結果存在NAN、INF;
上述這些問題或現象,有的可以通過loss表現出來,有的則難以觀察。MindInsight提供了針對性的功能,可以觀察上述現象、自動檢查問題,幫助您更快定位問題根因。例如:
MindInsight的參數分布圖模塊可以展示模型權重隨訓練過程的變化趨勢;
MindInsight的張量可視模塊可以展示張量的具體取值,對不同張量進行對比;
MindInsight調試器內置了種類豐富,功能強大的檢查能力,可以檢查權重問題(例如權重不更新、權重更新過大、權重值過大/過小)、梯度問題(例如梯度消失、梯度爆炸)、激活值問題(例如激活值飽和或過弱)、張量全為0、NAN/INF、算子計算過程溢出等問題。
調試器使用教程:
大多數情況下,SummaryCollector會自動記錄模型的loss曲線,可以通過MindInsight的標量可視模塊查看。loss曲線能夠反映網絡訓練的動態趨勢,通過觀察loss曲線,可以得到模型是否收斂、是否過擬合等信息。
大多數情況下,SummaryCollector會自動記錄模型參數變化情況(默認記錄5個參數),可以通過MindInsight的參數分布圖模塊查看。如果想要記錄更多參數的參數分布圖,請參考SummaryCollector的histogram_regular參數(https://www.mindspore.cn/doc/api_python/zh-CN/master/mindspore/mindspore.train.html#mindspore.train.callback.SummaryCollector),或參考HistogramSummary算子(https://www.mindspore.cn/tutorial/training/zh-CN/master/advanced_use/summary_record.html#summarysummarycollector)。
張量不會被自動記錄,如果想要通過MindInsight查看張量的具體取值,請使用TensorSummary算子 (https://www.mindspore.cn/tutorial/training/zh-CN/master/advanced_use/summary_record.html#summarysummarycollector)。
5.1 loss跑飛
loss跑飛是指loss中出現了NAN、+/-INF或者特別大的值。loss跑飛一般意味著算法設計或實現存在問題。定位思路如下:
1)檢查超參是否有不合理的特別大/特別小的取值,
2)檢查模型結構是否實現正確,特別是檢查loss函數是否實現正確,
3)檢查輸入數據中是否有缺失值、是否有特別大/特別小的取值。
1)若loss值出現NAN、+/-INF,可使用“檢查張量溢出”條件添加全局監測點,定位首先出現NAN、+/-INF的算子節點,檢查算子的輸入數據是否會導致計算異常(例如除零)。若是算子輸入數據的問題,則可以針對性地加入小數值epsilon避免計算異常。
2)若loss值出現特別大的值,可使用“檢查過大張量”條件添加全局監測點,定位首先出現大值的算子節點,檢查算子的輸入數據是否會導致計算異常。若輸入數據本身存在異常,則可以繼續向上追蹤產生該輸入數據的算子,直到定位出具體原因。
3)若懷疑參數更新、梯度等方面存在異常,可使用“檢查權重變化過大”、“檢查梯度消失”、“檢查梯度過大”等條件設置監測點,定位到異常的權重或梯度,然后結合張量檢查視圖,逐層向上對可疑的正向算子、反向算子、優化器算子等進行檢查。
5.2 loss收斂慢
1)檢查超參是否有不合理的特別大/特別小的取值,特別是檢查學習率是否設置過小或過大,學習率設置過小會導致收斂速度慢,學習率設置過大會導致loss震蕩、不下降;
2)檢查模型結構是否實現正確,特別是檢查loss函數、優化器是否實現正確;
3)檢查輸入數據的范圍是否正常,特別是輸入數據的值是否過小
1)可使用“檢查權重變化過小”、“檢查未變化權重”條件對可訓練(未固定)的權重進行監測,檢查權重是否變化過小。若發現權重變化過小,可進一步檢查學習率取值是否過小、優化器算法是否正確實現、梯度是否消失,并做針對性的修復。
2)可使用“檢查梯度消失”條件對梯度進行監測,檢查是否存在梯度消失的現象。若發現梯度消失,可進一步向上檢查導致梯度消失的原因。例如,可以通過“檢查激活值范圍”條件檢查是否出現了激活值飽和、Relu輸出為0等問題。
5.3 其它loss現象
06檢查精度是否達到預期
MindInsight可以為用戶記錄每次訓練的精度結果。在model.train和model.eval中使用同一個SummaryCollector實例時,會自動記錄模型評估(metrics)信息。訓練結束后,可以通過MindInsight的模型溯源模塊檢查訓練結果精度是否達標。
6.1 檢查訓練集上的精度
1)檢查腳本,檢查超參是否有不合理的值
2)檢查模型結構是否實現正確
3)檢查輸入數據是否正確
4)檢查loss曲線的收斂結果和收斂趨勢是否存在異常
2. 嘗試使用MindInsight溯源分析功能優化超參。溯源分析頁面會對超參的重要性進行分析,用戶應優先考慮調整重要性高的超參,從散點圖中可以觀察出超參和優化目標的關系,從而針對性地調整超參取值。
模型解釋使用教程:
https://www.mindspore.cn/tutorial/training/zh-CN/master/advanced_use/model_explaination.html
6.2 檢查驗證集上的精度
若訓練集精度和驗證集精度都未達到預期,則應首先參考上一節檢查訓練集精度。若訓練集精度已達到預期,但是驗證集精度未達到預期,大概率是模型出現了過擬合,處理思路如下:
4. 適當降低模型的規模。例如減少卷積層數等。
6.3 檢查測試集上的精度
1. 檢查測試集評估腳本的評估邏輯有誤錯誤。特別是數據處理方式是否與訓練集一致,推理算法有誤錯誤,是否加載了正確的模型checkpoint。
2. 檢查測試集中的數據質量,例如數據的分布范圍是否明顯同訓練集不同,數據是否存在大量的噪聲、缺失值或異常值。
07小結
由于相同的現象存在多個可能原因,精度問題的定位非常依賴專家經驗。希望上述定位方法和功能能夠起到良好的引導的作用,幫助你不斷積累成功經驗,成為精度調優大師。
了解完MindSpore的關鍵技術是不是很心動呢!趕緊【點擊鏈接】并【立即報名】,即可在 ModelArts 平臺學習到一個經典案例掌握基于MindSpore的深度學習!
MindSpore 機器學習
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。