OpenVINO Inference Engine之LoadNetwork
在<OpenVINO InferenceEngine之Core类>之中只是简单了介绍了一下loadNetwork的整个流程,还没有涉及到真正的加载动作。如上文中所示,在加载网络之前需要首先加载具体的设备so,并找到动态so中的入口函数CreatePluginEngine,创建相对应的plugin engine,下面首先分析Myraid中的CreatePluginEngine函数
CreatePluginEngine
Myraid的CreatePluginEngine()函数入口在inference-engine\src\vpu\myriad_plugin\api\myriad_api.cpp文件中,代码如下:
该函数比较嵌套比较多,首先获取到Mvnc类的地址,该类主要是对当前的Movidius设备进行管理,记录当前有多少个设备在线以及对应的名字。make_ie_compatible_plugin获取其共用的plugin地址,共有的意思当前所有相同的Movidius设备类型共用一个plugin类,其功用的类为Engine,按照名字顾名思义就是movidius操作引擎,提供其一般Movidius, make_ie_compatible_plugin()函数源码如下:
创建一个 PluginBase 基类,其具有实现是在Engine类中, PluginBase类构造函数如下:
实现较为简单就是将 具体实现的Engine类地址保存在_impl中。
可以看到Movidius的plugin的地址本质上就是将具有取得类Engine地址,这层洋葱终于剥掉了。
LoadNetwork
CreatePluginEngine()函数相当于创建一个 PluginBase 基类,那么loadNetwork相当于调用GetCPPPluginByName()类,通过CreatePluginEngine()函数产生一个 PluginBase 类
GetCPPPluginByName() 函数获取到相对应的plugin创建的接口类InferencePlugin, 起loadNetwork为:
上述函数相当一调用loadNetwork函数,生成一个可执行的网络IExecutableNetwork,并将其保存在ExecutableNetwork类中
ExecutableNetwork类构造函数如下:
相当于将生成的可执行的网络类保存在actual中。而actual实际上就是保存的CreatePluginEngine中生成的PluginBase类。
而其最终相当于调用 PluginBase类中的LoadNetwork函数:
TO_STATUS进行展开:
为异常抓取动作,相当于调用_impl->LoadNetwork函数, _impl为 Engine类地址
Engine类继承了InferencePluginInternal类,也继承了其LoadNetwork实现, InferencePluginInternal类为对所有plugin中的一些共有操作进行了封装。
InferencePluginInternal::LoadNetwork
七拐八绕终于见到LoadNetwork真正实现了,个人感觉OpenVINO有些地方实现较为复杂,其实效率并没有太高
获取网络输入输出信息
首先获取到网络的输入输出信息:
将获取到的输入输出信息再次进行加工处理
生成新的输入信息
将网络中的输入信息重新整理,挂节到本地中进行处理,该设计方式是将网络管理与具体实施进行分类,具体实施是在具体的设备中,有可能一个网络需要在多个设备中
将网络的输出数据重新申请一份Data,挂节到网络的 _networkInputs,该方法最大的缺点就是比较耗内存
生成新的输出信息
重新生成新的输出Data,挂接到_networkOutputs中:
LoadExeNetworkImpl
该函数为虚函数,具体的实施是在派生类Engine中:
ExecutableNetworkInternal::Ptr Engine::LoadExeNetworkImpl(const ICore * /*core*/, ICNNNetwork &network,const std::map<std::string, std::string> &config) {VPU_PROFILE(LoadExeNetworkImpl);InputsDataMap networkInputs;OutputsDataMap networkOutputs;network.getInputsInfo(networkInputs);network.getOutputsInfo(networkOutputs);IE_SUPPRESS_DEPRECATED_STARTauto specifiedDevice = network.getTargetDevice();auto supportedDevice = InferenceEngine::TargetDevice::eMYRIAD;if (specifiedDevice != InferenceEngine::TargetDevice::eDefault && specifiedDevice != supportedDevice) {THROW_IE_EXCEPTION << "The plugin doesn't support target device: " << getDeviceName(specifiedDevice) << ".\n" <<"Supported target device: " << getDeviceName(supportedDevice);}IE_SUPPRESS_DEPRECATED_END// override what was set globally for plugin, otherwise - override default config without touching config for pluginauto configCopy = _config;for (auto &&entry : config) {configCopy[entry.first] = entry.second;}return std::make_shared<ExecutableNetwork>(network, _devicePool, configCopy);
}
对其设备类型进行检查,如果指定的设备类型不是MYRIAD将不支持,最后返回ExecutableNetwork类,该类是具体网络执行时候的实施单元。
Myraid的该类实现是在inference-engine\src\vpu\myriad_plugin\myriad_executable_network.cpp文件中
设置输出输出
调用的是 ExecutableNetworkInternal类实现:
返回IExecutableNetwork类
将真正可执行的类返回:
ExecutableNetwork类构造函数如下:
首先调用compileNetwork接口将网络模型及训练参数转变成Graph,然后下载到具体的movidius中,Graph是整个movidius管理深度学习的核心,由于比较复杂后面再详细分析。
OpenVINO Inference Engine之LoadNetwork相关推荐
- OpenVINO Inference Engine之custom Layer自定义算法(VPU版本)
OpenVINO不仅支持广泛的已知深度学习架构(Caff,TensorFlow等),还支持用户自定义CNN 算法,拥有良好的可扩展性.要使用用户自定义功能就要使用到Inference Engine K ...
- OpenVINO Inference Engine之GetAvailableDevices
在<学习OpenVINO笔记之Inference Engine Device Query API>中的查询设备用例中,有使用到查看当前有哪些设备可以上线接口GetAvailableDevi ...
- 学习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 ...
- [论文阅读] EIE: Efficient Inference Engine on Compressed Neural Network
这是收录于ISCA16(International Symposium on Computer Architecture). 其是Deep Compression以及DSD的系列篇,其在Deep Co ...
- 韩松EIE:Efficient Inference Engine on Compressed Deep Neural Network论文详解
EIE为韩松博士在ISCA 2016上的论文.实现了压缩的稀疏神经网络的硬件加速.与其近似方法的ESE获得了FPGA2017的最佳论文. 目录 一.背景与介绍 1.1 Motivation 1.2 前 ...
- 韩松 EIE: Efficient Inference Engine on Compressed Deep Neural Network论文详解
EIE为韩松博士在ISCA 2016上的论文,实现了压缩的稀疏神经网络的硬件加速. 与其近似方法的ESE获得了FPGA2017的最佳论文. 背景与介绍 最新的DNN模型都是运算密集型和存储密集型,难以 ...
- OpenVINO示例介绍
接着前面系列博客来讲,我们知道学东西应该先从官网的示例来着手,循序渐进,这是一个很好的学习方法.有两处例子: 第一处,OpenVINO安装路径下的例子,在用Using Installer安装OpenV ...
最新文章
- SQL 基础命令和函数
- 惠普ilo管理界面远程安装系统
- 定时器和promise_web前端面试中 promise 相关
- Java代码优化(长期更新)
- ICMP协议抓包分析-wireshark
- 深入浅出理解 Variable used in lambda expression should be final or effectively final
- R语言观察日志(part9)--RMarkdown之输出格式
- Discuz!NT - 在线显示列表 游客 bug 修复
- history.back(-1)和history.go(-1)的区别
- 012-- mysql的分区和分表
- Linux下的虚拟机安装
- 监控数据库锁阻塞_机器连接数_警报日志的shell脚本 分享
- [Windows][卓越性能模式]win10上如何开启卓越性能模式?
- 大数据最核心的价值是什么?
- python工资有多少-Python工程师工资多少
- DEMO-lidar原理介绍及数据集运行测试
- 计算机专业c语言用的软件,计算机C语言模拟练习
- 随笔 | 武汉大学管理课笔记 第一课
- Centos7安装cuda9.0,TiTan X
- wordpress最佳架构_应用程序的21个最佳WordPress主题(2020)
热门文章
- vue-ls vue 本地储存示例
- Spring、SpringMVC、SpringBoot、SpringCloud的关系分享
- Git上传Github及基本操作
- 股票历史数据下载接口踩坑记录
- 记录TCP协议使用Socket连接,客户端请求服务器read()阻塞问题
- CSS, JavaScript, jQuery实现标签页切换
- @ControllerAdvice + @ExceptionHandler 全局处理 Controller 层异常
- OpenCV3与深度学习实例-使用OpenPose进行人体姿态估算
- MySQL超简单安装方法,一条命令就搞定
- 会计丑闻之后 东芝“迎来”第五次延交财报