rknn轉換wenet,chunk輸出正常而cache輸出異常的bug調試記錄(上)
問題就是板端encoder輸出的有三個值,chunk,attcache,cnncache,只有chunk的精度是正常的,兩個cache掉精度很嚴重,這里來調試一波!
用rknn分析工具說是第一層的layernorm有問題,但是layernorm只影響了chunk的輸出,對cache影響不大,如果是layernorm有問題,那么chunk的輸出也不會是0.999的準確度,所以先不管分析工具
首先確定attcacahe的出口,發(fā)現(xiàn)是在每層的selfattn,而且只涉及兩個linear+一個cat

每次輸出的new att cache都是k和vcat后的輸出,而k和v是chunk經過不同的linear生成的
每次selfattn輸入如下:

qkv都是相同的,因為我們最終的chunk是正確的,所以按理說這里的qkv和板端的輸出是一致的,所以先找第0層encoder在onnx中的位置,然后尋找板端逐層輸出的結果取出來
在selfattn外,x先經過了一個layernorm名字叫mha,所以就找這一層的輸出:


很輕松找到了這個輸出,在模型中計算余弦相似度

然而卻是負的,說明我找錯了板端輸出,果然,這個rknn的runtime輸入的chunk和torch的chunk都不一樣:

震驚,原來沒找錯,是因為我torch輸入的語音和rknn的不一樣...(好丟人,趕緊寫下來教訓一下自己)修正后此處的余弦為0.9999是正確的,但是selfattn的輸入還是不對

然而位置是正確的:

就是這個值啊
再往前追,第一次輸入encoder的值是正確的,也就是encoders.0的輸入:

接下來他就要經過模生的第一個layernorm了,看看結果:
結果果然不對....而且和rknn分析工具的結果一致:


所以問題又來了,rknn工具給出的最終chunk的輸出精度也很低

但實際chunk精度正常,所以真相只有一個!

這個工具逐層分析的結果,板端輸出的不是runtime的結果,不然根本對不上