编译支持使用GPU的NCNN

本文详细介绍了NCNN与TensorRT在轻量级模型推理时的内存占用和速度差异,并分享了在资源有限的边缘设备上如何根据需求选择合适的推理框架。此外,还提供了一份详细的NCNN编译步骤,包括环境配置、Vulkan SDK的安装以及编译选项的设定,以帮助开发者在Jetson等平台上顺利构建和运行NCNN。
部署运行你感兴趣的模型镜像

       我个人的使用经验感觉,NCNN最大的优势在于运行模型推理时使用内存非常少,一个超轻量级的模型只需几十M的内存,而TensorRT下同一模型则需要几百个M的内存!NCNN这个优点是NVIDIA的TensorRT不能比的,TensorRT的优势就是模型推理时速度基本稳定,当然也比较快,FP32和FP16模式下占用内存和推理速度都有差异,NCNN下轻量级模型的FP32和FP16模式感觉推理速度和占用内存差异不明显,使用NCNN进行模型推理的速度有时波动有点大,但是比较占用的总内存很小,速度有时也不比使用TensorRT推理慢,所以在边缘端使用有的轻量级模型,NCNN还是有一定优势的,如果是重量级模型并且内存资源充裕只看重推理速度,那么使用TensorRT是更好的选择,如果不那么注重推理速度但非常在意对内存的占用,那么NCNN是个不错的选择,我们在Nano这样的小板子上要同时跑三四个模型,所以不得不一一实验,针对不同的模型的特点选择使用TensorRT或者NCNN.

      编译NCNN首先保证下面的环境支持包都已安装,否则执行下面的命令安装:

sudo apt install build-essential git cmake libprotobuf-dev protobuf-compiler libvulkan-dev vulkan-utils libopencv-dev

 如果上面安装的vulkan只有so库文件没有相关头文件,x86上可以直接到下载对应的vulkan sdk,Jetson上可以自己下载源码编译和制作vulkan sdk,参见 https://github.com/KhronosGroup/Vulkan-Loader.git

sudo apt-get update && sudo apt-get install git build-essential libx11-xcb-dev libxkbcommon-dev libwayland-dev libxrandr-dev cmake
git clone -b v1.2.141 https://github.com/KhronosGroup/Vulkan-Loader.git
cd Vulkan-Loader && mkdir build && cd build
../scripts/update_deps.py
cmake -DCMAKE_BUILD_TYPE=Release -DVULKAN_HEADERS_INSTALL_DIR=$(pwd)/Vulkan-Headers/build/install ..
make -j

cd Vulkan-Headers
ln -s ../loader lib

注意上面的最后两步,没有这两步在下面编译ncnn时是会报错的,因为前面的jetson上的编译并没有按照规范的vulkan sdk的目录结构生成和存放文件,所以需要手工将../loader链接到lib目录,才能保证lib和include都在同一级目录下,然后在下面设置VULKAN_SDK环境变量时设置为他们的父目录的路径即可。

然后,x86上假如你下载的sdk解压在/data/workspace/1.2.189,做如下环境变量VULKAN_SDK的设置: 

export VULKAN_SDK=/data/workspace/vulkan-1.2.189/x86_64

Jetson上假如你编译制作的vulkan sdk文件的路径是/home/ubuntu/Vulkan-Loader/build/Vulkan-Headers,则设置环境变量VULKAN_SDK如下:

export VULKAN_SDK=/home/ubuntu/Vulkan-Loader/build/Vulkan-Headers

然后下载ncnn的代码:

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

cd ncnn

一定要记得执行下面这步下载glslang和pybind等相关子目录下的源码:

git submodule update --init

然后手工修改CMakeLists.txt或者在命令行中增加相关define来打开vulkan:

option(NCNN_VULKAN "vulkan compute support" ON)

ncnn编译时默认编译成静态库libncnn.a,如果想编译成动态库,则修改打开这个选项:

option(NCNN_SHARED_LIB ON)

