四、模型优化器与推理引擎

四、模型优化器与推理引擎

1 DLDT介绍

​ DLDT:深度学习部署工具包(Deep Learning Deployment Toolkit)

​ 通过DLDT,模型可被转化为IR文件部署在Intel支持的硬件设备上,在该流程中原始模型经历了模型优化器和推理引擎两级优化,具体流程如下图所示。

四、模型优化器与推理引擎_第1张图片

2 模型优化器(Model Optimizer)

  1. 模型优化器:跨平台的命令行工具,负责将各种深度学习框架的模型转换为IR文件,以便推理引擎对其进行读取、加载与推理。

  2. 模型优化器的特点

    • 模型优化器的使用与硬件环境无关,其对模型的所有处理均是在不知道最终部署设备的前提下完成的,因此IR文件可在任何受支持的设备上运行。

    • 生成的IR文件可在AI应用的推理过程中反复使用,转换成IR文件后,模型的准确度会存在轻微下降,但性能会变得更强

    • ./OpenVINO/deployment_tools/model_optimizer/extensions/front/ 路径下,可找到模型各层的实际代码,可在此基础上进行自定义,以 LayerNorm 层为例,其部分代码如下:

      四、模型优化器与推理引擎_第2张图片

    • 若模型中的某层不受支持,可选择创建自定义层。若OpenVINO不支持你的拓扑结构,可使用相应的方法剪贴模型网络,并将其某部分或子图替换为可被支持的结构。

  3. 模型优化器功能

    • 可将多种深度学习框架的模型转换为IR文件

    • 可将模型网络操作映射到支持的库、内核或层

    • 可进行预处理操作,如采用 –reverse_input_channel 将输入通道顺序进行转换,从RGB转换为BGR

    • 可针对神经网络进行优化,调整神经网络的输入批次大小以及输入尺寸

    • 可调整模型数据或权重的格式,如FP32、FP16及INT8,不同设备支持的数据格式不同,具体如下:

      四、模型优化器与推理引擎_第3张图片

    • 可剪辑网络模型

    • 支持构建自定义层

  4. 采用模型优化器优化SSD-Mobilenet模型

    • 安装必要组件

      使用模型优化器的必要步骤是要确保模型已安装必要组件,进入 ./model_optimizer/install_prerequisites/ 目录下,运行bat文件,选定框架安装运行脚本,为所有软件套件安装必要组件

      四、模型优化器与推理引擎_第4张图片

    • 通过模型下载器下载模型

      python downloader.py --name ssd_mobilenet_v2_coco -o output_dir

      四、模型优化器与推理引擎_第5张图片

      下载后的模型内容如下:

      四、模型优化器与推理引擎_第6张图片

      • pd文件为训练结束时所冻结的模型,冻结模型中所有变量均存在固定值,若没有冻结模型,需要对该模型进行冻结

      • pipeline.config文件为网络拓扑的解释文件,需要将其用于模型优化器。为找到模型优化器要使用的参数,需要访问 ./deployment_tools/open_model_zoo/models/public/ 下相应模型的文件夹

        四、模型优化器与推理引擎_第7张图片

      • 可在 yml文件 中找到模型优化器所需参数

        四、模型优化器与推理引擎_第8张图片

    • 按照 yml文件 说明,运行模型优化器将冻结的 pb文件 转换为 IR文件,运行下述命令

      python $mo_dir$\mo.py 
      --input_model $model_path$\frozen_inference_graph.pb 
      --reverse_input_channels 
      --input_shape=[1,300,300,3] 
      --input=image_tensor 
      --transformations_config=$model_optimizer_path$\extensions\front\tf\ssd_v2_support.json 
      --tensorflow_object_detection_api_pipeline_config=$pipeline_path$\pipeline.config 
      --output=detection_classes,detection_scores,detection_boxes,num_detections 
      --model_name ssd-mobilenet
      

      四、模型优化器与推理引擎_第9张图片

    • 采用 IR文件 进行推理,执行检测任务

      需要注意的是,对于 layers 新版OpenVINO已不再支持,需要注释掉,否则会提示 openvino.inference_engine.ie_api.IENetwork’ object has no attribute ‘layers’ 错误

      四、模型优化器与推理引擎_第10张图片

      注释掉该部分,即可正常运行

      四、模型优化器与推理引擎_第11张图片

      输出图像如下图所示:

  5. 剪贴网络模型

    • 查找每个 layer id 所对应层的名称

      find "layer id" mobilenetv2-7.xml

      grep "layer id" mobilenetv2-7.xml | head -10

      四、模型优化器与推理引擎_第12张图片

    • 运行 mo.py ,将 Input 改为指定层的 name

      python mo.py --input_model mobilenetv2-7.onnx 
      --reverse_input_channels 
      --output_dir $output_path$ 
      --input mobilenetv20_features_conv0_fwd 
      --model_name mobilenetv2-7-no-head
      

      在这里插入图片描述

      注:在官方教学中,指定了 mean_valuesscale_values 的值,但是在个人实验时,剪贴模型后会提示 scale_values 值不匹配,因此未指定其输入值。

