MindSpore模型精度調優實戰:常用的定位精度調試調優思路

摘要:在模型的開發過程中,精度達不到預期常常讓人頭疼。爲了幫助用戶解決模型調試調優的問題,我們爲MindSpore量身定做了可視化調試調優組件:MindInsight。

本文分享自華爲雲社區《技術乾貨 | 模型優化精度、速度我全都要!MindSpore模型精度調優實戰(二)》,原文作者:HWCloudAI 。

引言:

在模型的開發過程中,精度達不到預期常常讓人頭疼。爲了幫助用戶解決模型調試調優的問題,我們爲MindSpore量身定做了可視化調試調優組件:MindInsight。我們還梳理了針對常見精度問題的調試調優指南,將以“MindSpore模型精度調優實戰”系列文章的形式分享出來,希望能幫助用戶輕鬆定位精度問題,快速優化模型精度。

回顧MindSpore模型精度調優實戰系列點擊跳轉鏈接→技術乾貨 | 更快定位精度問題!MindSpore模型精度調優實戰(一)

本文是系列分享的第二篇,將給出常用的精度調試調優思路。本系列分享假設您的腳本已經能夠運行並算出loss值。如果腳本還不能運行,請先參考相關報錯提示進行修改。

遇到精度問題時,常用調試調優思路如下:

1. 檢查代碼和超參

2. 檢查模型結構

3. 檢查輸入數據

4. 檢查loss曲線

5. 檢查精度是否達到預期

代碼是精度問題的重要源頭,檢查代碼重在對腳本和代碼做檢查,力爭在源頭髮現問題(第2節);模型結構體現了MindSpore對代碼的理解,檢查模型結構重在檢查MindSpore的理解和算法工程師的設計是否一致(第3節);有的問題要到動態的訓練過程中才會發現,檢查輸入數據(第4節)和loss曲線(第5節)正是將代碼和動態訓練現象結合進行檢查;檢查精度是否達到預期則是對整體精度調優過程重新審視,並考慮調整超參、解釋模型、優化算法等調優手段(第6節)。此外,熟悉模型和工具也是很重要的(第1節)。下面將分別介紹這些思路。

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檢查代碼和超參

代碼是精度問題的重要源頭,超參問題、模型結構問題、數據問題、算法設計和實現問題會體現在腳本中,對腳本做檢查是定位精度問題很有效率的手段。檢查代碼主要依賴代碼走讀,建議使用小黃鴨調試法:在代碼走讀的過程中,耐心地向沒有經驗的“小黃鴨”解釋每一行代碼的作用,從而激發靈感,發現代碼問題。檢查腳本時,要注意檢查腳本實現(包括數據處理、模型結構、loss函數、優化器等實現)同設計是否一致,如果參考了其它腳本,要重點檢查腳本實現同其它腳本是否一致,所有不一致的地方都應該有充分合理的理由,否則就應修改。

檢查腳本時,也要關注超參的情況,超參問題主要體現爲超參取值不合理,例如

1. 學習率設置不合理;

2. loss_scale參數不合理;

3. 權重初始化參數不合理等。

MindInsight可以輔助用戶對超參做檢查,大多數情況下,SummaryCollector會自動記錄常見超參,您可以通過MindInsight的訓練參數詳情功能(如下圖)和溯源分析功能查看超參。結合MindInsight模型溯源分析模塊和腳本中的代碼,可以確認超參的取值,識別明顯不合理的超參。如果有標杆腳本,建議同標杆腳本一一比對超參取值,如果有默認參數值,則默認值也應一併比對,以避免不同框架的參數默認值不同導致精度下降或者訓練錯誤。

03檢查模型結構

在模型結構方面,常見的問題有:

1. 算子使用錯誤(使用的算子不適用於目標場景,如應該使用浮點除,錯誤地使用了整數除);

2. 權重共享錯誤(共享了不應共享的權重);

3. 權重凍結錯誤(凍結了不應凍結的權重);

4. 節點連接錯誤(應該連接到計算圖中的block未連接);

5. loss函數錯誤;

6. 優化器算法錯誤(如果自行實現了優化器)等。

建議通過檢查模型代碼的方式對模型結構進行檢查。此外,MindInsight也可以輔助用戶對模型結構進行檢查。大多數情況下,SummaryCollector會自動記錄計算圖,通過MindInsight,用戶可以方便地對計算圖進行查看。模型腳本運行後,建議使用MindInsight計算圖可視模塊查看模型結構,加深對計算圖的理解,確認模型結構符合預期。若有標杆腳本,還可以同標杆腳本對照查看計算圖,檢查當前腳本和標杆腳本的計算圖是否存在重要的差異。

考慮到模型結構一般都很複雜,期望在這一步就能發現所有的模型結構問題是不現實的。只要通過可視化的模型結構加深對計算圖的理解,發現明顯的結構問題即可。後面的步驟中,發現了更明確的精度問題現象後,我們還會回到這一步重新檢查確認。

