摘要:MindStudio提供精度比對功能,支援Vector比對能力。
本文分享自華為雲社群《【MindStudio訓練營第一季】MindStudio 高精度對比隨筆》,作者:Tianyi_Li。
訓練場景下,遷移原始網路 (如TensorFlow、PyTorch) ,用於NPU上執行訓練,網路遷移可能會造成自有實現的運算元運算結果與用原生標準運算元運算結果存在偏差。推理場景下, ATC模型轉換過程對模型進行最佳化,包括運算元消除、運算元融合運算元拆分,這些最佳化也可能會造成自有實現的運算元運算結果與原生標準運算元(如TensorFlow、ONNX、 Caffe ) 運算結果存在偏差。
為了幫助開發人員快速解決運算元精度問題,需要提供自有實現的運算元運算結果與業界標準運算元運算結果之間進行精度差異對比的工具。
對策:
精度比對工具能夠幫助開發人員定位本次任務兩個網路間的精度差異。準備好昇騰騰AI處理器執行生成的dump教據與Ground Truth資料 (基於GPU/CPU執行生成的資料)後,即可進行不同演算法評價指標的資料比對。
MindStudio提供精度比對功能,支援Vector比對能力,支援下列演算法:
- 餘弦相似度
- 最大絕對誤差
- 累積相對誤差
- 歐氏相對距離
- KL散度…
精度比對根據推理/訓練和不同的框架分為多個比對場景。
原始模型資料即為原始網路在GPU/CPU側生成的資料,主要依賴原始框架中的源生能力,將模型中每一個運算元節點的輸入輸出資料進行儲存。
NPU模型資料即為透過對原始模型的遷移或訓練在縣騰A處理器上得到的資料,主要依賴華為側提供對應用推理及訓練提供的Dump能力,將模型中每一個運算元節點的輸入輸出資料進行儲存。
由於MindStudio精度比對工具的使用約束,資料需要滿足以下格式:
原始模型資料準備
以TensorFlow為例
在進行TensorFlow模型生成npy資料前,您需要已經有一套完整的、可執行的、標準的TensorFlow模型應用工程。然後利用TensorFlow官方提供的debug工具tfdbg除錯程式,從而生成npy檔案。通常情況下,TensorFlow的網路實現方式主要分為Estimator模式和session.run模式,具體操作如下:
1.修改tf訓練指令碼,新增debug選項設定
2.執行推理或訓練指令碼,任務執行到前面debug配置後暫停
3.進入除錯命令列互動模式後,
- 3.1 輸入run命令,訓練會往下執行一個step
- 3.2 執行lt >tensor name將所有tensor的名稱暫存到檔案裡,在另一個視窗,在Linux命令下執行下述命令,用以生成在tfdbg命令列執行的命令:
timestamp=$[S(date +%s%N)/1000] ; cat tensor name | awk 'print "pt",$4,$4)' | awk '[gsub("/", ""$3);gsub("""" $3);print($1,$2,"-n 0 -w "$3"stimestamp"""npy")y' > tensor name cmd.txt
- 3.3 將上一步生成的tensor name cmd.txt檔案內容貼上執行,即可儲存所有npy檔案,實現訓練資料的Dump。
注: 更加詳細操作見《CANN開發輔助工具指南》中“精度比對工具使用指南”章節。
NPU模型資料準備
以推理場景為例
推理場景資料準備一NPU的融合後推理資料NPU採用AscendCL完成離線推理:
1.在程式碼中呼叫acllnit(“./acl.json”)
acl.json的檔案內容如下:
2.執行推理應用,生成dump資料
以訓練場景為例
訓練場景資料準備-NPU的遷移後網路訓練資料
以TensorFlow為例,步驟如下:
1.設定“DUMP GE GRAPH=2”生成計算圖檔案,同時修改訓練指令碼,開啟dump功能
2.執行訓練指令碼,生成dump資料和計算圖檔案
- 計算圖檔案:“ge”開頭的檔案,儲存在訓練指令碼所在目錄
- dump資料檔案: 生成在dump path指定的目錄下,即(dump path)/time)/(deviceid)/(model name)/(model id)/(data index) 。
3.選取計算圖檔案
可使用grep lterator* Build.txt命令快速查詢出的計算圖檔名稱,如ge proto 00005 Build.txt.
4.選取dump資料檔案
開啟上述計算圖檔案,找出第一個graph中的name欄位,即為dump檔案存放目錄名稱。
精度對比工具使用方法
建立對比任務
將準備好的標準資料檔案與待比對資料文性作為輸入檔案,並配置對應的離線模型檔案,透過對檔案內所有參與計算的運算元輸入與輸出進行精度比對。
整網比對在MindStudio介面選單欄洗擇“Ascend > Model Accuracy Analvzer > New Task選單,進入比對介面。
整網對比結果
整網比對結果主要分為四大展示模組:
- 整網對比結果表;
- 精度散點圖;
- 模型視覺化:
- 精度專家建議
精度比對工具本身只提供自有實現運算元在昇騰AI處理器上的運算結果與業界標準運算元的運算結果的差異比對功能,而輸出的比對結果需要使用者自行分析並找出問題。而對結果的分析工作對於使用者來說也是一大難點,而專家系統工具為使用者提供精度比對結果的結果分析功能,有效減少使用者排查問題的時間。只需在比對操作配置任務時勾選“Advisor”選項,系統則會在比對完成後自動進行結果檔案的分析,並輸出最佳化建議。
當前支援的分析檢測型別有:FP16溢位檢測、輸入不一致檢測、整網一致性檢測(整網一致性檢測包括:問題節點檢測、單點誤差檢測和一致性檢測三個小點)
這裡特別說明下FP16溢位檢測,針對比對資料中資料型別為FP16的資料,進行溢位檢測。如果存在溢位資料,輸出專家建議,示例圖如下所示。
專家系統分析結果: Detection Type: FP16 overflow Operator Index: 228 Expert Advice: Float16 data overflow occurs. Rectify the fault and perform comparison again. 檢測型別:FP16溢位檢測 Operator Index:228 專家建議:存在Float16資料溢位,請修正溢位問題,再進行比對。
單運算元對比
可針對整網任務中的某個運算元進行單運算元比對,分析某個運算元的具體精度差異。
使用約束
- 精度比對功能不支援開啟多個工程同時進行比對,可以先完成一個比對程式後再進行下一個。
- 精度比對支援的dump資料的型別:
FLOAT
FLOAT16
DT_INT8
DT_UINT8
DT_INT16
DT_UINT16
DT_INT32
DT_INT64
DT_UINT32
DT_UINT64
DT_BOOL
DT_DOUBLE
特別說明
dump檔案無法透過文字工具直接檢視其內容,為了檢視dump檔案內容,需要用指令碼將dump檔案轉換為numpy格式檔案後,再透過numpy官方提供的能力轉為txt文件進行檢視。指令碼在/home/HwHiAiUser/Ascend/ascend-toolkit/latest/tools/operator_cmp/compare目錄,名為msaccucmp.py。舉例用法如下:
python3 msaccucmp.py convert -d dump_file [-out output] [-f format -s shape] [-o output_tensor] [-i input_tensor] [-v version] [-t type]
呼叫Python,轉換numpy檔案為txt檔案的完整示例如下:
$ python3 >>> import numpy as np >>> a = np.load("/home/HwHiAiUser/dumptonumpy/Pooling.pool1.1147.1589195081588018.output.0.npy") >>> b = a.flatten() >>> np.savetxt("/home/HwHiAiUser/dumptonumpy/Pooling.pool1.1147.1589195081588018.output.0.txt", b)
但轉換為.txt格式檔案後,維度資訊、Dtype均不存在。詳細的使用方法請參考numpy官網介紹。
總結
精度對比總計分為環境準備、資料準備和對比三步。
資料準備要根據推理場景和訓練場景分別分析:
- 推理場景:準備第三方框架原始模型的npy資料檔案與離線模型的dump資料檔案。
- 訓練場景:準備基於GPU執行生成的第三方框架原始訓練網路npy資料檔案與基於昇騰AI處理器執行生成的訓練網路dump資料和計算圖檔案。
準備後上述步驟,可進行對比:
- 執行整網比對操作。
- 開啟MindStudio的“Ascend > Model Accuracy Analyzer”功能,將準備好的比對資料檔案配置到對應引數下並配置具體比對引數。
- MindStudio執行比對操作並輸出比對結果。
- 比對結果專家建議(可選)。請參見比對結果專家建議。
- 根據分析結果定位具體問題運算元。
- 執行單運算元比對操作。
- 分析單運算元具體問題。
最後說下Tensor比對,Tensor對比提供整網比對和單運算元比對兩種精度比對方式,需要根據比對場景選擇比對方式。其中,整網比對:將準備好的標準資料檔案與待比對資料檔案作為輸入檔案,透過對檔案內所有參與計算的運算元進行精度比對。而單運算元比對:在整網比對的基礎上指定具體運算元名,對單個運算元進行詳細資料的比對。
個人認為,精度對比這是一個需要時間、精力和經驗的操作,要充分利用好MindStudio工具,或查文件,或提問,可大大降低我們的工作量,提高效率。但是不得不說,這是需要一定經驗的,還是要多看多學習,多試多問啊。