vulkan 利用GPU加速ENet

《vulkan 利用GPU加速ENet》

  Vulkan是一个跨平台的2D和3D绘图应用程序接口是做高性能图像渲染的,可以使用GPU对图像渲染进行性能优化,ncnn提供了使用vulkan的接口,可以vulkan来使用GPU对模型推理进行加速。具体做法是使用caffe训练ENet模型,然后转为ncnn,caffe 代码地址:https://github.com/TimoSaemann/ENet

Key Words:ncnn、vulkan、加速ENet


Beijing, 2020

作者:RaySue

Agile Pioneer  

我本机的gpu型号是NVIDIA的Quadro P600

环境说明

vulkan的使用和显卡的驱动是有关系的,

亲测可用版本
Driver Version: 440.36

不可用版本
Driver Version: 440.82

下载vulkan的安装包之后,解压缩tar -zxvf vulkanxxx,然后进入x86_64/bin执行
./vulkaninfo

必要的依赖库:
libGLX_nvidia.so.0,而这个依赖库在440.82版本的驱动找不到,所以不可用。


合并卷积和BN层

ncnn在转换模型的时候都会经历这个操作,原理非常简单,就是把一些运算离线做好,能够提升一点效率。


使用vulkan加速

Build for Linux x86

install g++ cmake protobuf

(optional) download and install vulkan-sdk from https://vulkan.lunarg.com/sdk/home

$ wget https://sdk.lunarg.com/sdk/download/1.1.92.1/linux/vulkansdk-linux-x86_64-1.1.92.1.tar.gz?Human=true -O vulkansdk-linux-x86_64-1.1.92.1.tar.gz
$ tar -xf vulkansdk-linux-x86_64-1.1.92.1.tar.gz

# setup env
$ export VULKAN_SDK=`pwd`/1.1.92.1/x86_64

$ cd <ncnn-root-dir>
$ mkdir -p build
$ cd build

# cmake option NCNN_VULKAN for enabling vulkan
$ cmake -DNCNN_VULKAN=ON ..

$ make -j4
$ make install

使用vulkan

需要引用头文件

#include <gpu.h>

必要的语句

// initialize when app starts
ncnn::create_gpu_instance();// line1

// enable vulkan compute feature before loading
ncnn::Net net;
net.opt.use_vulkan_compute = 1;// line2
// some choices of vulkan
net.opt.num_threads = 1;
net.opt.use_fp16_packed = false;
net.opt.use_fp16_storage = false;
net.opt.use_fp16_arithmetic = false;
net.opt.use_int8_storage = false;
net.opt.use_int8_arithmetic = false

// deinitialize when app exits
ncnn::destroy_gpu_instance();// line3

vulkan加速ENet

CMakeLists.txt

    # ncnn
    include_directories(/home/surui/Downloads/software/ncnn-master/build/install/include/ncnn)
    link_directories(/home/surui/Downloads/software/ncnn-master/build/install/lib)

    # ncnn vulkan
    include_directories(/home/surui/Downloads/software/vulkansdk-linux-x86_64-1.1.92.1/x86_64/include)
    link_directories(/home/surui/Downloads/software/vulkansdk-linux-x86_64-1.1.92.1/x86_64/lib)

构建ENet模型

  • 构建头文件
#include <opencv2/opencv.hpp>
#include <net.h>
#include <gpu.h>

class Segmentation {
public:
    Segmentation(const std::string& param_path, const std::string& model_path);

    ~Segmentation();

    cv::Mat segment(const cv::Mat& img);


protected:
    ncnn::Net model; // ncnn model

    int resizeWidth;
    int resizeHeight;
    bool isResize;
};
  • 编写源文件
Segmentation::Segmentation(const std::string &param_path, const std::string &model_path)
{
    // initialize when app starts
    ncnn::create_gpu_instance();

    // enable vulkan compute feature before loading
    model.opt.use_vulkan_compute = 1;

    model.load_param(param_path.c_str());
    model.load_model(model_path.c_str());

    resizeWidth = 360;
    resizeHeight = 480;
}

Segmentation::~Segmentation(){
    ncnn::destroy_gpu_instance();
}


cv::Mat Segmentation::segment(const cv::Mat &img)
{
    ncnn::Mat inputMat;
    inputMat = ncnn::Mat::from_pixels_resize(img.data, ncnn::Mat::PIXEL_BGR, img.cols, img.rows, resizeWidth, resizeHeight);
    
    ncnn::Extractor extractor = model.create_extractor();
    extractor.set_num_threads(6);
    extractor.input("data", inputMat);
    ncnn::Mat outputMat;
    extractor.extract("deconv6_0_0", outputMat);

    cv::Mat predMask = cv::Mat::zeros(cv::Size(outputMat.w, outputMat.h), CV_8UC1);
	// 分割为两类的情况
    ncnn::Mat chn_0 = outputMat.channel(0);
    ncnn::Mat chn_1 = outputMat.channel(1);
    for(int i = 0; i < outputMat.h; ++i)
    {
        const float* pCh0 = chn_0.row(i);
        const float* pCh1 = chn_1.row(i);
        uchar *Mask = predMask.ptr<uchar>(i);
        for(int j = 0; j < outputMat.w; ++j){
            Mask[j] = pCh0[j] > pCh1[j] ? 0 : 255;
        }
    }
    return Mask;
}

结果对比

ncnn cpu结果

ENet latency : 1090.02 ms

ENet latency : 1097.74 ms

ENet latency : 1092.15 ms

vulkan加速结果

[0 Quadro P600] queueC=2[8] queueT=1[2] buglssc=0 [0 Quadro P600] fp16p=1 fp16s=1 fp16a=0 int8s=1 int8a=1

ENet latency : 32.948 ms

ENet latency : 30.621 ms

ENet latency : 36.082 ms


在加速ENet分割模型上效果明显。


错误整理

Q:
vkCreateInstance failed -9

A:
apt install mesa-vulkan-drivers

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值