文档
注册

基于强化学习的量化调优

基于强化学习的量化调优支持在昇腾910 AI处理器上进行模型搜索和量化,主要解决边侧推理设备及算力存在多样性、模型优化缺少硬件感知及自动优化过程的问题,根据边缘部署精度、算力、时延、内存不同约束目标,实现自动化的量化调优。

目前支持对包括但不限于表1中的模型进行基于强化学习的模型量化。

表1 自动量化调优已验证模型列表

类型

名称

框架

图像分类

ResNet50

MindSpore、PyTorch

MobileNetV2

MindSpore、PyTorch

VIT

MindSpore

图像分割类

DeepLabV3

MindSpore

目标检测类

FasterRCNN

MindSpore

YoloV5

MindSpore、PyTorch

YoloV4

PyTorch

YoloV3

MindSpore

YoloV3-Tiny

PyTorch

SSD

MindSpore、PyTorch

RetinaNet

PyTorch

自然语言处理

BERT-Base

MindSpore

ERNIE

MindSpore

Transformer

MindSpore

前提条件

请执行命令安装fvcore、onnx包。

如下命令如果使用非root用户安装,需要在安装命令后加上--user,例如:pip3 install fvcore --user

pip3 install fvcore
pip3 install onnx

基于强化学习的模型量化调优过程

量化调优过程(nas)包括以下步骤:
  1. 读取输入模型构建Graph IR用于量化算子定位、图结构优化、算子特征提取。此步骤需要用户提供一个返回模型实例的接口。
  2. 进行模型特征提取,提取算子Kernel参数、Shape参数、算子上下文结构等信息。
  3. 通过强化学习算法进行量化位宽搜索,构建候选量化位宽策略。
  4. 针对候选量化位宽策略构建量化后的模型结构及其Graph IR。
  5. 通过量化算法进行图结构优化、权重和激活值的量化算子参数标定和校正。对复杂模型,例如图像检测分割和transformer类的模型,需要提供一个校正接口,用来校正激活值的量化参数,接口实现主要是用部分训练集做一个epoch的推理,没有反向传播操作。
  6. 对量化后的模型进行精度评估。对复杂模型,例如图像检测分割和transformer类的模型,需要提供一个精度评估接口,返回量化后模型的精度。
  7. 生成可部署量化模型,进行在环测评,并将测评结果反馈到位宽搜索算法。
  8. 重复3~6步,直到搜索出满足指定精度、压缩率和时延指标的量化模型。

模型量化调优操作步骤(以PyTorch框架的ResNet50为例)

  1. 进入{CANN包安装路径}/ascend-toolkit/latest/tools/ascend_automl/examples/pytorch/quant/classification目录,已提供示例文件resnet_rl_quant.yml,建议拷贝至当前运行目录,并根据实际情况配置以下加粗字段。
    general:
        backend: pytorch   # pytorch
        device_category: NPU
        task:
          local_base_path: /path/of/workdir       #工作路径
          task_id: "quant_resnet50_pytorch"
        device_evaluate_before_train: False
    
    pipeline: [nas]
    
    nas:
        pipe_step:
            type: SearchPipeStep
        model:
            model_desc:
                type: ResNet50_ModelZoo    #该模型的定义方法需参照自定义模型注册
                version: resnet50
                config: classic
            input_shape: [ 1, 3, 224, 224 ]
        dataset:
            type:  Imagenet
            common:
                data_path: /path/of/dataset      #数据集路径
                drop_last: False
                shuffer: False
            …
    
        search_algorithm:
            …
    
            #choice: acc_first | compress_first
            reward_type: 'acc_first' #强化学习目标, 取值为“acc_first”(精度优先)或“compress_first”(压缩率优先)
            custom_reward: False     #自定义奖励值,如果为False,无需设置“latency_acc_ratio”
            latency_acc_ratio:   0.5 # 奖励值中时延相对于精度的比值,设为0时时延不参与奖励值计算,推荐设置为大于0.1
            stop_early: False     # 提前终止,如果设为True且当前采样满足精度阈值,时延阈值,压缩率阈值,算法将会提前终止任务
            acc_threshold: 0.5       #精度阈值,为原模型精度与量化采样模型精度之差,影响强化学习算法的奖励值
            latency_threshold: 5     #时延阈值,为原模型推理时延与量化采样模型推理时延之差,仅影响提前终止
            compress_threshold: 40   #压缩率阈值,为量化采样模型对比原模型的压缩率,仅影响提前终止
        search_space:                #搜索空间配置,无需修改
            type: SearchSpace        #搜索空间类型
            hyperparameters:         #超参数配置   
                -   key: network.bit_candidates     #搜索目标
                    type: CATEGORY                  #目标类型
                    range: [8, 32]                  #目标值域
        trainer:
            type: Trainer
            epochs: 1
            seed: 234
            callbacks: [QuantPTQCallback, ConvertOnnxCallback]
            pretrained_model_file: /path/of/pretrain/model/file   #ResNet50预训练权重文件
            …
    
        evaluator:
            type: Evaluator
            device_evaluator:
                type: DeviceEvaluator
                custom: QuantCustomEvaluator
                remote_host: http://xxx.xxx.xxx.xxx:port/  #远端推理服务器URL,后四位为端口号。如果在推理服务器中执行“vega-config -q sec”的返回值为“True”,请将“http”更改为“https”
                backend: 'pytorch'
                om_input_shape: '1,3,224,224'
                delete_eval_model: True   #是否删除搜索出的量化模型
    • 对图像分类网络模型进行模型量化时,以PyTorch框架的MobileNetV2为例,需要配置的yml文件为{CANN包安装路径}/ascend-toolkit/latest/tools/ascend_automl/examples/pytorch/quant/classification/mobilenetv2_quant.yml。
    • 对分割网络模型进行模型量化时,以PyTorch框架的DeepLabV3为例,需要配置的yml文件为{CANN包安装路径}/ascend-toolkit/latest/tools/ascend_automl/examples/pytorch/quant/segmentation/deeplabv3_quant.yml。
  2. 启动模型量化压缩任务。
    vega resnet_rl_quant.yml -d NPU

    任务结束后会在指定工作路径的log文件夹中输出搜索日志。如果在评估服务evaluator中,device_evaluator的delete_eval_model字段配置成“False”,将在指定的工作路径的output/nas文件夹中输出每个搜索结果对应的模型。

