模型轉換問題
- onnx 模型在轉換後,hard validation 的運算數值沒有問題,但是在實際硬體跑時,精准度誤差十分大,在追加量化的圖片(約 600張)之後也沒有好轉,這方面有解決的方法嗎?
- 對 onnx 模型轉換時,嘗試了 224x224 360x360 512x512 三種大小的模型,僅有 224x224 可以運作,其餘都會發生以下錯誤。
[common][error][exceptions.cc:17][HandleError] Hardware not support: value of NPU register exceeds limit terminate called after throwing an instance of 'HardwareNotSupport' what(): Hardware not support: value of NPU register exceeds limit ./compilerIpevaluator_720.sh: line 32: 186 Aborte d $LIBS_FOLDER/compiler/compile 720 $model $TMP_FOLDER/config_compiler.json warning compile.log
附件為模型轉換過程的步驟以及相關 onnx 模型
Tagged:
The discussion has been closed due to inactivity. To continue with the topic, please feel free to post a new discussion.
Comments
Hello,
想請問你使用的是KL520還是KL720呢?
初步看起來模型中含有不支援的operator,這可能會導致後續的錯誤,請參考下圖將紅線以下的部分移除,屆時你會拿到四個output data( 51x28x28, 34x14x14, 34x7x7, 51x3x3),再將這四個output node的資料在PC上做後續reshape, concat等非神經網路的操作後就可以拿到你預期的三個結果 (conf, loc, iou)
若沒有現成工具可以移除onnx中的operator的話,也可以參考我們文件中所提供的工具editor.py
使用 kl720 執行
嘗試了切除 transpose 之後的 模型 node 並從新轉換,結果的精准度誤差還是十分大
在使用
editor.py
進行切除時 因為其中onnx.utils.polish_model(m)
會出現錯誤 所以執行時會著解掉該行以下是切除的指令
@Wayne_Zhou@compal.com
Hi Wayne,
看過您 onnx 模型轉換的流程,建議您使用 Kneron 最新的 ToolChain docker (
kneron/toolchain:v0.17.2
) ,還有使用 python API 來轉換模型 (http://doc.kneron.com/docs/#toolchain/manual/)。如 Ethon 所描述,因為您的模型中含有不支援的operator,這可能會導致後續轉換時出現錯誤,所以您必須移除不支援的 operators。
您在使用
editor.py
進行切除,通常不建議您將該行onnx.utils.polish_model(m)
著解掉,因為那個 function 是有用來確認 onnx model 是否符合 onnx 規範的功用,如果出現錯誤訊息,您的 onnx model 可能是不符合 onnx 規範。這邊方便詢問您一下,精確掉很多是掉多少呢?然後您的 hard validate 指的是什麼呢?
您是否可以提供像這樣的範例讓我們重現精確度掉非常大的問題(http://doc.kneron.com/docs/#toolchain/yolo_example/) (Step 4: Check ONNX model and preprocess and postprocess are good, Step 6: Check if BIE model accuracy is good enough, Step 8. Check NEF model)
您成功切除後,在最新的 ToolChain docker 就可以順利進行 onnx 模型轉換囉。
您在使用
editor.py
進行切除,通常不建議您將該行onnx.utils.polish_model(m)
著解掉,因為那個 function 是有用來確認 onnx model 是否符合 onnx 規範的功用,如果出現錯誤訊息,您的 onnx model 可能是不符合 onnx 規範。關於這點,執行
onnx.utils.polish_model(m)
而發生錯誤的節點,即是我要切除地方,所以導致死結(我不切除不符合規範的節點,就不能轉換,但是該節點使我無法切除)。我僅註解第31行的程式碼,
editor.py
當中輸出時也有執行onnx.utils.polish_model(m)
(113 行) ,我想最後輸出應該是沒問題的?這邊方便詢問您一下,精確掉很多是掉多少呢?然後您的 hard validate 指的是什麼呢?
hard validate 指的是
/workspace/scripts/hardware_validate_520.py
/workspace/scripts/hardware_validate_720.py
您是否可以提供像這樣的範例讓我們重現精確度掉非常大的問
題
附件有使用實際硬體與原始模型運行的比較
當我試圖用
ktc.kneron_inference
運行時,會發生一些狀況使用 運行 bie 模型時
使用 運行 nef 模型時
您成功切除後,在最新的 ToolChain docker 就可以順利進行 onnx 模型轉換囉。
這部分已可正常轉換
確認一下,所以onnx轉換問題在切除不支援的op後就可以轉換了嗎?
另外,實際硬體與原始模型運行的比較,這邊指的是onnx模型的推論結果與實際上在520 / 720上執行嗎? 所以已經有成功在520 / 720上執行了嗎? 請問要使用的是520還是720呢?
執行ktc.kneron_inference 運行時會發生一些狀況,關於這點,能否請你提供你執行的方式,也就是該api所需要的各項參數是怎麼設定的,也可以先參考網站內的說明檢查各項參數是否正確
http://doc.kneron.com/docs/#toolchain/python_app/app_flow_manual/#python-api-inference
kneron_inference(pre_results, nef_file="", onnx_file="", bie_file="", model_id=None, input_names=[], radix=8, data_type="float", reordering=[], ioinfo_file="", dump=False, platform=520)
確認一下,所以onnx轉換問題在切除不支援的op後就可以轉換了嗎?
對
另外,實際硬體與原始模型運行的比較,這邊指的是onnx模型的推論結果與實際上在520 / 720上執行嗎? 所以已經有成功在520 / 720上執行了嗎? 請問要使用的是520還是720呢?
對 在實際硬體 目前是兩邊都有嘗試轉換
執行ktc.kneron_inference 運行時會發生一些狀況,關於這點,能否請你提供你執行的方式,也就是該api所需要的各項參數是怎麼設定的,也可以先參考網站內的說明檢查各項參數是否正確
我有參考過,主要問題是出在 radix 上面,原始模型的輸入範圍是 (0~255)
根據 http://doc.kneron.com/docs/#toolchain/command_line/ 的
計算為 7 - ceil(log2(255)) = 7 - 8 = -1
但是 kneron_inference() 好像無法處理
@Wayne_Zhou@compal.com
Hi Wayne_Zhou,
這裡有幫您確認過,kneron_inference() 是可以處理 radix = -1 的情況,可能還得請您檢查一下其他可能的原因。
執行ktc.kneron_inference 運行時會發生一些狀況,關於這點,能否請你提供你執行的方式,也就是該api所需要的各項參數是怎麼設定的,也可以先參考網站內的說明檢查各項參數是否正確
http://doc.kneron.com/docs/#toolchain/python_app/app_flow_manual/#python-api-inference
kneron_inference(pre_results, nef_file="", onnx_file="", bie_file="", model_id=None, input_names=[], radix=8, data_type="float", reordering=[], ioinfo_file="", dump=False, platform=520)
附件整理了kneron_inference執行過程的 notebook 沒有發現進一步的原因
附件整理了kneron_inference執行過程的 notebook 沒有發現進一步的原因
該附件上傳後有發現些小錯誤,這裡重傳一份
@Wayne_Zhou@compal.com
Hi Wayne_Zhou,
看過您整理的 kneron-inference,得知您是想要使用 KL520,這裡列出幾點給您參考:
1. 您的 kneron inference on Onnx
onnxOutputData = ktc.kneron_inference([inputData], onnx_file=modelOnnxPath, input_names=["input"], platform=platform, radix=-1)
這裡的 API 是對 onnx inference,radix 可以不用加。
2. 您的 kneron inference on Bie file
bieOutputData = ktc.kneron_inference([inputData], bie_file=modelBiePath, input_names=["input"], platform=platform, radix=-1)
這裡會造成錯誤,較有可能是有經過 perprocess 後 inputData 的問題。
3. 您的 kneron inference on Nef file
nefOutputData = ktc.kneron_inference([inputData], nef_file=modelNefPath, input_names=["input"], platform=platform, radix=-1)
如同第二點。
4. Visualize result for kneron inference on onnx
onnxVisualImageData = postProcess(onnxOutputData, inputImageData)
imshow(width=500, img=onnxVisualImageData)
這邊是 onnx 的 inference,所以這個與量化無關,與量化有關的是第二點與第三點。
關於 2、3、4 點,您是否可以提供可以執行的 Scptris 還有您的環境(ex. (1)cv2_imgproc、(2)yunet_utils、(3)image_10.jpg 這些等等),方便復現這些問題並 troubleshooting。
這裡的 API 是對 onnx inference,radix 可以不用加。
OK
關於 2、3、4 點,您是否可以提供可以執行的 Scptris 還有您的環境(ex. (1)cv2_imgproc、(2)yunet_utils、(3)image_10.jpg 這些等等),方便復現這些問題並 troubleshooting。
附於附件
@Wayne_Zhou@compal.com
Hi Wayne_Zhou,
我這邊執行您提供的 Script 是可以跑 2、3點的,不過我使用的 model 是根據您提供出來的線索這邊自己轉的,您是否也能提供一下您那邊 360x360 的 onnx (sim-cutPost-opt.onnx)、Bie (sim-cutPost-opt.quan.wqbi.bie) 跟 Nef (sim-cutPost-opt-kl{platform}.nef)。
您是否也能提供一下您那邊 360x360 的 onnx (sim-cutPost-opt.onnx)、Bie (sim-cutPost-opt.quan.wqbi.bie) 跟 Nef (sim-cutPost-opt-kl{platform}.nef)。
附於附件
@Andy Hsieh
請問還有缺少任何我這邊可以提供的資料?
@Wayne_Zhou@compal.com
Hi Wayne_Zhou,
關於使用您提供的資料,先前提到的 2、3 點,我這裡有復現出您的問題了,並且問題已經有把您的問題交給相關同仁也得到回覆了。
主要是 radix 出現的問題沒有錯,下一版的 Kneorn ToolChain 會改善此問題。
這邊建議您解決的辦法有三種:
至於先前提到的第四點 onnx inference 的問題 (Visualize result for Kneron and onnx Runtime inference on onnx 推論結果不一致),可能發生的問題是因為 Kneron inference 輸出的順序與 onnx runtime 不一樣,您可以參考 http://doc.kneron.com/docs/#toolchain/python_app/app_flow_manual/