在<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相关推荐

  1. OpenVINO Inference Engine之custom Layer自定义算法(VPU版本)

    OpenVINO不仅支持广泛的已知深度学习架构(Caff,TensorFlow等),还支持用户自定义CNN 算法,拥有良好的可扩展性.要使用用户自定义功能就要使用到Inference Engine K ...

  2. OpenVINO Inference Engine之GetAvailableDevices

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

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

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

  4. 学习OpenVINO笔记之Inference Engine

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

  5. 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 ...

  6. [论文阅读] EIE: Efficient Inference Engine on Compressed Neural Network

    这是收录于ISCA16(International Symposium on Computer Architecture). 其是Deep Compression以及DSD的系列篇,其在Deep Co ...

  7. 韩松EIE:Efficient Inference Engine on Compressed Deep Neural Network论文详解

    EIE为韩松博士在ISCA 2016上的论文.实现了压缩的稀疏神经网络的硬件加速.与其近似方法的ESE获得了FPGA2017的最佳论文. 目录 一.背景与介绍 1.1 Motivation 1.2 前 ...

  8. 韩松 EIE: Efficient Inference Engine on Compressed Deep Neural Network论文详解

    EIE为韩松博士在ISCA 2016上的论文,实现了压缩的稀疏神经网络的硬件加速. 与其近似方法的ESE获得了FPGA2017的最佳论文. 背景与介绍 最新的DNN模型都是运算密集型和存储密集型,难以 ...

  9. OpenVINO示例介绍

    接着前面系列博客来讲,我们知道学东西应该先从官网的示例来着手,循序渐进,这是一个很好的学习方法.有两处例子: 第一处,OpenVINO安装路径下的例子,在用Using Installer安装OpenV ...

最新文章

  1. SQL 基础命令和函数
  2. 惠普ilo管理界面远程安装系统
  3. 定时器和promise_web前端面试中 promise 相关
  4. Java代码优化(长期更新)
  5. ICMP协议抓包分析-wireshark
  6. 深入浅出理解 Variable used in lambda expression should be final or effectively final
  7. R语言观察日志(part9)--RMarkdown之输出格式
  8. Discuz!NT - 在线显示列表 游客 bug 修复
  9. history.back(-1)和history.go(-1)的区别
  10. 012-- mysql的分区和分表
  11. Linux下的虚拟机安装
  12. 监控数据库锁阻塞_机器连接数_警报日志的shell脚本 分享
  13. [Windows][卓越性能模式]win10上如何开启卓越性能模式?
  14. 大数据最核心的价值是什么?
  15. python工资有多少-Python工程师工资多少
  16. DEMO-lidar原理介绍及数据集运行测试
  17. 计算机专业c语言用的软件,计算机C语言模拟练习
  18. 随笔 | 武汉大学管理课笔记 第一课
  19. Centos7安装cuda9.0,TiTan X
  20. wordpress最佳架构_应用程序的21个最佳WordPress主题(2020)

热门文章

  1. vue-ls vue 本地储存示例
  2. Spring、SpringMVC、SpringBoot、SpringCloud的关系分享
  3. Git上传Github及基本操作
  4. 股票历史数据下载接口踩坑记录
  5. 记录TCP协议使用Socket连接,客户端请求服务器read()阻塞问题
  6. CSS, JavaScript, jQuery实现标签页切换
  7. @ControllerAdvice + @ExceptionHandler 全局处理 Controller 层异常
  8. OpenCV3与深度学习实例-使用OpenPose进行人体姿态估算
  9. MySQL超简单安装方法,一条命令就搞定
  10. 会计丑闻之后 东芝“迎来”第五次延交财报