常见error

  1. check‘optimizer = torch.optim.Adam(params’的params的写法,不同模态叠加时候,params不同
  2. 当loss震荡,比较锯齿不平滑,设置小一点lr:optimizer = torch.optim.Adam(params, lr=0.00001)
  3. 【已解决】RuntimeError: CUDA error: device-side assert triggeredCUDA kernel errors might be asynchronous-CSDN博客
  4. 大量NaN怎么办:大模型工程化必备技巧——模型训练过程中发现输出大量NaN怎么办?建议收藏 (qq.com)
    1. 四个常见原因,包括梯度爆炸、学习率过大、数据本身过于稀疏或质量太差以及 backward 时出现 0 在分母上或有无穷大的数。
    2. 针对学习率过大或数据质量差可调整学习率和进行数据消融,对梯度爆炸可在 model.step () 前进行梯度裁剪
      1
      torch.nn.utils.clip_grad_norm_(model.parameters(), 1.0)  
    3. 对于出现 0 或无穷大的情况可打印运算结果并对出现 NaN 的值进行替换
      1
      2
      3
      4
      5
      # 假设a为第一次出现NaN的向量
      a = torch.where(torch.isnan(a), torch.full_like(a, 0), a)

      # 下面是当a中出现无穷大时
      a = torch.where(torch.isinf(a), torch.full_like(a, 0), a)
  5. 训练不好,查看梯度变化,第几层导致。eg:MocoV3冻结patch projection可以解决训练不稳定的问题

数据模态少了。loss一直飙升——过拟合

  • 增大epoch,增大lr,增大dropout,正则化

调参

  1. lr
    1. 只是把 lr 从 1 e-6 改成 1 e-5,就跑了 80 个 epoch 就开始报 nan 的 loss。 ——方法是把 batch 调大
    2. 数据量大了,learning rate 要调整小。
    3. loss 下降波动比较毛刺的时候,将 lr 调小,也不行,可能下降更慢
    4. ‘the clip used on video-text retrieval is learning-rate sensitivity’无监督训练好的去做下游任务finetune时候,对lr很敏感,甚至moco设置的30,可以试下gradient search,多试试
  2. scheduler
    1. 可以scheduler = torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer, mode=’min’, factor=0.1, patience=10, min_lr=1e-8),
  3. 调小epoch size
  4. 最详细最清晰的epoch、batchsize和iteration概念辨析_batch size和epoch-CSDN博客
  5. batch size
    1. 非常大所有数据一次性传,效果好了。
    2. 在使用具有线性学习率缩放的标准 SGD/Momentum 时,大批次的训练可能会不稳定(Goyal 等人,2017 年)。为了稳定训练,我们对所有批次规模都使用了 LARS 优化器(You 等人,2017 年)。
  6. 模型实验代码技巧_模型设置seed-CSDN博客 求导监测
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    # 正向传播开启自动求导异常侦测
    torch.autograd.set_detect_anomaly(True)

    # 查看参数梯度和更新情况
    for name, parms in model.named_parameters():
    print("更新前/后")
    print('-->name:', name)
    print('-->para:', parms)
    print('-->grad_requirs:', parms.requires_grad)
    print('-->grad_value:', parms.grad)

    # 反向传播求导侦测
    from apex import amp
    # from torch.cuda import amp
    with torch.autograd.detect_anomaly():
    if use_amp:
    with amp.scale_loss(loss, optimizer) as scaled_loss:
    scaled_loss.backward()
    else:
    loss.backward(retain_graph=True)