基础量化
量化感知训练支持量化的层以及约束如下,量化过程请参见获取更多样例>ResNet50。
支持的层类型 |
约束 |
---|---|
nn.Dense:全连接层 |
- |
nn.Conv2d:卷积层 |
dilation为1、group为1、filter维度为4,或者dilation为1、group不为1,group=channel、filter维度为4 |
实现原理
量化感知训练实现原理如图1所示。
蓝色部分为用户实现,灰色部分为用户调用昇腾模型压缩工具提供的 API 实现,使用流程如下:
- 首先进行训练后量化,得到calibration_record.txt文件,然后初始化UlqInitializer。
- 用户构造MindSpore的原始模型,调用create_quant_retrain_config生成量化感知训练的量化配置文件。
- 调用create_quant_retrain_model接口对原始MindSpore模型进行修改,修改后的模型中包含了权重量化和数据量化相关的算子。
- 如果训练过程未中断,则调用save_quant_retrain_model接口保存量化感知训练后的air格式的模型文件,该air格式的量化模型可以在昇腾AI处理器部署。
如果训练过程中断,则可以基于保存的checkpoint和量化配置文件,重新调用restore_quant_retrain_model接口,输出修改后的retrain network,继续进行量化感知的训练,训练结束后然后调用save_quant_retrain_model接口保存量化后的模型,导出air格式的量化模型文件。
调用示例
本示例演示如何使用昇腾模型压缩工具进行量化感知训练。
- 如下示例标有“由用户补充处理”的步骤,需要用户根据自己的模型和数据集进行补充处理,示例中仅为示例代码。
- 调用昇腾模型压缩工具的部分,函数入参可以根据实际情况进行调整。量化感知训练基于用户的训练过程,请确保已经有基于MindSpore环境进行训练的脚本,并且训练后的精度正常。
- 导入昇腾模型压缩工具包,设置日志级别。
import amct_mindspore as amct amct.set_logging_level(print_level='info', save_level='info')
- 参见快速入门进行一次训练后量化,使用训练后量化的量化因子作为量化感知训练的初始值。(可选,由用户补充处理)如果不想执行训练后量化,也可以参见如下示例手动设置初始值:
user_do_calibration()
- (由用户补充处理)准备网络,恢复训练参数,并将网络设置到训练状态。
- 调用昇腾模型压缩工具,执行量化流程。
- 构造初始化器。
- 生成量化配置。
执行该步骤前,请参见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)
- 修改模型。
在模型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.a之后执行。
optimizer = user_create_optimizer(quant_retrain_model)
- 训练模型,训练过程中保存的checkpoint应该包括量化因子。
quant_pth = './ckpt/user_model' user_train_model(optimizer, quant_retrain_model, train_data)
- 使用修改后的图,创建反向梯度。该步骤需要在4.a之后执行。
- 保存量化模型。
根据量化因子以及修改后的模型,调用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中恢复数据,继续训练,则调用流程为:
- 导入昇腾模型压缩工具包,设置日志级别。
import amct_mindspore as amct amct.set_logging_level(print_level='info', save_level='info')
- (由用户补充处理)准备网络,恢复训练参数,并将网络设置到训练状态。
- 创建网络。
ori_network = user_create_network()
- 恢复训练参数。
param_dict = load_checkpoint(user_network_checkpoint) load_param_into_net(ori_network, param_dict)
- 设置训练模式。
ori_network.set_train(True)
- 创建网络。
- 调用昇腾模型压缩工具,恢复量化训练流程。
- 修改模型,在模型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)
- (由用户补充处理)使用修改后的图,创建反向梯度,在训练集上做训练,训练量化因子。
- 使用修改后的图,创建反向梯度。该步骤需要在4.a之后执行。
optimizer = user_create_optimizer(quant_retrain_model)
- 训练模型,训练过程中保存的checkpoint应该包括量化因子。
quant_pth = './ckpt/user_model' user_train_model(optimizer, quant_retrain_model, train_data)
- 使用修改后的图,创建反向梯度。该步骤需要在4.a之后执行。
- 保存模型。
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)
- 修改模型,在模型ori_model插入量化相关的算子,从量化训练的checkpoint中恢复训练参数,保存为新的训练模型retrain_model。
父主题: 量化感知训练