部分安卓端ncnn模型推理输出数据存在大量-nan和nan的问题

原文issue链接:部分安卓端ncnn模型推理输出数据存在大量-nan的问题 · Issue #3607 · Tencent/ncnn (github.com)

问题描述

onnx、ncnn模型在pc端推理输出结果正确且基本一致,在部分安卓设备上使用同一模型和输入的推理输出数据正常,另一部分安卓端设备上存在大量-nan数值,且推理结果错误。

编译&运行环境

ncnn版本库:预编译库 20220216

PC端运行环境:Ubuntu 18.04 Intel Core i7 9700

Android端出现问题的运行环境:

1、Android 10.0 展锐 uis8581e

2、Android 11.0 高通 Snapdragon 855Plus

3、Harmony 2.0 麒麟 Kirin 980

解决方案

中间层累加可能有fp16溢出问题,对于累加有溢出的层强制用 fp32 计算,在加载后,重新用 fp32 性质初始化该层。(ncnn作者nihui的回复)或者直接像下面这样设置fp16计算。

cpp 复制代码
net.opt.use_fp16_storage = false;
net.opt.use_fp16_arithmetic = false;

net.opt.use_fp16_storage设置为false时,模型中的参数以及中间计算结果将会以浮点数的32位精度(即float32)进行存储。同样,当net.opt.use_fp16_arithmetic设置为false时,模型的计算也会以float32精度进行。默认情况下,这两个选项的值都为false,即使用float32精度。

启示

对于不同设备端如果在ncnn正确安装和能正常使用后(即推理代码正常编译和运行),如果推理结果不一致,那么就要考虑溢出的问题,一般来说对于fp16的模型加上上述两句,进行fp32推理是可以解决问题的。(至少我解决了一部分问题)。通过安卓端这个问题,也可以引申到其他如linux设备端推理类似问题的解决。

相关推荐
little_fat_sheep39 分钟前
【JNI】JNI基础语法
android
守城小轩1 小时前
Chromium 138 编译指南 - Android 篇:配置depot_tools(四)
android·浏览器自动化·指纹浏览器·浏览器rpa
maki0772 小时前
VR大空间资料 02 —— 常用Body IK对比
android·游戏引擎·vr·虚幻·pico·ik
QmDeve3 小时前
Android内存泄漏排查难?手把手带你用Profiler“揪出”元凶!(附实战案例)
android·android studio
WheatHusks5 小时前
android中调用相册
android
路上^_^14 小时前
安卓基础组件023-SharedPerferences
android
恋猫de小郭14 小时前
Fluttercon EU 2025 :Let‘s go far with Flutter
android·开发语言·flutter·ios·golang
Andytoms18 小时前
Android geckoview 集成,JS交互,官方demo
android·javascript·交互
2501_9159090620 小时前
iOS 抓包工具有哪些?实战对比、场景分工与开发者排查流程
android·开发语言·ios·小程序·uni-app·php·iphone
锋风1 天前
基于Binder的4种RPC调用
android