当前位置:   article > 正文

OpenVINO推理简介_openvino有什么作用

openvino有什么作用

半导体厂商开发的硬件再怎么厉害,也需要软件工具的加持,重复制造轮子不是一个好主意,为了充分挖掘处理器的性能,各个厂家都发布了各种软件框架和工具,比如Intel的OpenVINONvidia的TensorRT等等。

这里重点介绍英特尔发布的针对AI工作负载的一款部署神器--OpenVINO

OpenVINO是英特尔推出的一款全面的工具套件,用于快速部署应用和解决方案,支持计算机视觉的CNN网络结构超过200余种。

目前OpenVINO已经发布了API 2.0,详情见另一篇介绍OpenVINO推理简介2.0

我们有了各种开源框架,比如tensorflow,pytorch,mxnet,caffe2等,为什么还要推荐OpenVINO来作为部署工具呢?

当模型训练结束后,上线部署时,就会遇到各种问题,比如,模型性能是否满足线上要求,模型如何嵌入到原有工程系统,推理线程的并发路数是否满足,这些问题决定着投入产出比。只有深入且准确的理解深度学习框架,才能更好的完成这些任务,满足上线要求。实际情况是,新的算法模型和所用框架在不停的变化,这个时候恨不得工程师什么框架都熟练掌握,令人失望的是,这种人才目前是稀缺的。

OpenVINO是一个Pipeline工具集,同时可以兼容各种开源框架训练好的模型,拥有算法模型上线部署的各种能力,只要掌握了该工具,你可以轻松的将预训练模型在Intel的CPU上快速部署起来。

对于AI工作负载来说,OpenVINO提供了深度学习推理套件(DLDT),该套件可以将各种开源框架训练好的模型进行线上部署,除此之外,还包含了图片处理工具包OpenCV,视频处理工具包Media SDK,用于处理图像视频解码,前处理和推理结果后处理等。

在做推理的时候,大多数情况需要前处理和后处理,前处理如通道变换,取均值,归一化,Resize等,后处理是推理后,需要将检测框等特征叠加至原图等,都可以使用OpenVINO工具套件里的API接口完成。

对于算法工程师来说,OpenCV已经非常熟悉,这里重点讲一下深度学习部署套件DLDT。

DLDT分为两部分:

  • 模型优化器(Model Optimizer)
  • 推理引擎(Inference Engine)

其中,模型优化器是线下模型转换,推理引擎是部署在设备上运行的AI负载。

模型优化器是一个python脚本工具,用于将开源框架训练好的模型转化为推理引擎可以识别的中间表达,其实就是两个文件,xml和bin文件,前者是网络结构的描述,后者是权重文件。模型优化器的作用包括压缩模型和加速,比如,去掉推理无用的操作(Dropout),层的融合(Conv + BN + Relu),以及内存优化。

推理引擎是一个支持C\C++和python的一套API接口,需要开发人员自己实现推理过程的开发,开发流程其实非常的简单,核心流程如下:

  1. 装载处理器的插件库
  2. 读取网络结构和权重
  3. 配置输入和输出参数
  4. 装载模型
  5. 创建推理请求
  6. 准备输入Data
  7. 推理
  8. 结果处理

下面给出一段C++的代码例子

  1. // 创建推理core,管理处理器和插件
  2. InferenceEngine::Core core;
  3. // 读取网络结构和权重
  4. CNNNetReader network_reader;
  5. network_reader.ReadNetwork("Model.xml");
  6. network_reader.ReadWeights("Model.bin");
  7. // 配置输入输出参数
  8. auto network = network_reader.getNetwork();
  9. InferenceEngine::InputsDataMap input_info(network.getInputsInfo());
  10. InferenceEngine::OutputsDataMap output_info(network.getOutputsInfo());
  11. /** Iterating over all input info**/
  12. for (auto &item : input_info) {
  13. auto input_data = item.second;
  14. input_data->setPrecision(Precision::U8);
  15. input_data->setLayout(Layout::NCHW);
  16. input_data->getPreProcess().setResizeAlgorithm(RESIZE_BILINEAR);
  17. input_data->getPreProcess().setColorFormat(ColorFormat::RGB);
  18. }
  19. /** Iterating over all output info**/
  20. for (auto &item : output_info) {
  21. auto output_data = item.second;
  22. output_data->setPrecision(Precision::FP32);
  23. output_data->setLayout(Layout::NC);
  24. }
  25. // 装载网络结构到设备
  26. auto executable_network = core.LoadNetwork(network, "CPU");
  27. std::map<std::string, std::string> config = {{ PluginConfigParams::KEY_PERF_COUNT, PluginConfigParams::YES }};
  28. auto executable_network = core.LoadNetwork(network, "CPU", config);
  29. // 创建推理请求
  30. auto infer_request = executable_network.CreateInferRequest();
  31. // 准备输入Data
  32. or (auto & item : inputInfo) {
  33. auto input_name = item->first;
  34. /** Getting input blob **/
  35. auto input = infer_request.GetBlob(input_name);
  36. /** Fill input tensor with planes. First b channel, then g and r channels **/
  37. ...
  38. }
  39. // 推理
  40. sync_infer_request->Infer();
  41. // 结果处理
  42. for (auto &item : output_info) {
  43. auto output_name = item.first;
  44. auto output = infer_request.GetBlob(output_name);
  45. {
  46. auto const memLocker = output->cbuffer(); // use const memory locker
  47. // output_buffer is valid as long as the lifetime of memLocker
  48. const float *output_buffer = memLocker.as<const float *>();
  49. // process result
  50. ...
  51. }
  52. }

 感谢知乎大佬,供于自己学习记录下,转载自:OpenVINO推理简介 - 知乎

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/161464
推荐阅读
相关标签
  

闽ICP备14008679号