• 13988888888
  • youweb@qq.com
  • 广东省广州市番禺经济开发区
  • 定制化设计一站式临时空间解决方案

  • 高端产品行业领先进口生产线

  • 核心技术装配式移动建筑系统

公司新闻
   主页 > 公司新闻

OpenVINO推理简介

作者:佚名  发布时间:2024-05-20 19:08  浏览:

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

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

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

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

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

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

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

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

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

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

DLDT分为两部分:

  • 模型优化器(Model Optimizer)
  • 推理运行库(Inference Runtime)

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

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

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

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

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

#include "openvino/openvino.hpp"
// 创建推理core,管理处理器和插件
ov::Core core;
// 读取网络结构和权重
std::shared_ptr<ov::Model> model = core.read_model("Model.xml");
// 设置预处理和后处理
ov::element::Type input_type = ov::element::u8;
ov::Shape input_shape = {1, height, width, 3};
const ov::Layout tensor_layout{"NHWC"};
ov::preprocess::PrePostProcessor ppp(model);
// 设置输入尺寸,输入数据类型,以及通道顺序
ppp.input().tensor().set_shape(input_shape).set_element_type(input_type).set_layout(tensor_layout);
// 设置前处理重resize的算法类型
ppp.input().preprocess().resize(ov::preprocess::ResizeAlgorithm::RESIZE_LINEAR);
// 设置输出结果的数据类型为浮点型
ppp.output().tensor().set_element_type(ov::element::f32);
// 将前后处理应用到原始模型上
model = ppp.build();
// 装在模型到硬件设备中
ov::CompiledModel compiled_model = core.compile_model(model, device_name);
// 创建推理请求
ov::InferRequest infer_request = compiled_model.create_infer_request();
// 准备输入tensor
ov::Tensor input_tensor = ov::Tensor(input_type, input_shape, image_data);
infer_request.set_input_tensor(input_tensor);
// 执行模型推理
infer_request.infer();
// 处理推理结果
const ov::Tensor& output_tensor = infer_request.get_output_tensor();
// 结果处理...

推理过程只需要开发一次,只要模型的输入和输出不变,剩下的就是训练模型和模型优化工作了。

这是一款非常给力的专门做推理的工具,并且有intel在不停的开发和优化新的网络结构,有人维护和开发这件事很重要。

部署上线

另外一篇介绍一种灵活且高效的

zhuanlan.zhihu.com/p/10

关于OpenVINO优化参数配置参考

zhuanlan.zhihu.com/p/13

关于AI设备选型可参考

zhuanlan.zhihu.com/p/27

对于做AI工程化的初学者可读一下

zhuanlan.zhihu.com/p/72

OpenVINO API 2.0(2022.1及以后版本)介绍

zhuanlan.zhihu.com/p/47

基于CPU优化AI推理性能

基于CPU加速AI推理总结

返回

平台注册入口