DL相关
大约 3 分钟
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的关系? | GD(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-network ![]() |
Pytorch requires_grad torch.no_grad() .eval() Pytorch:model.train()和model.eval()用法和区别,以及model.eval()和torch.no_grad()的区别 | 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训练-模型保存-加载问题 | 注意不同的方式模型的权重key会不一样导致一些问题 TODO:可尝试blog中的所有方法做对比 |
一文说尽「大模型推理」!12家高校机构联合发布150页报告,综述750篇论文 | 基本概念综述 |
2.经验总结
RuntimeError: Found no NVIDIA driver on your system
- 查看创建container的参数有没有加
--gpus all
- 查看创建container的参数有没有加
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")