【Android-NCNN-Vulkan】记录一次ncnn-vulkan在低性能开发板上出现的native内存溢出的问题

模型作用:人脸关键点检测

原模型:tensorflow pb.model

转化后:ncnn *.param *.model

主干网络:shufflenet v2

CPU:ARM A53 2.0GHz

GPU:IMG GS 8200

问题描述:

加载两个模型--人脸检测和人脸关键点检测
人脸检测模型:ssd,param 10kb,model 509kb,cpu load param 需要1.7ms,load model 需要 19ms;
但是,使用vulkan load param 需要 32s,load model需要55s,一个初始化需要将近2min;

人脸关键点检测模型:shufflenet v2,param 40kb, model 2.5Mb, cpu load param 需要 5ms,load model 需要 10ms;
但是,使用vulkan load param 需要32s,load model时,mem 中native 狂飙,直接被杀死,导致初始化失败。

内存泄漏问题描述:

主干采用shufflenet v2,最后三层为reduce,由于vulkan不支持reduce,因此用如下方法代替

Pooling pool1 1 1 ShuffleNetV2/Stage2/concat_splitncnn_0 pool1 0=1 1=20 11=20 2=20 12=20 5=1


但是在vulkan ncnn load model 执行到 pipeline.cpp 469行

VkResult ret = vkCreateComputePipelines(vkdev->vkdevice(), 0, 1, &computePipelineCreateInfo, 0, &pipeline);


内存崩掉了,然后被系统强杀。

 

内存泄漏原因分析:

0=1 表示average pool,1和11表示kernal的h和w,2和12表示pad的h和w,以此来代替reduce操作,该方法在ncnn arm cpu 上能够得到正确的结果,但是在vulkan gpu上内存会出现上述问题。

内存泄漏替换方案:

Pooling pool1 1 1 ShuffleNetV2/Stage2/concat_splitncnn_0 pool1 0=1 4=1


可以在确保正确forward的同时,在该硬件环境上推理速度上升30ms。

 

load model速度慢问题,暂时未得到解决方法。

 

详细问题参见:https://github.com/Tencent/ncnn/issues/1874

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章