跳至主要內容

DL相关

BradZhone大约 3 分钟DeepLearningDeepLearning

DL相关

0.WTN

  • [ ] Dataloader的worker对训练推理的影响 https://zhuanlan.zhihu.com/p/673642279
  • [ ] train & val & inference
  • [ ] gradient accumulation
  • [ ] mixed precision
  • [ ] datasets (type, data structure)
  • [ ] fully finetune, finetune, lora, pretrain
  • [ ] prompt, 幻读, difficulties
  • [ ] llama1,2, chatgpt
  • [ ] bert,transformers
  • [ ] deepspeed, fastchat, megatron, colossalAi ...
  • [ ] torch.run, torch.launch, mp.spawn

1.博客&总结

博客总结
如何理解深度学习分布式训练中的large batch size与learning rate的关系?open in new windowGD(Gradient Descent): 基于整个训练集计算梯度更新参数; 梯度估计准确,更新过程准确 计算耗时,容易落入局部最优
SGD(Stochastic Gradient Descent): 基于单个sample计算梯度更新参数;适合online-learning场景 单个sample梯度不够准确,需要很小的lr,难以占满CPU/GPU使用率,资源浪费
mini-batch SGD: 基于batchsize个samples计算梯度更新参数折中,引入梯度噪声,不易落入局部最优

mini-batch SGD的batchsize增大m倍,相当于将梯度的方差减少m倍,因此梯度比SGD更加准确
为了保证相同的数据量利用率, large batchsize下的学习率应当是baseline的k倍,提高收敛速度和精度
在初始训练阶段,一般不会直接将lr增大为k倍,而是从baseline的lr慢慢warmup到k倍
lr不能无限大,lr太大直接沿loss切线跑得太远,导致收敛出现问题

batchsize越大,收敛方向的confidence越大,前进方向更加坚定,因此调大学习率;小的batchsize显得杂乱无规律,需要小的学习率保证不出错。参考:https://oldpan.me/archives/how-to-use-tricks-to-train-networklearning_rate_and_batch_size参考:https://miguel-data-sc.github.io/2017-11-05-first/
Pytorch requires_grad torch.no_grad() .eval()open in new window
Pytorch:model.train()和model.eval()用法和区别,以及model.eval()和torch.no_grad()的区别open in new window
requires_grad = False: 不计算梯度,可freeze部分model训练
torch.no_grad(): 所有计算结果都带有requires_grad = False属性,从使用了with torch.no_grad():之前的网络层的反向传播都会截断
model.eval():配合torch.no_grad()将模型设为evaluation模式,将dropout关掉,利用到了所有网络连接,即不进行随机舍弃神经元,保证BN层能够用全部训练数据的均值和方差,即测试过程中要保证BN层的均值和方差不变
model.train():启用batchnorm和dropout,保证BN层能够用到每一批数据的均值和方差,dropout随机取一部分网络连接来训练更新参数
torch DDP训练-模型保存-加载问题open in new window注意不同的方式模型的权重key会不一样导致一些问题
TODO:可尝试blog中的所有方法做对比
一文说尽「大模型推理」!12家高校机构联合发布150页报告,综述750篇论文open in new window基本概念综述

2.经验总结

  1. RuntimeError: Found no NVIDIA driver on your system

    • 查看创建container的参数有没有加--gpus all
  2. Missing keys & unexpected keys in state_dict

    • 使用DDP时某张卡保存模型torch.save(model.state_dict(), 'checkpoint.pth'),之后使用单卡或在调用torch.nn.parallel.DistributedDataParallel(model, device_ids=[local_rank])封装model之前使用model.load_state_dict(torch.load('checkpoint.pth'))则会出现state_dict中的key多了一个module字段导致该问题

    • 可将load_state_dict放到DistributedDataParallel调用以后再执行(适用于多卡情况)

    • 或是直接加载stat_dict之后删除这个字段:

      stat_dict = torch.load(args.pretrained, map_location=torch.device('cpu'))
      model.load_state_dict({k.replace('module.', ''): v for k, v in stat_dict.items() })
      
    • 若是不同计算设备加载其它计算设备保存的模型,则需加上参数torch.load(args.pretrained, map_location=torch.device(device)),此处的device可以先设为cpu,之后再model.to("cuda")