基于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))
更多推荐
所有评论(0)