OpenVINO不仅支持广泛的已知深度学习架构(Caff,TensorFlow等),还支持用户自定义CNN 算法,拥有良好的可扩展性。要使用用户自定义功能就要使用到Inference Engine Kernels Extensibility扩展功能,不仅支持硬件CPU,GPU加速还支持VPU版本加速,本节主要讲述VPU版本实现的过程

要实现用户自定义版本功能,首先需要熟悉opencl并行计算编程,因为整个算法的kernel编写是基于opencl,主要步骤如下:

1:首先编写算法opencl kernel,单独写成.cl文件(根据本人经验,可以使用intel Opencl SDK 先在CPU上进行验证, interl opencl SDK安装参考 https://blog.csdn.net/weixin_42730667/article/details/99872131,如果对opencl不熟悉,可以参考本人的opencl专栏 )

2:利用 opencl VINO的 clc编译器 进行离线编译,编译成.bin文件。(神奇吧,之前我们理解 opencl 编译 只能提交到device上进行编,换个思路,之后是不是可以通过clc编译提前验证kernel的编译错误)。

3: 编写.xml配置文件,将opencl kernel通过xml绑定到IR上。

4:通过IR将配置文件 将xml文件下载到Inference engine中。

Opencl Kernel算法

opencl kernel编写和正常的GPU kernel编写一样,如果有对opencl不懂的可以参考opencl专栏,本例子中举例为两个数组相加:

__kernel void array_add(const __global uchar* restrict arrayA_data,const __global uchar* restrict arrayB_data,__global uchar* restrict dst_data)
{size_t index = get_global_id(0);dst_data[index] = arrayA_data[index] + arrayB_data[index];
}

OpenVINO中 有些特殊的优化 稍后再介绍,注意只需要编写kernel 代码即可,不需要编写host端的代码(如plaftform,device查询等) 将kernel代码保持在cl文件中,本文将cl文件命名为add_text.cl

cl文件编译

OpenVINO中采用clc编译器直接编译cl文件,注意这是OpenVINO的神奇之处,可以使用clc编译器直接编译kernel代码,之前接触到的opencl GPU上编程,都是将代码提交到device进行编译

编译之前需要设置几个变量:

SHAVE_MA2X8XLIBS_DIR=/opt/intel/openvino/deployment_tools/tools/cl_compiler/lib/
       SHAVE_LDSCRIPT_DIR=/opt/intel/openvino/deployment_tools/tools/cl_compiler/ldscripts/
       SHAVE_MYRIAD_LD_DIR=/opt/intel/openvino/deployment_tools/tools/cl_compiler/bin/
        SHAVE_MOVIASM_DIR=/opt/intel/openvino/deployment_tools/tools/cl_compiler/bin/

上述几个变量为clc编译器所需要的,分别为lib目录,链接目录,以及bin文件目录,设置的分别为以下几个目录:

将cl文件编译成后缀名bin文件编译结果如下:

编写xml配置文件

编写相应的xml配置文件,本文例子如下:

<CustomLayer name ="add_text" stage="0" type ="MVCL" version ="1"><Kernel entry="array_add"><Source filename="add_text.bin"/></Kernel><Parameters><Tensor arg-name="arrayA_data" type="input"  port-index ="0" format="BFYX"/><Tensor arg-name="arrayB_data" type="input"  port-index ="0" format="BFYX"/><Tensor arg-name="dst_data"    type="output" port-index ="0" format="BFYX"/></Parameters><WorkSizes dim="output, 0" global="X,1,1"  local="1,1,1"/>
</CustomLayer>

具体每个标签的意思稍后再全面解释

Inference engine启动调用

编写APP应用,并通过xml配置文件调用上述写的customer layer opencl kernel函数,再加载网络之前,首先要配置xml路径,配置方法如下:

InferenceEngine::Core core;
// Load custom layers
core.SetConfig({ { InferenceEngine::PluginConfigParams::KEY_CONFIG_FILE, "<path to the xml file>" } }, "MYRIAD");

也可以在加载网络是配置路径,配置方法如下:

InferenceEngine::Core core;
std::map<std::string, std::string> networkConfig;
networkConfig["VPU_CUSTOM_LAYERS"] = "/path/to/your/customLayers.xml";
// Load custom layers in network config
auto exeNetwork = core.LoadNetwork(cnnNetwork, "MYRIAD", networkConfig);

由于买的英特尔二代计算棒还未到暂时还不能补充调试过程,稍后补充该段代码以及调试过程。

参考资料

https://docs.openvinotoolkit.org/latest/_docs_IE_DG_Integrate_your_kernels_into_IE.html#how_to_implement_custom_layers_for_vpu_intel_neural_compute_stick_2

OpenVINO Inference Engine之custom Layer自定义算法(VPU版本)相关推荐

  1. OpenVINO 2019 R2.0 Custom Layer Implementation for linux(2)

    在上节主要是讲述了OpenVINO 整个custom layer流程,官网中给出了基于CPU和GPU整个实现用例过程,用例链接 该用例主要是在custom layer中实现一下公式: 整个流程主要如下 ...

  2. OpenVINO 2019 R2.0 Custom Layer Implementation for linux(1)

    OpenVINO除了支持比较流行的Caffe等深度学习框架,还支持用户自定义网络Custom Layer层. Custom Layer OpenVINO的Custom Layer的实施包括Model ...

  3. OpenVINO Inference Engine之GetAvailableDevices

    在<学习OpenVINO笔记之Inference Engine Device Query API>中的查询设备用例中,有使用到查看当前有哪些设备可以上线接口GetAvailableDevi ...

  4. OpenVINO Inference Engine之LoadNetwork

    在<OpenVINO InferenceEngine之Core类>之中只是简单了介绍了一下loadNetwork的整个流程,还没有涉及到真正的加载动作.如上文中所示,在加载网络之前需要首先 ...

  5. 学习OpenVINO笔记之Inference Engine Device Query API

    Device Query API是OpenVINO在R2版本时整合引入新的API,主要可以用来查询不同设备属性和配置参数,可以让开发者更加了解设备配置,使用起来更加方便.R2 API与 R1版本相比较 ...

  6. 学习OpenVINO笔记之Inference Engine

    Inference Engine是OpenVINO具体实施单元,支持CPU,GPU,FPGA,Movidius,GNA等因特尔开发的硬件平台,并提供可操作API,API为C++接口,也支持python ...

  7. JointDNN: An Effificient Training and Inference Engine for Intelligent Mobile Cloud Computing Servic

    题目:JointDNN: An Effificient Training and Inference Engine for Intelligent Mobile Cloud Computing Ser ...

  8. TensorRT Samples: MNIST(Plugin, add a custom layer)

    关于TensorRT的介绍可以参考:http://blog.csdn.net/fengbingchun/article/details/78469551 以下是参考TensorRT 2.1.2中的sa ...

  9. caffe 添加自定义层(custom layer)

    在<剖析Caffe源码之Layer>可以知道layer是所有层的基类,由此类派生出各种不同的不同的层,其如下图所示: 由此扩展出了各种不同的层,基本能满足要求,但是有时候在搭建拓扑网络时, ...

最新文章

  1. 加强版Redis,又一款国产高性能KV存储数据库开源了!
  2. 贼好用的 Java 工具类库
  3. 你的简历到底问题在哪?
  4. LeetCode Construct Binary Tree from Preorder and Inorder Traversal(构造二叉树)
  5. KDE/QT vs GNOME/GTK
  6. 管理active directiory中的用户和计算机管理磁盘,IP多播桌面视频会议系统媒体流管理与安全机制的分析.pdf...
  7. html表格全屏显示,tableView滑动全屏显示
  8. es6 数组合并_JavaScript学习笔记(十九)-- ES6
  9. 26. PHP 文件打开/读取/读取
  10. arduino 蓝牙示例_Arduino入门笔记(9):蓝牙模块及第一辆蓝牙遥控小车
  11. python能当黑客吗_如何成为一名黑客?(转)
  12. 【工具】ubuntu16安装sendip发包工具,模拟发送tcp/udp/icmp报文
  13. dB, -3dB, -6dB相关知识
  14. js制作动态图片时钟
  15. 图层蒙版和图层剪贴路径_PS蒙版使用教程、快速蒙版、剪切蒙版、矢量蒙版、图层蒙版要点...
  16. Ubuntu硬盘的分区、格式化、挂载
  17. zblogphp 广告联盟_zblog模板添加广告位置的方法
  18. position的五种方式
  19. 操作系统引导程序顺序
  20. KEIL 调试经验总结

热门文章

  1. JeeWx捷微2.4.1版本发布,JAVA微信管家平台(支持公众号、企业号)
  2. HTTP对外接口,如何增加签名机制
  3. 微信开发本地调试工具(模拟微信客户端)
  4. 业务场景下数据采集机制和策略
  5. [BJOI2019]送别——非旋转treap
  6. 图解从上电到执行main函数的处理
  7. 消息中间件系列四:RabbitMQ与Spring集成
  8. Firefox 检测到该服务器正在将此地址的请求循环重定向。     此问题可能是因为禁用或拒绝 Cookie 导致。...
  9. Ubuntu13.10上android+idea+scala+sbt环境搭建
  10. Entropay(欧贝通)