量化训练流程
本文档仅说明在HAT中进行量化训练时需要的操作,关于量化的基本原理和在训练框架中的实现方式请参阅 horizon_plugin_pytorch 的相关文档。
在量化训练中,由浮点模型到定点模型的转换流程如下:
其中大部分步骤都已集成在HAT的训练pipeline中,只需注意在添加自定义模型时实现 fuse_model 方法来完成模型融合,且实现 set_qconfig 方法对量化方式进行配置即可。在编写模型时需要注意以下几点:
-
HAT只会调用最外层模块的
fuse_model方法,因此在fuse_model的实现中要负责所有子模块的fuse。 -
优先使用
hat.models.base_modules中提供的基础模块,这些基础模块已实现fuse_model方法,可减少工作量和开发难度。 -
模型注册,HAT中的各种模块全部采用了注册机制,只有将定义的模型在对应的注册项中进行注册,才可以在config文件中以
dict(type={$class_name}, ...)的形式使用模型。 -
需要在最外层模块实现
set_qconfig方法,如果子模块中有特殊layer需单独设置 QConfig,也需要在该子模块中实现set_qconfig方法,此部分细节可见 Qconfig配置介绍 章节。
此外,为使模型可转为量化模型,需要满足一些条件,具体见horizon_plugin_pytorch 的相关文档。
添加自定义模型
添加 config 文件
训练
只需在使用 tools/train.py 脚本时按顺序指定训练阶段即可,会自动根据训练阶段调用相应的 solver 来执行训练过程:
-
float:正常的浮点训练。
-
qat:QAT训练(量化感知训练),首先初始化一个浮点模型,加载训练好的浮点模型权重,再将此模点模型转为QAT模型进行训练。
-
int_infer:定点转化预测,此阶段首先初始化一个浮点模型,将此浮点模型先转为QAT模型并加载训练好的QAT模型权重,再将 QAT模型转为定点模型。转出的定点模型无法进行训练,只能执行validation得到最终的定点模型精度。
恢复训练
可以通过在 config 的 {stage}_trainer 中配置 resume_optimizer 和 resume_epoch_or_step 字段来恢复意外中断的训练,或仅恢复optimizer来进行fine-tune。例如:
恢复训练有三种使用场景:
-
完全恢复: 该场景为恢复意外中断的训练,会恢复上一个checkpoint的所有状态,包括optimizer、LR、epoch、step 等。该场景只需配置
resume_optimizer字段即可; -
恢复optimizer用于fine-tune: 该场景只会恢复optimizer和LR的状态,但epoch、step都会从0开始,用于某些任务的 fine-tune。该场景需要配置
resume_optimizer,并且需要配置resume_epoch_or_step=False。 -
只加载模型参数: 该场景只会加载模型参数,不会恢复其他任何状态(optimizer、epoch、step、LR)。该场景只需要在
model_convert_pipeline中配置LoadCheckpoint,并且需要配置resume_optimizer=False和resume_epoch_or_step=False。