如果你是在x86上交叉编译用于jetson上的程序,还得记得设置这一项:

option(CMAKE_TOOLCHAIN_FILE "" ../toolchains/jetson.toolchain.cmake)

或者在执行命令时设置:

mkdir build && cd build
cmake -DCMAKE_TOOLCHAIN_FILE=../toolchains/jetson.toolchain.cmake -DCMAKE_BUILD_TYPE=Release -DNCNN_SHARED_LIB=ON -DNCNN_VULKAN=ON -DNCNN_BUILD_EXAMPLES=ON ..
make -j$(nproc)

如果是直接在jetson上编译,只需执行:

mkdir build && cd build
cmake -DCMAKE_BUILD_TYPE=Release -DNCNN_SHARED_LIB=ON -DNCNN_VULKAN=ON -DNCNN_BUILD_EXAMPLES=ON ..
make

编译时NCNN_BUILD_EXAMPLES打开了,所以编译完就可以执行build下的examples目录下的可执行程序。基于ncnn开发自己的跑模型的应用程序时,只需编译时包含相关头文件和链接libncnn.a或者libncnn.so即可。

如果程序需要用到glslang,记得编译前设置GLSLANG相关option即可,编译和链接时也得包含glslang相关头文件和链接相关库文件。

您可能感兴趣的与本文相关的镜像

TensorRT-v8.6

TensorRT-v8.6

TensorRT

TensorRT 是NVIDIA 推出的用于深度学习推理加速的高性能推理引擎。它可以将深度学习模型优化并部署到NVIDIA GPU 上,实现低延迟、高吞吐量的推理过程。

### 启用和使用 NCNNGPU 加速 为了在 NCNN 中启用并利用 GPU 计算能力,需遵循特定的配置流程。对于 Android 平台,在 Android Studio 中可以调用腾讯开源框架 NCNN 实现 YOLO-fastest 模型的目标检测功能,并且如果设备支持相应组件,则可以在设备上移植 NCNNGPU 库[^2]。 具体到 Jetson TX2 设备上的应用案例显示,通过 Vulkan API 可以成功实现在此类硬件平台上对 NCNNGPU 调用来完成推理任务[^3]。这表明 NCNN 支持多种不同类型的 GPU 接口用于加速计算过程。 #### 编译带有 GPU 支持NCNN 版本 编译时加入 GPU 支持是第一步操作。通常情况下,可以通过修改 CMakeLists.txt 文件中的选项来开启此特性。例如: ```cmake option(USE_VULKAN "Enable vulkan support" ON) ``` 这段代码片段展示了如何设置 `CMake` 配置项以激活 Vulkan 接口的支持,从而允许后续程序能够访问 GPU 功能[^4]。 #### 使用 GPU 执行网络前向传播 当已经拥有了一个具备 GPU 加速特性的 NCNN 构建版本之后,便可通过如下方式创建 Net 对象实例并将数据传递给它来进行预测运算: ```cpp #include <ncnn/net.h> using namespace ncnn; // 创建 net 实例对象 Net net; net.opt.use_vulkan_compute = true; // 开启Vulkan计算开关 // ...加载模型参数... Mat input_blob = Mat::from_pixels_resize(...); // 准备输入图像作为 blob 数据形式 Extractor ex = net.create_extractor(); ex.input("data", input_blob); std::vector<Mat> output_blobs; for (int i = 0; i < num_output_layers; ++i) { Mat out_blob; const char* layer_name = get_layer_names()[i]; ex.extract(layer_name, out_blob); output_blobs.push_back(out_blob); } ``` 上述代码段说明了怎样初始化一个含有 GPU 加速属性的 NCNN 网络实例 (`net`) ,并通过调整其内部选项变量 `use_vulkan_compute` 来指定采用哪种执行路径;接着准备待处理的数据集(这里假设是从像素矩阵转换而来),最后调用 `create_extractor()` 方法获取 Extractor 类型的对象以便于逐层提取特征图谱信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Arnold-FY-Chen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值