【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱: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,这个时候就可以用它们进行深度学习开发,相信也会很大程度上提高自己产品的竞争力。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