【NCNN】腾讯ncnn推理框架的简介及安装

系统配置

操作系统:Linux(银河麒麟)
编译器:C++编译器(如g++)
cpu:飞腾

ncnn简介

ncnn(Ncnn Convolutional Neural Network)是一个轻量级的高性能深度学习框架,由腾讯公司开发。它专门为移动设备和嵌入式设备优化,旨在提供高效的推理性能和低内存占用。
以下是ncnn的一些主要特点和优势:

轻量级和高性能:ncnn被设计为轻量级框架,具有高效的推理性能。它使用优化的计算图和内存管理策略,以最大程度地减少内存占用和计算开销。

跨平台支持:ncnn支持多种操作系统和硬件平台,包括Android、iOS、Linux、Windows等。它可以在不同的处理器架构上运行,如ARM、x86和MIPS等。

硬件加速支持:ncnn提供对多种硬件加速库的支持,包括OpenMP、Vulkan、ARM Compute Library和Metal等。这些硬件加速库可以提供更高的计算性能,同时保持较低的功耗。

灵活的模型转换工具:ncnn提供了模型转换工具,可以将主流深度学习框架(如Caffe、TensorFlow、ONNX等)的模型转换为ncnn的模型格式。这使得用户可以方便地在ncnn上部署已有的模型。

开源和活跃的社区支持:ncnn是开源的,其源代码托管在GitHub上。它拥有一个活跃的社区,用户可以在社区中获取支持、提问问题和贡献代码。
总而言之,ncnn是一个专注于移动设备和嵌入式设备的高性能深度学习框架。它的轻量级和高效性能使得它在资源受限的环境中具有很好的应用潜力,特别适用于移动应用、嵌入式设备和边缘计算等场景。

ncnn安装步骤

1.下载ncnn源代码

git clone https://github.com/Tencent/ncnn.git

2.进入ncnn源代码目录

cd ncnn

3.创建build目录并进入

mkdir build
cd build

4.配置编译参数

cmake ..

可以根据需要添加一些选项,例如:

-DNCNN_VULKAN=ON:启用Vulkan支持

-DNCNN_OPENMP=ON:启用OpenMP支持

-DNCNN_PIXEL_ROTATE=ON:启用像素旋转支持

-DNCNN_PIXEL_AFFINE=ON:启用像素仿射变换支持

-DNCNN_BUILD_EXAMPLES=ON:编译示例代码

添加编译选项后,但是开启下列编译选项后,也应下载补充包:

cmake -DCMAKE_BUILD_TYPE=Release -DNCNN_SYSTEM_GLSLANG=ON -DNCNN_VULKAN=ON -DNCNN_OPENMP=ON -DNCNN_PIXEL_ROTATE=ON -DNCNN_PIXEL_AFFINE=ON -DNCNN_BUILD_EXAMPLES=OFF ..

在ncnn根目录,使用下列命令,补全模块即可:

git submodule update --init

在Git中,子模块是指一个Git仓库嵌套在另一个Git仓库中的情况。通常情况下,主项目仓库会使用子模块来引用其他的仓库作为依赖项或子项目。
使用git submodule update --init命令可以执行两个操作:

初始化子模块:如果主项目中包含子模块的引用,但是子模块的内容尚未下载到本地,那么这个命令会将子模块的内容下载到本地,并将子模块初始化为一个可用的Git仓库。

更新子模块:如果主项目中的子模块已经存在于本地,并且在远程仓库中有新的提交,那么这个命令会将子模块更新到最新的提交。
总而言之,git submodule update --init命令用于初始化和更新主项目中的子模块,确保子模块的内容是最新的,并可供主项目使用。

5.编译ncnn

make -j8

6.安装ncnn

sudo make install

7.配置环境变量
将ncnn的库路径添加到LD_LIBRARY_PATH环境变量中,例如:

export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH

ncnn即安装完毕。

onnx模型转ncnn模型

模型转换:在线常用的模型转换地址

https://convertmodel.com/#outputFormat=ncnn

命令行转换的模式:

./onnx2ncnn model.onnx model.param model.bin## ncnn推理示例

如果想在编译时,顺带生成onnx2ncnn工具,需要在编译ncnn前安装protobuf库,不然不会生成:

protobuf库安装

下载地址:

wget https://github.com/protocolbuffers/protobuf/releases/download/v3.4.0/protobuf-cpp-3.4.0.zip
unzip /home/kylin/ncnnbuild2/protobuf-cpp-3.4.0.zip
cd protobuf-3.4.0/
./configure
make -j16
make install

如果想做出fp16模型,可使用模型优化工具,使用方法如下:

./ncnnoptimize ncnn.param ncnn.bin new.param new.bin flag
注意这里的flag指的是fp32和fp16,其中0指的的是fp32,1指的是fp16
#include <iostream>
#include "net.h"
int main() {
    
    
    // 创建ncnn网络对象
    ncnn::Net net;
    // 加载ncnn模型和参数文件
    std::string model_path = "model.param";
    std::string weights_path = "model.bin";
    net.load_param(model_path.c_str());
    net.load_model(weights_path.c_str());
    // 创建输入数据
    ncnn::Mat input = ncnn::Mat::from_pixels(image_data, ncnn::Mat::PIXEL_BGR, image_width, image_height);
    // 创建输出数据
    ncnn::Mat output;
    // 设置输入数据
    ncnn::Extractor ex = net.create_extractor();
    //设置推理的轻量模式
    ex.set_light_mode(true);
    ex.input("input", input);
    // 进行推理
    ex.extract("output", output);
    // 处理输出结果
    float* result = output.channel(0);
    // ...
    // 释放资源
    net.clear();
    return 0;
}

注:
ex.set_light_mode(true);是用来设置ncnn::Extractor的轻量模式(light mode)。
在ncnn中,轻量模式是一种优化选项,它可以在一定程度上减少内存消耗和计算量,以提高推理速度。轻量模式通常会牺牲一些推理精度,但对于一些实时性要求较高的应用场景,这种性能优化是很有价值的。
设置ex.set_light_mode(true);后,Extractor对象在进行模型推理时,会尽量使用轻量化的算法和数据结构,以减少内存和计算资源的使用。但需要注意的是,轻量模式可能会影响模型的推理精度,因此在使用轻量模式时应谨慎选择,根据实际需求进行权衡。
如果不需要使用轻量模式,可以将ex.set_light_mode(true);改为ex.set_light_mode(false);或者省略这一行代码,默认情况下即为关闭轻量模式。

猜你喜欢

转载自blog.csdn.net/hh1357102/article/details/131831741