3 推理引擎(Inference Engine)

  1. 推理引擎优化

    • IR模型在生成时并未针对特定的运行设备进行优化,而是在IR文件输入到推理引擎后,由推理引擎针对特定的硬件环境对IR文件进行优化

    • 由于各种硬件设备存在不同的指令集与内存等,因此推理引擎采用灵活的插件架构去执行环境配置。插件架构的存在使得可在完全不同的设备上采用几乎相同的代码去执行任务

    • 每种插件均有其特定库,以CPU中的 MKL-DNN 为例,MKL-DNN会针对所有Intel CPU对应的内核、层或函数实施神经网络优化,若该库不支持你的层,可去构建一个自定义层并注册到推理引擎。

      四、模型优化器与推理引擎_第13张图片

    • 在推理之前,推理引擎将网络映射到正确库单元,并将网络发送到硬件插件,进行多个级别的硬件特定优化。

      • 网络级优化:一切操作不映射到内核,而是映射它们间的关系,如数据的重组。这样可以提高网络性能,在推理时最大限度的减少数据转化时间
      • 内存级优化:在内存中按特定设备的要求重组数据
      • 内核级优化:推理引擎将选择最适合架构指令集的正确实施方案,若CPU支持 AVX512指令集,其将被用于实施方案
  2. 推理引擎API

    • Intel为所有Intel架构硬件设备提供用于实施推理的一套简单且统一的API,其特殊插件架构支持优化推理性能和内存使用,主要采用C++语言

    • API接口:

      • IECore类:定义了一个推理引擎对象,无需指定特定设备

        • read_network():读入IR文件的函数
        • load_network():加载网络至指定设备,HETERO插件负责将不支持层的执行回退到其他设备,如 HETERO:FPGA,CPU ;MULTI插件则使得可在不同设备上运行每个推理调用,从而完整利用系统中所有设备,并行执行推理,如: device_name = MULTI:MYRIAD,CPU
      • InferRequest类:用于进行推理任务

4 性能评估

  1. 推理引擎工作流

    • 声明推理引擎对象,读取神经网络,并将网络加载到插件中。按照网络输入与输出的实际尺寸分配blob进行推理
    • 需要注意的是,模型的Accuracy并不等于性能,Accuracy只是深度学习的衡量指标,并不等于性能,甚至准确度越高的模型可能参数量越大,性能越容易受影响
  2. 影响模型性能的因素

    • 吞吐量:神经网络在一秒内可以处理的帧数,单位为“每秒推理数”,用 FPS 表示
    • 延迟:从数据开始分析到结果被读取的时间,单位是“毫秒(ms)”
    • 效率:单位是“瓦特”或“单位价格的每秒帧数”,基于系统的功耗或价格因素
  3. 影响神经网络性能的因素

    • 神经网络的拓扑结构或模型参数量

    • 异构设备:CPU、GPU、FPGA、AI加速器(VPU视觉处理单元),例如构建应用,先确定运行神经网络的地方,在Video计算设备上进行推理,在GPU上运行视频处理,在CPU上运行其他任务和逻辑

    • 模型精度(数据格式):Intel指令集架构拥有许多打包数据类型,可在一种打包数据类型上将许多数据打包后一次性对所有数据执行一项操作,即单指令、多数据

      • SSE4.2:可打包16个字节的INT8数据,并在一个时钟周期内对所有数据执行同一操作
      • AVX2:可打包32个字节的INT8数据
      • AVX512:可打包64个字节的INT8数据

      在生成IR文件之后进行校准流程(Calibration),校准流程在不降低准确性的情况下将尽可能多的层的数据转化为整型,其优势是为较小数据类型会占用较小的内存空间,可以减少操作量、加快执行速度。若模型数据格式为整型,则可用VNNI矢量神经网络指令在Intel DL Boost卷积层上实现3倍性能提升。

      四、模型优化器与推理引擎_第14张图片

    • 批处理:增加批处理层次可以提高计算效率,但大批次也会带来延迟增加

    • 异步执行:对每一帧进行异步处理可带来吞吐量的巨大提升

    • Throughput模式:通过监控并行数,控制CPU资源的智能分配,并分配至多个推理请求,CPU核心越多,功能的效率越高

你可能感兴趣的:(深度学习,人工智能,计算机视觉,openvino,python)