量化感知训练
QAT(Quantization-Aware Training)即量化感知训练,量化感知训练会重新训练量化模型,从而减小模型大小,并且加快推理过程。当前支持对PyTorch框架的CNN模型进行量化,并将量化后的模型保存为.onnx文件,量化过程中,需要用户自行提供模型与数据集,调用API接口完成模型的量化调优。
执行量化感知训练前需参考环境准备完成开发环境部署、Python环境变量、PyTorch框架及训练服务器环境变量配置。
类型 |
名称 |
框架 |
---|---|---|
图像分类 |
Resnet50 |
PyTorch |
MobileNetV2 |
PyTorch |
操作步骤
- 用户需自行准备模型、训练脚本和数据集,本样例以PyTorch框架的Resnet50和数据集ImageNet为例。
- 编辑训练脚本pytorch_resnet50_apex.py文件,导入如下接口。
from modelslim.pytorch.quant.qat import qsin_qat from modelslim.pytorch.quant.qat import save_qsin_qat_model
- (可选)调整日志输出等级,启动调优任务后,将打屏显示量化调优的日志信息。
from modelslim import set_logger_level set_logger_level("info") #根据实际情况配置
- 用户需自行关闭混合精度训练或降低混合精度训练的级别(将“opt_level”设为“O1”)。
- 在模型训练脚本中识别模型、优化器、损失函数的初始化顺序,将优化器的初始化调整到模型和损失函数之后。本样例使用Resnet50因符合该顺序无需执行此步骤。
- 在优化器初始化之前调用“qsin_qat”函数,将模型和损失函数替换为“qsin_qat”的输出。如在“optimizer = torch.optim.SGD(”前,调用函数替换模型和损失函数。请参考qsin_qat进行配置。
model, criterion = qsin_qat(model, criterion) #根据实际情况配置待量化模型实例和损失函数
- 在“main_worker”函数的最后调用“save_qsin_qat_model”函数,导出量化完成的ONNX模型。请参考save_qsin_qat_model进行配置。
save_qsin_qat_model(model, 'quantized_model.onnx', (1, 3, 224, 224)) #根据实际情况配置导出后模型文件名(文件后缀需为.onnx)和输入的shape
- 调用原训练流程进行单卡训练。
修改train_full_1p.sh文件,建议修改“batch_size”为128(batch size根据实际情况改小),“optimizer-batch-size”修改为-1(关闭梯度累积),同时在加载预训练模型时,建议将“train_epochs”设为1。执行如下命令启动单卡训练任务。
bash ./test/train_full_1p.sh --data_path=/datasets/imagenet #请根据实际情况配置数据集路径
父主题: 模型量化