混合精度场景下,由于极端模型超参导致算子溢出
问题现象
SSD-Resnet50V1-FPN网络,在allow_mix_precision精度模式下,设置静态lossscale=1,执行单卡训练,发现global_step不更新,且每个迭代都有Sub融合算子溢出:
原因分析
经分析发现,在混合精度场景下,下图中75行的计算已优化为float16高性能计算,但由于该常量转换为float16时,超过float16表达范围变为0,导致81行出现除零错误,从而导致浮点溢出。
而该常量在模型意义上是通常的除零异常规避系数,发生在box encoder的坐标系转换阶段,用于避免宽、高信息为0的场景,由于模型的原型略微久远(2017年),该参数对混合精度训练的支持并不友善,导致溢出。
解决方案
对于以上极少数模型超参略微极端导致模型收敛变差的情况,可以通过调整EPSILON的取值为float16可表达的数据进行改善,比如根据经验,这里推荐1e-4,在模型超参可以稳定收敛的前提下,该修改几乎不影响模型收敛。
父主题: 模型训练问题(TensorFlow网络)