注1:MindInsight支持查看SummaryCollector記錄的計算圖和MindSpore context的save_graphs參數導出的pb文件計算圖。 請參考我們教程中的“計算圖可視化”部分了解更多信息(https://www.mindspore.cn/tutorial/training/zh-CN/master/advanced_use/dashboard.html)。

注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. 訓練階段和推理階段的數據處理方式不同;

9. 數據處理參數不正確等。

MindInsight可以輔助用戶對輸入數據、數據處理流水線進行檢查。大多數情況下,SummaryCollector會自動記錄輸入模型的數據(數據處理後的數據)和數據處理流水線參數。輸入模型的數據會展示在“數據抽樣”模塊,數據處理流水線參數會展示在“數據圖”模塊和“數據溯源”模塊。通過MindInsight的數據抽樣模塊,可以檢查輸入模型的(數據處理流水線處理後的)數據。若數據明顯不符合預期(例如數據被裁剪的範圍過大,數據旋轉的角度過大等),可以判斷輸入數據出現了一定的問題。通過MindInsight的數據圖和數據溯源模塊,可以檢查數據處理流水線的數據處理過程和具體參數取值,從而發現不合理的數據處理方法

如果有標杆腳本,還可以同標杆腳本對照,檢查數據處理流水線輸出的數據是否和當前腳本的數據相同。例如,將數據處理流水線輸出的數據保存爲npy文件,然後使用numpy.allclose()方法對標杆腳本和當前腳本的數據進行對比。如果發現不同,則數據處理階段可能存在精度問題。

若數據處理流水線未發現問題,可以手動檢查數據集是否存在分類不均衡、標籤匹配錯誤、缺失值過多、訓練樣本不足等問題。

05檢查loss曲線

很多精度問題會在網絡訓練過程中發現,常見的問題或現象有:

1. 權重初始化不合理(例如初始值爲0,初始值範圍不合理等);

2. 權重中存在過大、過小值;

3. 權重變化過大;

4. 權重凍結不正確;

5. 權重共享不正確;

6. 激活值飽和或過弱(例如Sigmoid的輸出接近1,Relu的輸出全爲0);

7. 梯度爆炸、消失;

8. 訓練epoch不足;

9. 算子計算結果存在NAN、INF;

10. 算子計算過程溢出(計算過程中的溢出不一定都是有害的)等。

上述這些問題或現象,有的可以通過loss表現出來,有的則難以觀察。MindInsight提供了針對性的功能,可以觀察上述現象、自動檢查問題,幫助您更快定位問題根因。例如:

  • MindInsight的參數分佈圖模塊可以展示模型權重隨訓練過程的變化趨勢;
  • MindInsight的張量可視模塊可以展示張量的具體取值,對不同張量進行對比;
  • MindInsight調試器內置了種類豐富,功能強大的檢查能力,可以檢查權重問題(例如權重不更新、權重更新過大、權重值過大/過小)、梯度問題(例如梯度消失、梯度爆炸)、激活值問題(例如激活值飽和或過弱)、張量全爲0、NAN/INF、算子計算過程溢出等問題。

調試器使用教程: https://www.mindspore.cn/tutorial/training/zh-CN/master/advanced_use/debugger.html

大多數情況下,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)。

下面結合loss曲線的常見現象介紹使用MindInsight進行精度問題定位的思路。

5.1 loss跑飛

loss跑飛是指loss中出現了NAN、+/-INF或者特別大的值。loss跑飛一般意味着算法設計或實現存在問題。定位思路如下:

1. 回顧腳本、模型結構和數據,

1)檢查超參是否有不合理的特別大/特別小的取值,

2)檢查模型結構是否實現正確,特別是檢查loss函數是否實現正確,

3)檢查輸入數據中是否有缺失值、是否有特別大/特別小的取值。

2. 觀察訓練看板中的參數分佈圖,檢查參數更新是否有明顯的異常。若發現參數更新異常,可以結合調試器定位參數更新異常的原因。3. 使用調試器模塊對訓練現場進行檢查。

1)若loss值出現NAN、+/-INF,可使用“檢查張量溢出”條件添加全局監測點,定位首先出現NAN、+/-INF的算子節點,檢查算子的輸入數據是否會導致計算異常(例如除零)。若是算子輸入數據的問題,則可以針對性地加入小數值epsilon避免計算異常。

2)若loss值出現特別大的值,可使用“檢查過大張量”條件添加全局監測點,定位首先出現大值的算子節點,檢查算子的輸入數據是否會導致計算異常。若輸入數據本身存在異常,則可以繼續向上追蹤產生該輸入數據的算子,直到定位出具體原因。

3)若懷疑參數更新、梯度等方面存在異常,可使用“檢查權重變化過大”、“檢查梯度消失”、“檢查梯度過大”等條件設置監測點,定位到異常的權重或梯度,然後結合張量檢查視圖,逐層向上對可疑的正向算子、反向算子、優化器算子等進行檢查。

5.2 loss收斂慢

loss收斂慢是指loss震盪、收斂速度慢,經過很長時間才能達到預期值,或者最終也無法收斂到預期值。相較於loss跑飛,loss收斂慢的數值特徵不明顯,更難定位。定位思路如下:1. 回顧腳本、模型結構和數據,

