自己动手写深度学习框架(ncnn编译)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 如果需要把深度模型部署到嵌入式设备上面,一般来说只有两种办法。一种办法,就是厂家有对应的npu支持框架,这个时候把对应的模型翻译成厂家的框架,直接调用厂家的sdk就可以了。还有一种办法,就是厂家没有专门的gpu/npu/dsp,这个时候如果需要深度学习模型,就只能通过cpu来完成,
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
如果需要把深度模型部署到嵌入式设备上面,一般来说只有两种办法。一种办法,就是厂家有对应的npu支持框架,这个时候把对应的模型翻译成厂家的框架,直接调用厂家的sdk就可以了。还有一种办法,就是厂家没有专门的gpu/npu/dsp,这个时候如果需要深度学习模型,就只能通过cpu来完成,ncnn框架就是不错的一个选择。

1、为什么是ncnn
ncnn对嵌入式平台做了深度优化,特别适合模型的部署。本身又是开源代码,使用起来十分方便。
2、ncnn可以做训练吗
ncnn只能用来做推理,不可以做训练。通常都是pytorch、tensorflow训练好,再port到嵌入式板子上面,转换成ncnn可以识别的model形式。
3、ncnn怎么下载
需要编译ncnn,需要分两部分下载。第一部分,就是ncnn代码,下载地址如下所示,
https://github.com/Tencent/ncnn
还有一部分就是glslang,这部分可以从下面这个地址下载。下载好了解压、copy到glslang目录即可,
https://github.com/nihui/glslang/tree/8cd77a808d0bffa442ae9462d5e3a8141892ba5a
4、编译过程
这里介绍的,是ncnn在树莓派4b下面的编译过程。整体过程还是比较顺利的,和一般的cmake工程编译没有多大区别,
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Release -DNCNN_VULKAN=ON -DNCNN_BUILD_EXAMPLES=ON ..
make
不同的编译工具,调用toolchains下面对应的cmake文件就好,比如如果是arm a7,
cd <ncnn-root-dir>
mkdir -p build-arm-linux-gnueabihf
cd build-arm-linux-gnueabihf
cmake -DCMAKE_TOOLCHAIN_FILE=../toolchains/arm-linux-gnueabihf.toolchain.cmake ..
make
5、编译生成了哪些内容
整个生成过程还是比较简洁明了的,
首先是编译生成了libSPIRV.a、libGenericCodeGen.a、libMachineIndependent.a、libglslang.a、libglslang-default-resource-limits.a、libOSDependent.a等几个静态库文件,
接着就是编译的重点,生成libncnn.a,
后面则是若干个测试文件的生成,比如benchncnn、squeezenet、fasterrcnn等,
最后就是生成模型翻译工具,比如caffe2ncnn、mxnet2ncnn、darknet2cnn等工具。
6、测试验证
为了验证编译生成的工具是否可以运行,可以找一个程序实际运行下,比如这里的benchncnn。
feixiaoxing@raspberrypi:~/Desktop/ncnn/ncnn-master $ cd benchmark/
feixiaoxing@raspberrypi:~/Desktop/ncnn/ncnn-master/benchmark $ ../build/benchmark/benchncnn 64 1 0 -1 0
loop_count = 64
num_threads = 1
powersave = 0
gpu_device = -1
cooling_down = 0
squeezenet min = 72.52 max = 73.78 avg = 72.98
squeezenet_int8 min = 62.14 max = 63.22 avg = 62.52
mobilenet min = 123.43 max = 124.56 avg = 123.78
mobilenet_int8 min = 81.36 max = 82.59 avg = 81.77
mobilenet_v2 min = 91.97 max = 93.58 avg = 92.36
mobilenet_v3 min = 71.77 max = 73.31 avg = 72.10
shufflenet min = 47.50 max = 49.14 avg = 47.75
shufflenet_v2 min = 40.39 max = 40.85 avg = 40.55
mnasnet min = 83.47 max = 86.09 avg = 84.00
proxylessnasnet min = 99.99 max = 101.66 avg = 100.64
efficientnet_b0 min = 132.68 max = 133.91 avg = 133.03
efficientnetv2_b0 min = 154.49 max = 156.29 avg = 155.11
regnety_400m min = 101.24 max = 102.60 avg = 101.72
blazeface min = 12.99 max = 13.50 avg = 13.25
googlenet min = 233.06 max = 234.94 avg = 233.43
googlenet_int8 min = 193.85 max = 195.51 avg = 194.33
resnet18 min = 179.12 max = 182.51 avg = 179.57
resnet18_int8 min = 137.86 max = 141.70 avg = 138.25
alexnet min = 137.96 max = 138.71 avg = 138.23
vgg16 min = 1016.87 max = 1025.68 avg = 1021.08
vgg16_int8 min = 822.29 max = 826.62 avg = 824.83
resnet50 min = 514.12 max = 515.88 avg = 514.75
resnet50_int8 min = 397.96 max = 399.98 avg = 398.91
squeezenet_ssd min = 173.25 max = 175.33 avg = 174.31
squeezenet_ssd_int8 min = 141.76 max = 143.97 avg = 142.64
mobilenet_ssd min = 247.24 max = 252.07 avg = 248.09
mobilenet_ssd_int8 min = 164.98 max = 165.82 avg = 165.32
mobilenet_yolo min = 550.38 max = 561.18 avg = 556.88
mobilenetv2_yolov3 min = 308.08 max = 314.39 avg = 311.41
yolov4-tiny min = 355.10 max = 356.79 avg = 356.00
nanodet_m min = 108.18 max = 111.40 avg = 109.65
yolo-fastest-1.1 min = 57.16 max = 60.50 avg = 58.22
yolo-fastestv2 min = 47.43 max = 48.71 avg = 47.94
7、其他方案
目前纯cpu方案来说,ncnn还是使用比较方便的。虽然说现在带npu的soc越来越多,但是不带npu的soc更多,存量更大。所以说,这些不带npu的soc肯定不少,它们肯定也是有深度学习需求的。有了ncnn,这个时候就可以用它们进行深度学习开发,相信也会很大程度上提高自己产品的竞争力。
更多推荐
所有评论(0)