文档
注册

基础量化

量化感知训练支持量化的层以及约束如下,量化过程请参见获取更多样例>ResNet50。

表1 量化感知训练支持的层以及约束

支持的层类型

约束

nn.Dense:全连接层

-

nn.Conv2d:卷积层

dilation为1、group为1、filter维度为4,或者dilation为1、group不为1,group=channel、filter维度为4

实现原理

量化感知训练实现原理如图1所示。

图1 量化感知训练原理
蓝色部分为用户实现,灰色部分为用户调用AMCT提供的 API 实现,使用流程如下:
  1. 首先进行训练后量化,得到calibration_record.txt文件,然后初始化UlqInitializer
  2. 用户构造MindSpore的原始模型,调用create_quant_retrain_config生成量化感知训练的量化配置文件。
  3. 调用create_quant_retrain_model接口对原始MindSpore模型进行修改,修改后的模型中包含了权重量化和数据量化相关的算子。
  4. 如果训练过程未中断,则调用save_quant_retrain_model接口保存量化感知训练后的air格式的模型文件,该air格式的量化模型可以在昇腾AI处理器部署。

    如果训练过程中断,则可以基于保存的checkpoint和量化配置文件,重新调用restore_quant_retrain_model接口,输出修改后的retrain network,继续进行量化感知的训练,训练结束后然后调用save_quant_retrain_model接口保存量化后的模型,导出air格式的量化模型文件。

调用示例

本示例演示如何使用AMCT进行量化感知训练。

  1. 如下示例标有“由用户补充处理”的步骤,需要用户根据自己的模型和数据集进行补充处理,示例中仅为示例代码。
  2. 调用AMCT的部分,函数入参可以根据实际情况进行调整。量化感知训练基于用户的训练过程,请确保已经有基于MindSpore环境进行训练的脚本,并且训练后的精度正常。
  1. 导入AMCT包,设置日志级别。
    import amct_mindspore as amct
    amct.set_logging_level(print_level='info', save_level='info')
  2. 参见快速入门进行一次训练后量化,使用训练后量化的量化因子作为量化感知训练的初始值。
    (可选,由用户补充处理)如果不想执行训练后量化,也可以参见如下示例手动设置初始值:
    user_do_calibration()
  3. (由用户补充处理)准备网络,恢复训练参数,并将网络设置到训练状态。
    1. 创建网络。
      ori_network = user_create_network()
    2. 恢复训练参数。
      param_dict = load_checkpoint(user_network_checkpoint)
      load_param_into_net(ori_network, param_dict)
    3. 设置训练模式。
      ori_network.set_train(True)
  4. 调用AMCT,执行量化流程。
    1. 构造初始化器。
      使用2训练后量化的结果进行初始化。
      record_file = './tmp/record.txt'
      initializer = UlqInitializer(record_file)
    2. 生成量化配置。
      执行该步骤前,请参见3.b先恢复训练好的参数。
      config_file = './tmp/config.json'
      fake_input_data = np.random.uniform(0.0, 1.0, size=ori_network_input_shape).astype(np.float32)
      amct.create_quant_retrain_config(config_file=config_file,
                                       network=ori_network,
                                       input_data=fake_input_data)
    3. 修改模型。
      在模型ori_model中插入数据量化、权重量化等相关算子,然后保存为新的训练模型retrain_model。
      retrain_network = amct.create_quant_retrain_model(config_file=config_file,
      						  network=ori_network,
      						  initializer=initializer,
                                                        input_data=fake_input_data)

      该过程中如果提示数据类型不一致等类似信息,则请参见量化感知训练场景下,出现数据类型不一致的解决方法处理。

    4. (由用户补充处理)使用修改后的图,创建反向梯度,在训练集上做训练,训练量化因子。
      1. 使用修改后的图,创建反向梯度。该步骤需要在4.a之后执行。
        optimizer = user_create_optimizer(quant_retrain_model)
      2. 训练模型,训练过程中保存的checkpoint应该包括量化因子。
        quant_pth = './ckpt/user_model'
        user_train_model(optimizer, quant_retrain_model, train_data)
    5. 保存量化模型。
      根据量化因子以及修改后的模型,调用save_quant_retrain_model接口,插入AscendQuant、AscendDequant等算子,保存为量化模型。
      quant_model_path = './result/user_model'
      amct.save_quant_retrain_model(config_file=config_file,
                                    file_name=quant_model_path,
                                    network=retrain_network,
                                    input_data=fake_input_data)

如果训练过程中断,需要从ckpt中恢复数据,继续训练,则调用流程为:

  1. 导入AMCT包,设置日志级别。
    import amct_mindspore as amct
    amct.set_logging_level(print_level='info', save_level='info')
  2. (由用户补充处理)准备网络,恢复训练参数,并将网络设置到训练状态。
    1. 创建网络。
      ori_network = user_create_network()
    2. 恢复训练参数。
      param_dict = load_checkpoint(user_network_checkpoint)
      load_param_into_net(ori_network, param_dict)
    3. 设置训练模式。
      ori_network.set_train(True)
  3. 调用AMCT,恢复量化训练流程。
    1. 修改模型,在模型ori_model插入量化相关的算子,从量化训练的checkpoint中恢复训练参数,保存为新的训练模型retrain_model。
      执行该步骤前,请参见3.b先恢复训练好的参数。
      config_file = './tmp/config.json'
      fake_input_data = np.random.uniform(0.0, 1.0, size=ori_network_input_shape).astype(np.float32)
      checkpoint_path = './ckpt/user_model-newest.ckpt'
      retrain_network = amct.restore_quant_retrain_model(config_file=config_file,
      						   network=ori_network,
      						   checkpoint_path=checkpoint_path,
                                                         input_data=fake_input_data)
    2. (由用户补充处理)使用修改后的图,创建反向梯度,在训练集上做训练,训练量化因子。
      1. 使用修改后的图,创建反向梯度。该步骤需要在4.a之后执行。
        optimizer = user_create_optimizer(quant_retrain_model)
      2. 训练模型,训练过程中保存的checkpoint应该包括量化因子。
        quant_pth = './ckpt/user_model'
        user_train_model(optimizer, quant_retrain_model, train_data)
    3. 保存模型。
      quant_model_path = './result/user_model'
      amct.save_quant_retrain_model(config_file=config_file,
                                    file_name=quant_model_path,
                                    network=retrain_network,
                                    input_data=fake_input_data)
搜索结果
找到“0”个结果

当前产品无相关内容

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