基于Transformer的模型训练过程中经常出现grad_norm值为Nan或Inf的解决办法
【代码】基于Transformer的模型训练过程中经常出现grad_norm值为Nan或Inf的解决办法。
·
使用少量数据训练模型时非常正常,Loss收敛比较快代码没见报错,用大数据量训练训练时就跑了一定时间后报grad_norm值为Nan或Inf了,出现的时间不定但是跑不了太久,数据标注质量总体是有保证的,同一批数据用于训练别的模型没见报什么错,怀疑报错模型的代码实现或者参数设置有不大适合的地方,修改两处参数后即可顺利完成训练:
一是把transformer相关层次结构训练时使用的droppout去掉:
attn_cfgs=[
dict(
type='MultiheadAttention',
embed_dims=256,
num_heads=8,
dropout=0.1),
dict(
# type='PETRMultiheadFlashAttention',
type='PETRMultiheadAttention',
embed_dims=256,
num_heads=8,
dropout=0.1),
],
feedforward_channels=2048,
ffn_dropout=0.1,
with_cp=True, ###use checkpoint to save memory
operation_order=('self_attn', 'norm', 'cross_attn', 'norm',
'ffn', 'norm')),
改成:
attn_cfgs=[
dict(
type='MultiheadAttention',
embed_dims=256,
num_heads=8,
dropout=0),
dict(
# type='PETRMultiheadFlashAttention',
type='PETRMultiheadAttention',
embed_dims=256,
num_heads=8,
dropout=0),
],
feedforward_channels=2048,
ffn_dropout=0,
with_cp=True, ###use checkpoint to save memory
operation_order=('self_attn', 'norm', 'cross_attn', 'norm',
'ffn', 'norm')),
二是把grad的max_norm由默认的35改成1:
optimizer_config = dict(type='Fp16OptimizerHook', loss_scale='dynamic', grad_clip=dict(max_norm=1, norm_type=2))
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐

所有评论(0)