1)檢查超參是否有不合理的特別大/特別小的取值,特別是檢查學習率是否設置過小或過大,學習率設置過小會導致收斂速度慢,學習率設置過大會導致loss震盪、不下降;

2)檢查模型結構是否實現正確,特別是檢查loss函數、優化器是否實現正確;

3)檢查輸入數據的範圍是否正常,特別是輸入數據的值是否過小

2. 觀察訓練看板中的參數分佈圖,檢查參數更新是否有明顯的異常。若發現參數更新異常,可以結合調試器定位參數更新異常的原因。3. 使用調試器模塊對訓練現場進程檢查。

1)可使用“檢查權重變化過小”、“檢查未變化權重”條件對可訓練(未固定)的權重進行監測,檢查權重是否變化過小。若發現權重變化過小,可進一步檢查學習率取值是否過小、優化器算法是否正確實現、梯度是否消失,並做針對性的修復。

2)可使用“檢查梯度消失”條件對梯度進行監測,檢查是否存在梯度消失的現象。若發現梯度消失,可進一步向上檢查導致梯度消失的原因。例如,可以通過“檢查激活值範圍”條件檢查是否出現了激活值飽和、Relu輸出爲0等問題。

5.3 其它loss現象

若訓練集上loss爲0,一般說明模型出現了過擬合,請嘗試增大訓練集大小。

06檢查精度是否達到預期

MindInsight可以爲用戶記錄每次訓練的精度結果。在model.train和model.eval中使用同一個SummaryCollector實例時,會自動記錄模型評估(metrics)信息。訓練結束後,可以通過MindInsight的模型溯源模塊檢查訓練結果精度是否達標。

6.1 檢查訓練集上的精度

若訓練集上模型的loss值、metric值未達到預期,可以參考以下思路進行定位和優化:

1. 回顧代碼、模型結構、輸入數據和loss曲線,

1)檢查腳本,檢查超參是否有不合理的值

2)檢查模型結構是否實現正確

3)檢查輸入數據是否正確

4)檢查loss曲線的收斂結果和收斂趨勢是否存在異常

2. 嘗試使用MindInsight溯源分析功能優化超參。溯源分析頁面會對超參的重要性進行分析,用戶應優先考慮調整重要性高的超參,從散點圖中可以觀察出超參和優化目標的關係,從而針對性地調整超參取值。

3. 嘗試使用MindInsight調參器優化超參。請注意,調參器通過執行多次完整訓練的方式進行超參搜索,消耗的時間爲網絡一次訓練用時的若干倍,如果網絡一次訓練耗時較長,則超參搜索將需要很長的時間。 調參器使用教程:https://www.mindspore.cn/tutorial/training/zh-CN/master/advanced_use/hyper_parameters_auto_tuning.html

4. 嘗試使用MindInsight模型解釋功能優化模型和數據集。模型解釋功能可以通過顯著圖可視化展示對分類結果最重要的區域,還可以通過評分體系提示應該對哪類標籤進行優化。

模型解釋使用教程: https://www.mindspore.cn/tutorial/training/zh-CN/master/advanced_use/model_explaination.html

5. 嘗試優化模型結構/算法。

6.2 檢查驗證集上的精度

若訓練集精度和驗證集精度都未達到預期,則應首先參考上一節檢查訓練集精度。若訓練集精度已達到預期,但是驗證集精度未達到預期,大概率是模型出現了過擬合,處理思路如下:

1. 檢查驗證集評估腳本的評估邏輯有無錯誤。特別是數據處理方式是否與訓練集一致,推理算法有誤錯誤,是否加載了正確的模型checkpoint。2. 增加數據量。包括增加樣本量,進行數據增強和擾動等。3. 正則化。常見的技術如參數範數懲罰(例如向目標函數中添加一個正則項 ),參數共享(強迫模型的兩個組件共享相同的參數值),提前中止訓練等。4. 適當降低模型的規模。例如減少卷積層數等。

6.3 檢查測試集上的精度

若驗證集和測試集精度都未達到預期,則應首先參考上一節檢查驗證集精度。若驗證集精度已達到預期,但是測試集精度未達到預期,考慮到測試集的數據是模型從未見過的新數據,原因一般是測試集的數據分佈和訓練集的數據分佈不一致。處理思路如下:

1. 檢查測試集評估腳本的評估邏輯有誤錯誤。特別是數據處理方式是否與訓練集一致,推理算法有誤錯誤,是否加載了正確的模型checkpoint。

2. 檢查測試集中的數據質量,例如數據的分佈範圍是否明顯同訓練集不同,數據是否存在大量的噪聲、缺失值或異常值。

07小結

由於相同的現象存在多個可能原因,精度問題的定位非常依賴專家經驗。希望上述定位方法和功能能夠起到良好的引導的作用,幫助你不斷積累成功經驗,成爲精度調優大師。

 

點擊關注,第一時間瞭解華爲雲新鮮技術~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章