兄弟们,最近在搞端侧模型部署,从ONNX转NCNN到真机跑,踩了不少坑。先说说几个关键点,给刚入坑的指条路。
第一,模型量化别贪心。int8量化确实能省内存,但精度回退严重。我试过MobileNetV3,fp16精度掉0.5%,int8直接掉2%。建议先用fp16,再根据场景决定int8。
第二,算子兼容性是个大问题。ONNX转NCNN时,像GELU、LayerNorm这些高级算子经常报错。我踩过的坑:Transformer模型里的Softmax在NCNN里要手动调参,不然推理结果直接放飞。解决办法是先用onnx-simplifier优化,再手撸缺失算子。
第三,内存优化有门道。端侧设备通常只有几GB内存,模型加载时别一次性全塞。我用的方案是:分块加载+内存池,推理时按需释放。实测在骁龙8 Gen3上,内存占用从2GB降到800MB,延迟只多了5ms。
最后,测试环境别用模拟器。我在Android Studio里跑得好好的,上真机直接崩。后来发现是GPU驱动版本问题,建议直接上真机调。
抛个问题:你们在端侧部署时,遇到过哪些离谱的算子兼容性bug?来分享下,我备好瓜🍉。 |