yolov7 nef轉換
請問yolov7的SiLU operator為什麼不能轉換?
我參考了support operator table,sigmoid和Mul兩個都是支援的,SiLU轉換成ONNX也是拆解成這兩個operator
https://doc.kneron.com/docs/#toolchain/appendix/operators/
我也測試單獨sigmoid和Mul是可以轉換的,但x * torch.sigmoid(x) 卻無法轉換
目前是升級到toolchain v0.24.0 但我先前使用v0.19.0是可以轉換的
我發現在v0.20.0之後就無法轉換這樣的運算
請問需要做什麼修改才能像v0.19.0一樣可以轉換,還是升級後這樣的運算子就不能使用了?
The discussion has been closed due to inactivity. To continue with the topic, please feel free to post a new discussion.
Comments
Hello,
若使用的是KL720的話,Mul與Sigmoid都要是可以轉換的才對,會方便請您提供onnx模型讓我們這邊分析後再跟您回報嗎?
上述用到toolchain的是latest,可能有誤
剛剛重新下載v0.24.0的toolchain
好像是可以成功轉換bie
但仍會有下述error
Failure for model "yolov7_opt/yolov7_opt" when running "kdp720/HW not support"
這個是測試裁剪過後的onnx(並不是完整模型)
https://drive.google.com/file/d/1HS766EdjQQ8qnqwBeKPe51o5ry0T3Ckg/view?usp=drive_link
我好像是遇到跟這篇一樣的問題
https://www.kneron.com/forum/discussion/comment/1314#Comment_1314
裡面的建議是把feature map調小
feature map調小會導致準確率下降
但相同的模型我可以在v0.19.0轉換 但v0.24.0卻會超過硬體限制
還是我有其他參數可以修改?
@sphuang
Hi Sphuang,
因為我們的 NPU 有 DRAM address 的限制,所以某些模型需要將 feature map 調小。
如果您覺得 feature map 可能會影響精度,您可以嘗試將一個模型拆分成兩個模型 (可嘗試從中間切一半) 分別去生成 nef 看看,並且在最後 Combine NEF。
Combine NEF 的方法可以參考:
https://doc.kneron.com/docs/#toolchain/manual_5_nef/#5-nef-workflow (5.3. NEF Combine (Optional))
https://doc.kneron.com/docs/#toolchain/appendix/nef_utils_guide/
@Albert Chung
Hi Andy
我上面提供的onnx模型已經是切一半的模型了,但還是無法轉換
目前觀察到的點主要是activation function如果是x * torch.sigmoid(x) 就無法轉換,需調整輸入大小
若改成torch.sigmoid(x)就可以轉換,且不須調整輸入大小(384*640)
我疑惑的點是只差一個乘法運算 DRAM address 會有這麼大的差異嗎?
另外為何舊版的toolchain可以轉換但新版的不行,是因為轉換機制有改動嗎?
@sphuang
Hi Sphuang,
方便的話,是否可以也請您提供一下 activation function 是 torch.sigmoid(x) 的 onnx 模型。
相關問題我這邊也一起幫您回報給相關公司同仁,一有消息再回復您。
@Andy Hsieh
HI Andy
連結是將上面提供的模型替換activation function 為torch.sigmoid(x) 的 onnx 模型
https://drive.google.com/file/d/1WykBvQ0yZFbaVfw1C4dkOjkY-rytdtVy/view?usp=sharing
該onnx模型有確認是能夠成功轉換成nef的
再麻煩幫忙確認為何x * torch.sigmoid(x) 無法轉換
謝謝
您好,
關於toolchain版本,請在v0.24.0的設定確認analysis (workspace/miniconda/lib/python3.7/site-packages/ktc/toolchain.py)裡面的這些設定是8-bit (int8):
(v0.19.0是都是用8-bit)
如果用mix mode或其他選項,toolchain會自動判斷哪些node用8-bit,哪些用16-bit,效果比較好
@Maria Chen
Hi Maria
將上述四個參數修改為int8後此模型一樣是不能轉換
https://drive.google.com/file/d/1HS766EdjQQ8qnqwBeKPe51o5ry0T3Ckg/view?usp=drive_link(x * torch.sigmoid(x) )
請問你們是有轉換成功的嗎?
如果有可以提供轉換的腳本做測試嗎?
後來提供只有torch.sigmoid(x)的模型在調整參數前就可以轉換了
https://drive.google.com/file/d/1WykBvQ0yZFbaVfw1C4dkOjkY-rytdtVy/view?usp=sharing
您好,
不好意思,我們也轉換失敗了。請嘗試在剛才的toolchain.py將datapath_bitwidth_mode設定成"all int8"
datapath_bitwidth_mode="all int8"
我有試試看,這個有轉換成功。v0.24.0的算法有做過提升,雖然設定值是int8,有一些operator還是會使用int16,所以要用"all int8"