请问在qat训练中,我能否先用pytorch官方的qat方法来训练模型,然后再用地平线的qat工具量化导出hbir_qat_model模型。也就是说在训练时,不用oe包中的训练脚本train.py,但从导出定点模型之后,都用oe包中的脚本。这个可行吗?
可以不使用 OE 的 train.py,但不建议使用 PyTorch 官方 QAT 的 FakeQuant 体系直接训练后再接地平线 QAT 导出。地平线 QAT 导出依赖的是自己的 horizon_plugin_pytorch/HAT 的量化语义与插桩方式,也有一些特殊的算子实现/替换逻辑,PyTorch 原生 QAT 导出的模型量化标记通常无法被工具链按同样语义识别,容易出现“导出可做但精度/编译不可控”的问题。推荐做法是:训练阶段使用地平线的 QAT 组件(可以自写训练脚本,不必用 OE 的 train.py),训练完成后用用地平线API导出 HBIR/编译 HBM
明白,不过版本是平台发版同一管理了,单独发版本不太可能,也会导致管理混乱。这个目前的处理方式就是算法侧根据异常提示适配一下工具链的版本。如果docker不行,conda+whls也是OK的。当然,如果能docker,尽量docker哈,不管哪种,工具链换环境就位并验证OK了,就根据异常信息适配就OK了
ptq的话训练过程不依赖地平线框架工具,只要能导出onnx就可以使用地平线提供的工具完成后续的量化编译。但是qat的量化训练依赖horizon_plugin_pytorch这个包,这个是地平线自定义的,和官方的pytorch有差别,如果使用官方的进行量化训练,那后续编译阶段大概率会出问题,因为量化要插入一些节点的,pytorch官方的节点定义和地平线的很可能不一致。最好还是参考地平线oe包里面的qat示例,完成一次float calib qat compile流程,再把自己模型也在地平线框架中实现。如果是很简单的模型,比如2d 几乎纯卷积 不含transform等复杂操作的,ptq其实精度也差不多够用了,可以先ptq尝试