如果想对参考基于训练脚本的剪枝调优进行剪枝调优后的模型做模型量化调优,无需进行模型自定义注册和模型脚本,而需要提供模型描述文件(.json),具体可参考{CANN包安装路径}/ascend-toolkit/latest/tools/ascend_automl/example/pytorch/quant/classification/resnet_prune_rl_quant.yml进行修改。

模型量化调优操作步骤(以MindSpore框架的YoloV5为例)

  1. 进入{CANN包安装路径}/ascend-toolkit/latest/tools/ascend_automl/examples/mindspore/quant/detection/yolov5目录,已提供示例文件yolov5_ms_quant.yml,建议拷贝至当前运行目录,根据实际情况配置以下加粗字段。
    general:
        backend: mindspore  # pytorch | mindspore
        device_category: NPU
        task:
          local_base_path: ./tasks/
          task_id: "quant_yolov5"
        device_evaluate_before_train: False
        parallel_search: True
        logger:
          level: info
        worker:
          timeout: 720000000
    pipeline: [nas]
    
    nas:
        pipe_step:
            type: SearchPipeStep
        model:
            model_desc:
              type: PruneModel
              model_file_path: /home/examples/yolov5/src/yolo.py   #模型脚本,该脚本内需提供一个get_model方法返回需要量化的模型实例
              pkg_path: /home/examples/yolov5   #用户的训练脚本所在的目录
            pretrained_model_file: "/home/examples/yolov5/pre_train/0-300_274800.1130.ckpt"
            input_shape:
              - type: fp32
                tensor: True
                shape: [ 1,12,320,320 ]
              - type: int32
                tensor: False
                shape: [ 640,640 ]
    
        search_algorithm:        #搜索算法
            type: MsQuantRL      #用于量化的强化学习算法,MindSpore仅支持MsQuantRL
            codec: QuantRLCodec  #用于量化的强化学习算法编解码器,MindSpore仅支持QuantRLCodec
            policy:
                max_episode: 30   #最大采样次数,推荐值>100,越大越好,但是需要更多时间,如果无法确定,请使用一个较大的值,并开启提前终止
                num_warmup: 10    #不训练,仅补充强化学习算法的经验回放的采样次数, 推荐值为:10-20
            objective_keys: [ 'accuracy','compress_ratio','latency' ]     #优化目标,“accuracy”为必选参数
    
            reward_type: 'compress_first'#强化学习目标, 取值为“acc_first”(精度优先)或“compress_first”(压缩率优先)
    
            custom_reward: False     #自定义奖励值,如果为False,无需设置“latency_acc_ratio”
            latency_acc_ratio: 0.5   #奖励值中时延相对于精度的比值,设为0时时延不参与奖励值计算,推荐设置为大于0.1
            stop_early: False     #是否提前终止任务,如果设为True且当前采样满足精度阈值,时延阈值,压缩率阈值,算法将会提前终止
            acc_threshold: 0.5       #精度阈值,为原模型精度与量化采样模型精度之差,影响强化学习算法的奖励值
            latency_threshold: 5     #时延阈值,为原模型推理时延与量化采样模型推理时延之差,仅影响提前终止
            compress_threshold: 40   #压缩率阈值,为量化采样模型对比原模型的压缩率,仅影响提前终止
    
        search_space:                #搜索空间配置,无需修改
            type: SearchSpace        #搜索空间类型
            hyperparameters:         #超参数配置
                -   key: network.bit_candidates    #搜索目标
                    type: CATEGORY                 #目标类型
                    range: [ 8, 32]                #目标值域
    
        trainer:         #训练脚本以及训练参数配置
          type: OriTrainer    #量化训练器,不需要修改
          seed: 234           #随机数种子
          callbacks: [MsQuantPTQCallback, CustomMetricCallback, CustomExportCallback]   #用于输出模型的回调,不需配置
          calib_portion: 0.01  #校准数据量
          custom_calib:      #自定义的校准方法
            pkg_path: /home/examples/yolov5/    #calib_func接口所在包路径
            path: /home/examples/yolov5/train.py    #接口所在路径
            func: calib_func     
    #对检测类模型,需要提供校正接口,校正方法可参考该{CANN包安装路径}/ascend-toolkit/latest/tools/ascend_automl/example/pytorch/quant/classification/resnet_custom_func.py脚本
          custom_eval:     #自定义的评估方法
            pkg_path: /home/examples/yolov5/          #eval_func接口所在包路径
            path: /home/examples/yolov5/eval.py       #接口所在路径
            func: run_eval     #对检测类模型,需要提供验证接口,验证方法可参考{CANN包安装路径}/ascend-toolkit/latest/tools/ascend_automl/example/pytorch/quant/classification/resnet_custom_func.py脚本
            metric_name: "mAP"     #需要优化的指标
    
        evaluator:
            type: Evaluator
            device_evaluator:
              type: DeviceEvaluator
              custom: QuantCustomEvaluator
              om_input_shape: 'input_0:1,12,320,320'
              backend: mindspore
              delete_eval_model: False   #是否删除搜索出的量化模型
              hardware: "Davinci"
              remote_host: "http://x.x.x.x:xxxx"  #远端推理服务器URL,后四位为端口号。如果在推理服务器中执行“vega-config -q sec”的返回值为“True”,请将“http”更改为“https”
              repeat_times: 1
              muti_input: True
              save_intermediate_file: True

    对于检测类模型需要提供一个校正接口,需要利用训练数据集做前向计算,校正量化参数。不需要做反向计算,反向传播相关的代码可以去掉,比如学习率,loss,优化器,校正接口具体配置可参考OriTrainercustom_calib字段。

    对于检测类模型需要提供一个评估接口,计算模型精度指标,需要返回dict类型的评估结果,评估接口具体配置可参考OriTrainercustom_eval字段。其中,metric_name是返回的评估结果中的一个key值。

  2. 启动模型量化调优任务。
    vega yolov5_ms_quant.yml -d NPU

    任务结束后会在指定工作路径的log文件夹中输出搜索日志。如果在评估服务evaluator中,device_evaluator的delete_eval_model字段配置成“False”,将在指定的工作路径的output/nas文件夹中输出每个搜索结果对应的模型。

