1. 显/隐式时序
目前,在很多算法模型中,都用到了时序模块,时序主要是指将前一帧的部分输出作为下一帧的输入。本文,根据 是否将时序输入/输出 直接 作为网络模型的输入/输出,把时序划分为“显式时序”(explicit temporal model)和“隐式时序”(implicit temporal model)。
显式时序:
模型显式输出当前帧的特征,作为下一帧的输入,形成时间上的依赖。
常用于连续帧推理或视频流检测任务。
隐式时序:
某些模型会维护时间缓存(例如前一帧的特征、状态),但这作为模型内部状态传递,而不是输入输出张量显式传入。
仅看模型输入输出,无法看出是否为时序模型,时序输入是直接在模型里面的,forward 之后会有个 model.xxxx = out,然后下一次输入直接拿这个 model.xxx。
2. 时序模型量化部署
对于隐式时序而言,在量化部署阶段没什么特殊的,根据输入输出常规插入quantstub/Dequantstub,然后进行常规量化、推理即可。但对于显式时序而言,由于模型显式输出当前帧的特征,并作为下一帧的输入,在板端部署需要采用量化int类型时,会存在时序输入scale与对应时序输出scale相同的要求。如果在量化时满足这一点呢?
在时序输出dequantstub前,过一次该时序输入的quantstub,这样就能calib/qat时,保证scale一致了,示例如下:重点关注self.quant_h的使用
可视化onnx如下,看其中的scale即可


3. 时序精度debug
在工具链用户手册《量化感知训练QAT-开发指南-精度调优工具使用指南》介绍了plugin 量化工具如何使用。对于显式时序而言,在精度debug阶段没什么特殊的,根据输入输出准备数据即可,可以将时序输入置为全0,此时可能无法分析时序对于模型精度的影响。可以float模型先跑一帧,将第一帧输出保存下来,将时序输出作为下一帧时序的输入。
对于隐式时序而言,希望分析时序对于模型精度影响的话,应该怎么办呢?此时,需要用到:
auto_find_bad_case
set_bad_case
注意baseline_model_cached_attr于analysis_model_cached_attr数据要相同,否则从初始输入就不同,会影响分析。
示例如下:重点关注qa.set_bad_case即可

