KL720 nef結果與dongle執行結果不同

我是使用KL720的使用者,因實驗室要求要把模型燒入到dongle KL720中,根據https://doc.kneron.com/docs/#toolchain/yolo_example/ 中的教學都沒問題,但是到了.py檔在dongle執行的結果就與onnx,bie,nef的結果不同,想請教是我有什麼錯誤嗎?

 

由於實驗室的model需保密以下我使用只有一層flatten的模型做模擬,但結果仍然一樣,步驟如下:

 

1.    使用的model為tensorflow 2.6版本,使用https://github.com/onnx/tensorflow-onnx/tree/r1.6 中的tf2onnx轉成onnx再去load。剩下步驟不變,最後結果input_shape(1,16,20,1) flatten output_shape(1,1,320,1)

2. 以確認 Step 9. Prepare Kneron PLUS (Don't do it in toolchain docker)的環境沒問題

3. step10. Run our yolo NEF on KL520 with Kneron PLUS,需使用未經前處理的data進入model,因此使用kp.GenericRawBypassPreProcImageHeader,參考這篇文章https://www.kneron.com/forum/discussion/comment/877#Comment_877

4. input的資料為(1,1,16,20) float32的資料,範圍在(0,1)之間

5. 目前不需後處理


想請問為什麼我只是一層flatten就有問題了。

Comments

  • @Stanley

    Hi Stanley,

    可能需要您提供 onnx、bie 與 nef model 以及 inference 的 .py 檔,方便確認原因。

    可以的話,您可以在這裡提供:Kneron_Driver

  • @Andy Hsieh

    感謝回復~

    我已經上傳onnx(tf2onnx and 經過優化的onnx)、bie 與 nef model 以及 inference 的 .py 檔

    目前遇到的問題為,dongle上flatten model出來的結果明顯與input data不同

  • edited August 2022

    @Stanley

    Hi Stanley,

    不好意思,您提供的 flatten_op.onnx model 的 input_shape(1,2,5) 與 output_shape(1,10) 與您描述的 input_shape(1,16,20,1) flatten output_shape(1,1,320,1) 有點差異,所以無法重現您的情況。

    針對 dongle上 flatten model 出來的結果明顯與 input data 不同,可能也需要請您多加描述一下發生的問題。

  • edited August 2022

    @Andy Hsieh

    抱歉我之前沒確認好,已經更改完成了

     

    由於實驗室使用的data需保密,因此皆使用 0~0.320 以0.001為間隔的data做模擬。

     

    以下述說流程:

     

    1.    使用temsorflow2.x 建一個只有flatten成的模型

    1.1.      Input shape 為 (1,16,20)

    1.2.      Get flatten.h5


    2.    使用 tf2onnx package將flatten.h5轉成flatten.onnx (1、2的過程 flatten.ipynb)


    3.    根據yolo example 將模型轉乘(flatten_op.onnx, output.bie,model_720.nef),過程:(flatten2nef.py)

    3.1    轉為flatten_op.onnx的過程中有使用.pop()刪除最後一層,這樣才能執行下一步。

    3.2    flatten_op.onnx的input_shape = (16,20,1)

    3.3    output.bie的input_shape = (16,20,1)

    3.4    model_720的input_shape = (16,20,1)


    4.    使用kneron_plusv2.0.0執行dongle結果 (KL720_CNN_200_flatten.py)

    4.1    使用不須前處理的版本

    4.2 此時input shape 為 (1,1,16,20)

    4.3    最後結果明顯不是經過flatten的樣子

     

     

    其他問題:

    1.    Tensorflow 2.x 或是keras 2.6版本是否可在dongle執行

    2.    Input 為float是否可以用無前處理的方式在dongle執行

    3.    dongle是否會有硬體殘留,比方說,一直用相同id上傳不同model到dongle會產生錯誤嗎?

    4.    Bie 的精度調整有可以參考的地方嗎?

    5 請問你展開onnx model是用甚麼程式?

  •  dongle上 flatten model 出來的結果明顯與 input data 不同是指:

    input data:

    output:

    以上只是擷取一部份,但可以明顯看出並不是flatten的結果。

  • @Stanley

    Hi Stanley,

    1.  Tensorflow 2.x 或是 keras 2.6 版本是否可在 dongle 執行

    dongle 的執行與 Tensorlfow 2.x 或是 Keras 2.6 版本是沒有相關的,"Tensorflow 2.x 或是 keras 2.6 版本"相關聯的是 Kneron Toolchain 的部分,dongle 的執行與 Kneorn Plus 較有直接的相關,目前的版本有 Kneron Plus 1.x or Kneron Plus 2.0。

    2.  Input 為 float 是否可以用無前處理的方式在 dongle 執行

    目前無法使用無前處理的方式在 dongle 上執行,基本上您的 model 使用 Kneron Toolchain 使 onnx convert 成 nef 的時候一定須經過量化 (Quantization)。

    3.  dongle 是否會有硬體殘留,比方說,一直用相同 id 上傳不同 model 到 dongle 會產生錯誤嗎?

    dongle 基本上不會有硬體殘留的問題。

    4.  Bie 的精度調整有可以參考的地方嗎?

    Bie 精度調整的地方基本上是透過使用 Kneron Toolchain 時,將 model 經過量化 (Quantization) ,量化資料通常都會找跟您模型訓練與推論應用相關的 data 去做量化。

    5.  請問你展開 onnx model 是用甚麼程式?

    您可以使用 Netron (https://netron.app/) 使您的 model 可視化。

    至於 dongle上 flatten model 出來的結果明顯與 input data 不同這個問題,通常理論上 input 通過 model inference,output 本來也會有所不同,可是您提供的 flatten 這個 case 經過確認後的確會發生與您相同的問題,這部分已經提交到相關同事去做詳細的確認與改善,有消息會再通知您。

  • @Andy Hsieh

    感謝回復。

    針對第2點:Input 為 float 是否可以用無前處理的方式在 dongle 執行。

    我是指使用https://www.kneron.com/forum/discussion/comment/877#Comment_877 這篇文章發布者使用的方法,我的data已經經過我自己的前處理,得到的為float,範圍(0,1),並有量化到bie中,因此在KL720_CNN_200_flatten.py中並沒有使用plus寫好的前處理,而是使用

    的方式。

    其中有一步是將data轉成bytes,在這裡我不確定會不會因為data是float而產生錯誤。

  • edited August 2022

    @Stanley

    Hi Stanley,

    已確認這裡應該部會是因為 data 是 float 而產生的錯誤,關於您提供的 Flatten model (flatten_op.onnx) 轉成 .nef model 後,.nef model 已經可以順利在 dongle 上有正確的 output 了。 

    不過需要請您使用目前 Kneron PLUS 的最新版本 kneron_plus_v2.0.1 (下載連結可參考:https://www.kneron.com/tw/support/developers/), prepare the pre-processed data for NPU inference 的部分,您可以參考 kneron_plus_v2.0.1\kneron_plus\python\example 內的 KL720DemoGenericDataInference.py。

  • @Andy Hsieh

    感謝你的回覆,

    不好意思,能不能請你提供你們寫的.py檔,我自己寫出來的結果還是有問題。

  • edited August 2022

    @Stanley

    Hi Stanley,

    這裡 附上檔案 裡面有 (KL720_CNN_200_flatten_AndymodiV2.py) 可供您參考,裡面有一些註解,希望可以幫到您。

The discussion has been closed due to inactivity. To continue with the topic, please feel free to post a new discussion.