部分安卓端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设备端推理类似问题的解决。

相关推荐
张拭心2 小时前
春节后,有些公司明确要求 AI 经验了
android·前端·人工智能
张拭心2 小时前
Android 17 来了!新特性介绍与适配建议
android·前端
Kapaseker4 小时前
Compose 进阶—巧用 GraphicsLayer
android·kotlin
黄林晴5 小时前
Android17 为什么重写 MessageQueue
android
阿巴斯甜1 天前
Android 报错:Zip file '/Users/lyy/develop/repoAndroidLapp/l-app-android-ble/app/bu
android
Kapaseker1 天前
实战 Compose 中的 IntrinsicSize
android·kotlin
xq95271 天前
Andorid Google 登录接入文档
android
黄林晴1 天前
告别 Modifier 地狱,Compose 样式系统要变天了
android·android jetpack
冬奇Lab2 天前
Android触摸事件分发、手势识别与输入优化实战
android·源码阅读
城东米粉儿2 天前
Android MediaPlayer 笔记
android