使用openvino加速tensorflow记录

OpenVINO

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

  1. 模型优化器(Model Optimizer)
  2. 推理引擎(Inference Engine)

模型优化器简介

官方描述:该工具可将在常见框架上训练的模型导入、转换与优化为可供英特尔工具(特别是推理引擎)使用的格式。常见框架包括 Caffe*、TensorFlow*、MXNet* 和ONNX*。
个人理解:将开源框架训练好的模型转化为推理引擎可识别的文件,本人使用的为将tensorflow训练好的pb文件生成模型优化器转换成的IR文件(包含.xml:描述网络拓扑、.bin:包含权重和偏差二进制数据)。

推理引擎简介

官方描述:这是一款运行深度学习模型的引擎。它包括一组库,可将推理轻松集成至用户的应用。
个人理解:向用户提供C++/Python API函数库。用户通过调用相应方法读入IR文件,设置推理引擎相应的模型输入输出,读入数据,指定AI计算硬件执行推理计算,并获得结果。

openvino加速tensorflow实现过程

实验环境:Ubuntu 16.04
AI计算设备:Intel® Core™ i7-9700K CPU @ 3.60GHz

安装OpenVINO工具套件

下载链接

  1. 进入下载界面,点击Choose&Download按钮,选择需要相应的开发或部署的操作系统,点击Register&Download进入注册界面,注册后选择相应系统,并点击Submit进入下载界面,选择最新版本(笔者测试期间版本为2020
    2),点击Full Package下载完整的工具套件(Customizable
    Package为定制安装包,自主选择需要使用的组件)。
  2. Linux下下载好后,解压下载下来的.tgz文件,解压好后进入l_openvino_toolkit_p_目录
  3. 使用GUI安装向导,运行以下命令,并依据界面提示安装
sudo ./install_GUI.sh

默认安装路径/opt/intel,如果不是使用sudo安装,则安装路径是用户目录下

安装外部软件关联组件&设置环境变量

这些组件用于

  1. opencv库的Intel优化构建
  2. 深度学习推理引擎
  3. 深度学习模型优化器工具
    运行如下代码,其中/opt/intel为安装OpenVINO默认安装路径,以实际安装情况进行相应修改
cd /opt/intel/openvino/install_dependencies
sudo -E ./install_openvino_dependencies.sh

4.配置用户目录的.bashrc,将openvino环境初始化添加进去,实现每次打开终端都会自动配置OpenVINO环境

vi <user_dir>/.bashrc
#将下面命令添加至.bashrc文件的末尾
source /opt/intel/openvino/bin/setupvars.sh

配置模型优化器

配置有两种配置选项,第一个是配置所有框架,第二是选择一种框架配置。配置过程需要联网。

  1. 配置所有支持的框架`
cd /opt/intel/openvino/deployment_tools/model_optimizer/install_prerequisites
sudo ./install_prerequisites.sh
  1. 单独配置(以tensorflow为例)
cd /opt/intel/openvino/deployment_tools/model_optimizer/install_prerequisites
sudo ./install_prerequisites_tf.sh

运行验证脚本验证安装

cd /opt/intel/openvino/deployment_tools/demo
./demo_squeezenet_download_convert_run.sh
./demo_security_barrier_camera.sh

这部分是运行OpenVINO的测试demo,运行成功,表示安装完毕。
测试细节见官方安装文档安装面向 Linux* 的英特尔® OpenVINO™ 工具套件分发版
如运行第二步部分报Model Download Failed的错误,解决方法

转换TensorFlow模型

两步
进入model_optimizer,执行转换的py文件

cd /opt/intel/openvino_<version>/deployment_tools/model_optimizer
python3 mo_tf.py --input_model <INPUT_MODEL>.pb --output_dir <OUTOUT_DIR>

上述步骤,还有两组参数可用于转换模型
Framework-agnostic parameters
TensorFlow-specific parameters
笔者使用了一个较简单的CNN模型,使用了参数Input Shapes,输出IR文件成功。

编写调用推理引擎的程序

Inference Engine一般开发流程:

  1. 载入硬件插件
  2. 读取IR
  3. 配置输入输出
  4. 载入模型
  5. 创建推理请求
  6. 准备输入数据
  7. 执行推理计算
  8. 处理模型输出

测试代码

from openvino.inference_engine import IENetwork, IECore
import sys
import cv2
import tensorflow as tf
import time

device = "CPU"
model_xml = "/frozen_model.xml"
model_bin = "/frozen_model.bin"

image_height = 200
image_width = 200
path = "/circle_0_66.jpg"

#step 1
ie = IECore()

#step 2
net = ie.read_network(model=model_xml, weights=model_bin)
supported_layers = ie.query_network(net, device)
not_supported_layers = [l for l in net.layers.keys() if l not in supported_layers]
if len(not_supported_layers) != 0:
    print("Following layers are not supported by the plugin for specified device {}:\n {}".
          format('cpu', ', '.join(not_supported_layers)))
    print("Please try to specify cpu extensions library path in sample's command line parameters using -l "
          "or --cpu_extension command line argument")
    sys.exit(1)


'''
1 input(s) detected:
Name:input/x, type:float32, shape:(-1,200,200,3)
1 output(s) detected:
fc_2/BiasAdd
'''

#step 3
#准备输入输出张量
print("Preparing input blobs")
input_blob = next(iter(net.inputs))
out_blob = next(iter(net.outputs))
net.batch_size = 1

#step 4
exec_net = ie.load_network(network=net, num_requests=1, device_name=device)

#step 6
#prepar input
print("input")
data = cv2.imread(path)
image = cv2.cvtColor(data, cv2.COLOR_BGR2RGB)
image = tf.image.convert_image_dtype(image,tf.float32)#按照路径读取图片
image = tf.image.resize_image_with_crop_or_pad(image,image_height,image_width)#裁剪
image = tf.image.per_image_standardization(image)# 标准化

with tf.Session() as sess:
    image1 = sess.run(image)
    image = image1.transpose((2,0,1))
#step 7
#执行推断计算
    start = time.time()
    res = exec_net.infer(inputs={input_blob: image})
    end2 = time.time()
    print("openvino time is %0.6f"%((end2-start)))

#step 8
#get result
    res = res[out_blob]
    print(res)

经过多次测试,OpenVINO加速后处理时间在原处理时间的5-6倍

参考

OpenVINO工具包配置TensorFlow模型(一)
Converting a TensorFlow* Model
安装面向 Linux* 的英特尔® OpenVINO™ 工具套件分发版

openvino加速bert
OpenVINO推理简介

你可能感兴趣的:(使用openvino加速tensorflow记录)