全部产品
云市场

模型优化最佳实践

更新时间:2020-03-23 15:38:55

很多用户在使用PAI-Blade进行深度学习模型优化时,都遇到了几分钟快速优化完之后,实际的优化效果可能没有达到预期的问题,这个时候该如何调整配置重新优化?本文主要介绍常规的用户进行多次优化实验的操作路径。

注意:PAI-Blade在公测阶段,仅开放上海Region

建议整体测试路径,:

  • 【零输入优化】O1优化层级(通用标准优化)
  • 【零输入优化】O2优化层级(+INT8量化,注意:仅TensorFlow模型支持在零输入情况下进行O2优化)
  • 【数据辅助优化】O1优化层级(通用标准优化)+ 用户提供test_data
  • 【数据辅助优化】O2优化层级(+INT8量化)+ 用户提供calibration_dataset

一、零输入优化

PAI-Blade提供了“零输入”优化的模式,为了最大程度降低用户的使用门槛,具体是指用户直接提供模型就可以进行优化,也是最多的PAI-Blade优化任务采用的方式。在PAI-Blade控制台上传模型后,一键提交然后查看优化结果即可,上传模型和模型优化的操作可以参考模型优化操作手册

零输入优化环节可以按照如下顺序进行测试:

  • O1优化层级(通用标准优化),完全无损优化
  • O2优化层级(+INT8量化,注意:仅TensorFlow模型支持在零输入情况下进行O2优化)
    我们做了非常多的工作保证在量化后模型的精度不受损失,但还是建议在进行O2优化后,对优化后的模型精度在您自己的效果验证集上进行测试,如果符合预期再进行模型生产部署。


这个时候Blade会采用自己生成的随机数据来模拟这个模型的输入数据进行分析和优化。但是这种模式不是所有模型都适用,通常是如果有的模型的输入数据是系统无法模拟的数据,有可能会导致模型优化没有效果。
因此建议如果您需要优化一些有语义的模型,比如:目标检测、NLP、OCR这些场景下的模型,可以直接采用“数据辅助优化”的方法,或者在尝试过零输入优化之后发现并没有优化效果,也可以采用“数据辅助优化”来进行进一步的优化实验。

二、数据辅助优化

首先介绍两种数据概念:

  1. test_data: 测试输入数据,目的让Blade可以直接用来跑通模型流程,只需要一条正确的输入数据就可以满足需求
  2. calibration_dataset: 校正数据集,在进行O2优化时如果提供了calibration_dataset,系统会用来做INT8离线量化。用来做calibration的数据是模型的典型输入数据,一般可以从训练集中选取1000组左右(1000 batches)。


接下来通过三个步骤完成数据辅助优化。

1. 如何准备辅助数据

前述的两种辅助数据集都需要以numpy array的方式保存为”.npy”文件来提交。保存的内容是一个字典,key是模型input tensor的名称(如”Placeholder:0”),value则测试输入数据/供O2量化使用的calibration数据。
以下是一段示例的code来展示如何准备test_data/calibration_dataset:
calib
该”calib”是一个字典。字典的Key是tensor name(for tensorflow) 或者blob name(for caffe),而字典的Value是输入数据的list。

  • 对于Tensorflow模型,由于网络的输入可以是dynamic shape的,因此list里的numpy array就需要是有shape的数组。shape的维度对应网络里定义的维度,以便可以直接feed到相应的tensor。
  • 而对于Caffe模型,由于shape信息在网络(prototxt)中是固定的,因此list里的numpy array可以是对应网络里shape的数组,也可以是一维数组(flattened)。但元素个数必须对应网络中的shape。

2. 上传模型+数据

上传模型时,添加用户做优化辅助的输入数据文件一起打包,如下面的模型里添加了一个名为CRNN_test_data.npy的数据文件,这个文件里只有一条数据,因此主要是用来做test_data,无法做calibration_dataset。
CRNN.tar.gz
crnn

3. 模型优化参数配置

在数据辅助优化这个环节,尝试顺序可以按照:

  • O1优化层级(通用标准优化)+提供test_data
  • O2优化层级(+INT8量化)+提供calibration_dataset

来进行。

  • 如下图是O1优化层级(通用标准优化)+提供test_data优化配置,在模型优化配置过程中,选择刚刚上传的CRNN模型后,优化层级选择O1,勾选“高级配置”,并在文本框里加上

    1. {"test_data": "CRNN_test_data.npy"}


    test_data配置

  • 如果O2优化层级(采用INT8量化)+提供calibration_dataset配置逻辑也是一样的,优化层级选择O2,勾选“高级配置”,并在文本框里加上:

    1. {"calibration_dataset": "CRNN_calibration_data.npy"}


我们做了非常多的工作保证在量化后模型的精度不受损失,但还是建议在进行O2优化后,对优化后的模型精度在您自己的效果验证集上进行测试,如果符合预期再进行模型生产部署。

三. 卡型选择

如果实际部署使用的卡型已经确定,请直接在模型优化任务配置中选择与部署一致的卡型。
但实际上,模型优化是模型部署的前置环节,并且在PAI-EAS在线预测平台上,我们支持的资源类型非常灵活;而模型优化任务耗时很少,多次优化成本很低。因此建议在Blade模型优化环节先进行多种卡型的优化尝试,根据性能数据选择出性价比更高的卡型,再用于实际的模型部署卡型选择指导。