量化感知训练支持量化的层以及约束如下,量化过程请参见获取更多样例。
表1 量化感知训练支持的层以及约束
支持的层类型 |
约束 |
nn.Dense:全连接层 |
- |
nn.Conv2d:卷积层 |
dilation为1、group为1、filter维度为4,或者dilation为1、group不为1,group=channel、filter维度为4 |
实现原理
量化感知训练实现原理如图1所示。
图1 量化感知训练原理
调用示例
本示例演示如何使用AMCT进行量化感知训练。
- 如下示例标有“由用户补充处理”的步骤,需要用户根据自己的模型和数据集进行补充处理,示例中仅为示例代码。
- 调用AMCT的部分,函数入参可以根据实际情况进行调整。量化感知训练基于用户的训练过程,请确保已经有基于MindSpore环境进行训练的脚本,并且训练后的精度正常。
- 导入AMCT包,设置日志级别。
|
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)
|
- 调用AMCT,执行量化流程。
- 构造初始化器。
使用
2训练后量化的结果进行初始化。
|
record_file = './tmp/record.txt'
initializer = UlqInitializer(record_file)
|
- 生成量化配置。
执行该步骤前,请参见
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)
|
- 保存量化模型。
根据量化因子以及修改后的模型,调用
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中恢复数据,继续训练,则调用流程为:
- 导入AMCT包,设置日志级别。
|
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)
|
- 调用AMCT,恢复量化训练流程。
- 修改模型,在模型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)
|
- 保存模型。
|
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)
|