OpenVINO Inference Engine之custom Layer自定义算法(VPU版本)
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版本)相关推荐
- OpenVINO 2019 R2.0 Custom Layer Implementation for linux(2)
在上节主要是讲述了OpenVINO 整个custom layer流程,官网中给出了基于CPU和GPU整个实现用例过程,用例链接 该用例主要是在custom layer中实现一下公式: 整个流程主要如下 ...
- OpenVINO 2019 R2.0 Custom Layer Implementation for linux(1)
OpenVINO除了支持比较流行的Caffe等深度学习框架,还支持用户自定义网络Custom Layer层. Custom Layer OpenVINO的Custom Layer的实施包括Model ...
- OpenVINO Inference Engine之GetAvailableDevices
在<学习OpenVINO笔记之Inference Engine Device Query API>中的查询设备用例中,有使用到查看当前有哪些设备可以上线接口GetAvailableDevi ...
- OpenVINO Inference Engine之LoadNetwork
在<OpenVINO InferenceEngine之Core类>之中只是简单了介绍了一下loadNetwork的整个流程,还没有涉及到真正的加载动作.如上文中所示,在加载网络之前需要首先 ...
- 学习OpenVINO笔记之Inference Engine Device Query API
Device Query API是OpenVINO在R2版本时整合引入新的API,主要可以用来查询不同设备属性和配置参数,可以让开发者更加了解设备配置,使用起来更加方便.R2 API与 R1版本相比较 ...
- 学习OpenVINO笔记之Inference Engine
Inference Engine是OpenVINO具体实施单元,支持CPU,GPU,FPGA,Movidius,GNA等因特尔开发的硬件平台,并提供可操作API,API为C++接口,也支持python ...
- 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 ...
- TensorRT Samples: MNIST(Plugin, add a custom layer)
关于TensorRT的介绍可以参考:http://blog.csdn.net/fengbingchun/article/details/78469551 以下是参考TensorRT 2.1.2中的sa ...
- caffe 添加自定义层(custom layer)
在<剖析Caffe源码之Layer>可以知道layer是所有层的基类,由此类派生出各种不同的不同的层,其如下图所示: 由此扩展出了各种不同的层,基本能满足要求,但是有时候在搭建拓扑网络时, ...
最新文章
- 加强版Redis,又一款国产高性能KV存储数据库开源了!
- 贼好用的 Java 工具类库
- 你的简历到底问题在哪?
- LeetCode Construct Binary Tree from Preorder and Inorder Traversal(构造二叉树)
- KDE/QT vs GNOME/GTK
- 管理active directiory中的用户和计算机管理磁盘,IP多播桌面视频会议系统媒体流管理与安全机制的分析.pdf...
- html表格全屏显示,tableView滑动全屏显示
- es6 数组合并_JavaScript学习笔记(十九)-- ES6
- 26. PHP 文件打开/读取/读取
- arduino 蓝牙示例_Arduino入门笔记(9):蓝牙模块及第一辆蓝牙遥控小车
- python能当黑客吗_如何成为一名黑客?(转)
- 【工具】ubuntu16安装sendip发包工具,模拟发送tcp/udp/icmp报文
- dB, -3dB, -6dB相关知识
- js制作动态图片时钟
- 图层蒙版和图层剪贴路径_PS蒙版使用教程、快速蒙版、剪切蒙版、矢量蒙版、图层蒙版要点...
- Ubuntu硬盘的分区、格式化、挂载
- zblogphp 广告联盟_zblog模板添加广告位置的方法
- position的五种方式
- 操作系统引导程序顺序
- KEIL 调试经验总结
热门文章
- JeeWx捷微2.4.1版本发布,JAVA微信管家平台(支持公众号、企业号)
- HTTP对外接口,如何增加签名机制
- 微信开发本地调试工具(模拟微信客户端)
- 业务场景下数据采集机制和策略
- [BJOI2019]送别——非旋转treap
- 图解从上电到执行main函数的处理
- 消息中间件系列四:RabbitMQ与Spring集成
- Firefox 检测到该服务器正在将此地址的请求循环重定向。 此问题可能是因为禁用或拒绝 Cookie 导致。...
- Ubuntu13.10上android+idea+scala+sbt环境搭建
- Entropay(欧贝通)