如果想对参考基于训练脚本的剪枝调优进行剪枝调优后的模型做模型量化调优,无需提供模型脚本,提供模型描述文件(.json)即可,具体可参考{CANN包安装路径}/ascend-toolkit/latest/tools/ascend_automl/examples/mindspore/quant/detection/yolov5/yolov5_prune_ms_quant.yml进行修改。

transformer类模型量化调优操作步骤(以MindSpore框架的ERNIE为例)

  1. 进入{CANN包安装路径}/ascend-toolkit/latest/tools/ascend_automl/examples/mindspore/quant/nlp/ernie目录。
  2. 参见ernie_chnsenticorp_quant.md下载ERNIE源码和数据,构建获取模型函数、模型输入函数、校正函数和评估函数。
  3. 在ernie_chnsenticorp_quant.yml文件中根据实际情况配置以下加粗字段。
    general:
        backend: mindspore
        device_category: NPU
        device_evaluate_before_train: False
        task:
            local_base_path: ./tasks/  #工作路径
            task_id: "ernie_chnsenticorp_quant"
        logger:
            level: info
        worker:
            timeout: 720000000
    pipeline: [nas]
    
    register:
        pkg_path: [ "/xxx/ERNIE_for_MindSpore_1.6_code" ]   #ERNIE源码路径
        modules:
            - module: "run_ernie_classifier"  #模块导入
              script_network: "get_model"   #获取模型实例的函数
              script_network_input: ["get_input"]   #获取模型输入的函数
              ori_correct_func: ["calib_func"]    #量化参数校正的函数
              ori_eval_func: ["eval_func"]    #量化后模型精度评估的函数
    
    nas:
        pipe_step:
            type: SearchPipeStep
        model:
            model_desc:
                type: ScriptModelGen
                common:
                    network:
                        type: get_model
                        config:
                            checkpoint_path: "/xxx/chnsenticorp-0-10_400.ckpt"   #模型权重文件路径
                    multiple_inputs:
                        type: get_input
                        config:
                            eval_batch_size: 1
                            eval_data_file_path: "/xxx/chnsenticorp_test.mindrecord"   #推理数据集路径
    
    
    
        search_algorithm:        #搜索算法
            type: MsQuantRL      #用于量化的强化学习算法,MindSpore仅支持MsQuantRL
            codec: QuantRLCodec  #用于量化的强化学习算法编解码器,MindSpore仅支持QuantRLCodec
            policy:
                max_episode: 30   #最大采样次数,推荐值>100,越大越好,但是需要更多时间,如果无法确定,请使用一个较大的值,并开启提前终止
                num_warmup: 10    #不训练,仅补充强化学习算法的经验回放的采样次数, 推荐值为:10-20
            objective_keys: [ 'accuracy','compress_ratio','latency' ]    #优化目标,“accuracy”为必选参数
    
            #choice: acc_first | compress_first
            reward_type: 'compress_first'    #强化学习目标, 取值为“acc_first”(精度优先)或“compress_first”(压缩率优先)
    
            custom_reward: False             #自定义奖励值,如果为False,无需设置“latency_acc_ratio”
            latency_acc_ratio: 0.5           #奖励值中时延相对于精度的比值,设为0时时延不参与奖励值计算,推荐设置为大于0.1
            stop_early: False                #提前终止,如果设为True且当前采样满足精度阈值,时延阈值,压缩率阈值,算法将会提前终止
            acc_threshold: 0.5               #精度阈值,为原模型精度与量化采样模型精度之差,影响强化学习算法的奖励值
            latency_threshold: 5             #时延阈值,为原模型推理时延与量化采样模型推理时延之差,仅影响提前终止
            compress_threshold: 40           #压缩率阈值,为量化采样模型对比原模型的压缩率,仅影响提前终止
    
    
        search_space:                        #搜索空间配置,无需修改
            type: SearchSpace                #搜索空间类型
            hyperparameters:                 #超参数配置
                -   key: network.bit_candidates     #搜索目标
                    type: CATEGORY                  #目标类型
                    range: [8, 32]                  #目标值域
    
        trainer:
            type: QuantTrainer
            seed: 234
            calib_portion: 0.1
            callbacks: [OptExportCallback]
            custom_calib:
                type: calib_func#已注册的校正函数
                config:
                    train_batch_size: 32
                    train_data_file_path: "/xxx/chnsenticorp_train.mindrecord"   #训练数据集路径
            custom_eval:
                type: eval_func   #已注册的评估函数
                metric_name: "accuracy"
                config:
                    eval_batch_size: 1
                    eval_data_file_path: "/xxx/chnsenticorp_test.mindrecord"   #推理数据集路径
    
        evaluator:
            type: Evaluator
            device_evaluator:
                type: DeviceEvaluator
                custom: QuantCustomEvaluator
                backend: mindspore
                delete_eval_model: True
                hardware: "Davinci"
                remote_host: "http://xx.xx.xx.xx:xxxx"    #远端推理服务器URL,后四位为端口号。如果在推理服务器中执行“vega-config -q sec”的返回值为“True”,请将“http”更改为“https”
                repeat_times: 1
                muti_input: True
  4. 启动模型量化任务。
    vega ernie_chnsenticorp_quant.yml -d NPU

    任务结束后会在指定工作路径的log文件夹中输出搜索日志。在评估服务evaluator中,如果在device_evaluator中配置“save_intermediate_file: True”,将在指定的工作路径的output/nas文件夹中输出每个搜索结果对应的模型。

搜索结果
找到“0”个结果

当前产品无相关内容

未找到相关内容,请尝试其他搜索词