Tongjilibo / bert4torch

An elegent pytorch implement of transformers
https://bert4torch.readthedocs.io/
MIT License
1.22k stars 152 forks source link

训练进度条中,loss一直显示Nan的问题 #144

Open Yikai-Liao opened 1 year ago

Yikai-Liao commented 1 year ago

基本信息

问题反馈

当loss 出现一次Nan之后,即使后续没有Nan, 进度条也会因为平滑机制一直显示Nan

2023-07-27 10:26:24 - Epoch: 1/10
2660/6659 [==========>...................] - ETA: 7:48 - loss: nan - pos: 0.0764 - pitch: 0.1843 - decoder: nan - acc: 0.8350 

根据WandB中的记录,实际上只有一个step出现了Nan 图片

并且进度条中的loss感觉有些平滑过度,希望能与WandB一样,自由选择平滑方式和平滑的程度。

注:训练中开启混合精度

model.compile(
    loss=loss_func, 
    optimizer=optim, 
    mixed_precision=True, 
    scheduler=scheduler, 
    metrics={'acc': acc},
    clip_grad_norm=1.0
)
Tongjilibo commented 1 year ago
  1. wandb是记录了每个batch的的指标,通过后续来平滑方式来记录的
  2. 你可以在compile时候传入stateful_metrics=['loss']来实现指标均不平滑(只记录状态量),这样进度条的指标显示的也是每个batch的指标,抖动会很明显;
  3. 在v0.3.1.post2之后,除了stateful_metrics指定指标不平滑,还可以通过smooth_interval来指定平滑的步数,也就是最近n个batch的平均指标;并且设计的思路是进度条平滑了,后面记录(wandb, tensorboard, logger等)的指标也是平滑的指标,如果进度条不平滑,后面记录的也是不平滑的指标,两者保持一致
  4. 我之前设计的思路是参考keras来的,后续我也考虑看看这块需不需要优化
Yikai-Liao commented 1 year ago

可以先把Nan过滤加上

Tongjilibo commented 1 year ago

如果按照你的需求,你直接设置stateful_metrics=['loss', 'pos', 'pitch']等等就可以了啊,这个时候进度条只是显示当前batch的loss,后续不会再显示nan了,而且感觉loss出现nan也是不太正常的

Yikai-Liao commented 1 year ago

这里出现Nan的原因还我没搞清楚。但是我记得有一种情况是,amp混合精度的scale会引起Nan,然后它会自动跳过这次更新,并调整scale,不影响后续训练。

Tongjilibo commented 1 year ago

安装bert4torch==0.3.3, 可以通过设置os.environ['IGNORE_NAN_VALUES'] = 'true'来跳过nan的指标显示