原文issue鏈接:部分安卓端ncnn模型推理輸出數(shù)據(jù)存在大量-nan的問題 · Issue #3607 · Tencent/ncnn (github.com)
問題描述
????????onnx、ncnn模型在pc端推理輸出結(jié)果正確且基本一致,在部分安卓設(shè)備上使用同一模型和輸入的推理輸出數(shù)據(jù)正常,另一部分安卓端設(shè)備上存在大量-nan數(shù)值,且推理結(jié)果錯誤。
編譯&運(yùn)行環(huán)境
ncnn版本庫:預(yù)編譯庫 20220216
PC端運(yùn)行環(huán)境:Ubuntu 18.04 Intel Core i7 9700
Android端出現(xiàn)問題的運(yùn)行環(huán)境:
1、Android 10.0 展銳 uis8581e
2、Android 11.0 高通 Snapdragon 855Plus
3、Harmony 2.0 麒麟 Kirin 980
解決方案
????????中間層累加可能有fp16溢出問題,對于累加有溢出的層強(qiáng)制用 fp32 計算,在加載后,重新用 fp32 性質(zhì)初始化該層。(ncnn作者nihui的回復(fù))或者直接像下面這樣設(shè)置fp16計算。
net.opt.use_fp16_storage = false;
net.opt.use_fp16_arithmetic = false;
????????當(dāng)net.opt.use_fp16_storage
設(shè)置為false
時,模型中的參數(shù)以及中間計算結(jié)果將會以浮點(diǎn)數(shù)的32位精度(即float32)進(jìn)行存儲。同樣,當(dāng)net.opt.use_fp16_arithmetic
設(shè)置為false
時,模型的計算也會以float32精度進(jìn)行。默認(rèn)情況下,這兩個選項(xiàng)的值都為false
,即使用float32精度。?文章來源:http://www.zghlxwxcb.cn/news/detail-573928.html
啟示
????????對于不同設(shè)備端如果在ncnn正確安裝和能正常使用后(即推理代碼正常編譯和運(yùn)行),如果推理結(jié)果不一致,那么就要考慮溢出的問題,一般來說對于fp16的模型加上上述兩句,進(jìn)行fp32推理是可以解決問題的。(至少我解決了一部分問題)。通過安卓端這個問題,也可以引申到其他如linux設(shè)備端推理類似問題的解決。文章來源地址http://www.zghlxwxcb.cn/news/detail-573928.html
到了這里,關(guān)于部分安卓端ncnn模型推理輸出數(shù)據(jù)存在大量-nan和nan的問題的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!