编译支持使用GPU的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相关头文件和链接相关库文件。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Arnold-FY-Chen

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

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

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

打赏作者

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

抵扣说明:

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

余额充值