基于Intel OpenVINO搭建导出模型

一些背景

在这里插入图片描述
从事AI相关工作的同学应该对模型训练框架非常熟悉了,其中,主流框架包括由Google主导的Tensorflow,由Facebook主导的PyTorch和百度的PaddlePaddle。通过数据集在模型结构上训练,我们可以得到模型中常量的数值,比如卷积核的值,偏置项的值。训练完成后,框架会得到一个模型结构+常量数值组成的模型(虽然可能只有一个文件,但文件中一定包括这两项)。对于学术领域的同学,到这一步工作已经接近尾声,因为后续只要跑跑测试集,检查模型是否由提升即可。

不过,对于工业领域的同学,做到这步只是刚刚开始,因为公司不仅要训练模型,更注重推理过程,后者往往和业务深度绑定,是重中之重。训练完的初始模型是可以直接推理(不然也没法跑测试集),但没经过优化,不能发挥硬件性能。为了帮助模型落地,各大巨头也是各显神通,提出自己的解决方案,一种是基于训练框架延伸,如对Tensorflow模型加速的Tensorflow XLA,Tensorflow Lite,针对PyTorch模型的libtorch,这些背后主要是软件公司主导;另外一支是由硬件公司和软硬结合公司推动的中间层,先将模型转化为中间层,在此基础上深度绑定自家硬件进行优化,如Intel的nGraph在CPU上的优化,Nvidia的TensorRT在GPU的优化。

nGraph和OpenVINO

这篇文章主要讨论的就是nGraph搭建模型并导出的过程,nGraph是一种中间表示,架构显得不够大,Intel在此基础上开发了一系列模型压缩,优化工具,并命名为OpenVINO,不过其核心仍然是nGraph。nGraph将模型结构(.xml)和常量数值(.bin)分开存储,这样对两者优化时互不影响,可以在上层就进行优化,只有最后再根据不同的硬件编译成二进制模型文件。

搭建模型

这里给出一个简单示例,一个3x2的输入,先乘一个常数,再加一个常数,最后输出。
在这里插入图片描述

	print("build network")
	data = ov.opset8.parameter([3, 2], ov.Type.f32)
	mul_constant = ov.opset8.constant([1.5], ov.Type.f32)
	mul = ov.opset8.multiply(data, mul_constant)
	add_constant = ov.opset8.constant([0.5], ov.Type.f32)
	add = ov.opset8.add(mul, add_constant)
	res = ov.opset8.result(add)
	model = ov.Model([res], [data], "model")

导出模型

将搭建好的模型用nGraph形式保存下来,生成.xml和.bin。

	print("dump model")
	ov.serialize(model, xml_path="model.xml", bin_path="model.bin")

编译模型

nGraph是一种比较上层的模型表示,针对不同硬件,需要编译成可以在硬件上执行的指令,这里指定的是CPU。

	print("compile model")
	core = ov.Core()
	compiled_model = core.compile_model(model, "CPU")

进行推理

有同步和异步之分,这里用的是同步推理模型,即获得每次推理结果后再执行后续指令。

	print("inference")
	infer_request = compiled_model.create_infer_request()
	
	input_data = np.ones(shape=(3, 2), dtype=np.float32)
	input_tensor = ov.Tensor(input_data)
	infer_request.set_tensor(model.input(0), input_tensor)
	
	infer_request.infer()
	
	output_tensor = infer_request.get_output_tensor(0)
	print(input_tensor.data)
	print(output_tensor.data)

整个搭建过程也可以参考OpenVINO官方文档:
Integrate OpenVINO™ with Your Application

完整代码:

import openvino.runtime as ov
import numpy as np

if __name__ == '__main__':
	print("build network")
	data = ov.opset8.parameter([3, 2], ov.Type.f32)
	mul_constant = ov.opset8.constant([1.5], ov.Type.f32)
	mul = ov.opset8.multiply(data, mul_constant)
	add_constant = ov.opset8.constant([0.5], ov.Type.f32)
	add = ov.opset8.add(mul, add_constant)
	res = ov.opset8.result(add)
	model = ov.Model([res], [data], "model")
	
	print("dump model")
	ov.serialize(model, xml_path="model.xml", bin_path="model.bin")
	
	print("compile model")
	core = ov.Core()
	compiled_model = core.compile_model(model, "CPU")
	
	print("inference")
	infer_request = compiled_model.create_infer_request()
	
	input_data = np.ones(shape=(3, 2), dtype=np.float32)
	input_tensor = ov.Tensor(input_data)
	infer_request.set_tensor(model.input(0), input_tensor)
	
	infer_request.infer()
	
	output_tensor = infer_request.get_output_tensor(0)
	print(input_tensor.data)
	print(output_tensor.data)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值