【Android-NCNN-Vulkan】记录⼀次ncnn-vulkan在低性能开
发板上出。。。
模型作⽤:⼈脸关键点检测
android11适配机型原模型:del
转化后:ncnn *.param *.model
主⼲⽹络:shufflenet v2
CPU:ARM A53 2.0GHz 2G MEM
GPU:IMG GE 8300
问题描述:
加载两个模型--⼈脸检测和⼈脸关键点检测
⼈脸检测模型: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 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 concat_splitncnn_0 pool1 0=1 4=1
可以在确保正确forward的同时,在该硬件环境上推理速度上升30ms。load model速度慢问题,参见 。
【PS】复现vulkan average pooling 内存溢出问题:
pool.proto
7767517
2 2
Input            images  0 1 images 0=13 1=13 2=1024
Pooling          pool1  1 1 images pool1 0=1 1=12 11=12 2=12 12=12 5=1
unsigned char m[16];
std::string param = "/pool.proto";
Net->load_param(param.c_str());
Net->load_model(m);
设置kernal 和 stride  >=13 时,在本次记录的配置中,出现内存溢出

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。