科学炼丹方法-pytorch篇
2022-10-22
| 2025-1-21
字数 1449阅读时长 4 分钟
type
status
date
slug
summary
tags
category
icon
password

大部分情况适用的加速方法

针对显存调优的经验

常用命令:
  • 使用inplace操作,常用在relu这种地方,设置inplace=True
  • 使用del 删除不用的变量(可显著释放内存,暂未测试是否可显著释放显存)
  • 无需求导的变量建议require_grad设置为False。或者detach_()
    • 还有一种无grad的变量,可以使用tensor.data获取,类似.detach(),但.data后修改数据不会报错
 

针对CPU占用较高的调优

使用H5,LMDB这种数据集,避免CPU频繁加密解密图片
读图片效率对比:
  • PIL最慢,但兼容性较好,可以使用。resize使用PIL自带方法会比转numpy快。
  • MXNet(MX.image库)据说是将图片读成numpy格式效率最高的,略高于CV2
  • CV2快,有坑。读出来颜色默认为BGR, 通道默认为HWC。(Torch和PIL默认都是RGB,CHW)

针对数据加载缓慢的调优

适用于IO瓶颈(dataloader卡比较长的时间)
以上内容来自APEX(NVIDIA-Advanced Extension for Pytorch)
也可以使用APEX进行混合精度训练进一步提升速度,可参考APEX文档
notion image

colab篇

避免colab休眠:
使用ssh连接colab
Colab常用小命令,魔法函数
Colab 代码段中使用markdown语法可避免显示长串代码
使用Ngrok开启tensorboard(这个还未实验)

在colab中使用tensorboard

其它

深度学习的调参技巧-from 知乎
 
预处理:只需要做-mean/std的零中心化就够了,PCA和白化都用不上。我个人观点,既然CNN能学习encoder,PCA用不用其实关系不大,大不了让网络自己学习出来一个。
数据一定要做shuffle。理解网络原理最重要,尤其是CNN的卷积部分,你需要理解sobel算子的边界检测原理。要多用Dropout(不仅能防止过拟合,还相当于低成本的Ensemble,虽然会让训练变慢一些,同时建议适当增加网络参数,这也会让训练更慢一点)。CNN更适合是/否类的问题,如果任务复杂,建议先用分类任务训练模型再做finetune。CV领域就用ReLU,用3x3卷积核,用xavier初始化。LRN其实可以不用,不行再尝试。filter数量用2^n。多尺度的图片输入(或网络内部使用多尺度结果)效果很好。第一层filter数量不要太少,否则学不出底层特征。优化器选择sgd还是adam看个人,一般对网络影响不大,我习惯用sgd+momentum。batch normalization很好用,建议使用。不要盲信论文,觉得某些结构可能有效就去试试。95%的情况下你用不到40层以上的模型。shortcut连接是有效的。暴力调参最实用,毕竟时间宝贵,况且你调好的模型可能很快就要换掉了。
  • 思考
  • 推荐
  • Opencore黑苹果折腾Tmux安装及配置
    Loading...