网络训练若干问题小结

网络训练加速:正常情况GPU利用率极低,说明大部分卡在IO上
1、完全使用cache提速明显,GPU利用率~98%
2、cache更新概率设置在20%,耗时一样
3、cache每个样本保存5个副本,每次从副本中随机选一个,保持多样性
4、多卡训练同步BN用Apex

Connection refused
原因:num_workers > 0时在dataset里加断点报错,num_workers=0时即可


指定源安装python包
pip install * -i http://pypi.douban.com/simple --trusted-host pypi.douban.com

yuv转RGB转不过来,原因是要先转成float32的,在进行浮点运算转成RGB
plt,scipy等都是存成RGB,cv2是bgr存成RGB,读取之后会反转成BGR

为什么总是出现那么多的僵尸程序?

优化方式很重要,对于数据分布非常脏的数据,单纯的sgd很难下降(原因可能是由于momentum太大了,导致震荡),RMS也只是能收敛到极优,而adam和RMS差不多,都没有收敛性保证,只有SGD+nesterov才是被证明收敛的。因此以后都用这个,只是需要调好学习率即可,一般设置1e-5。
使用cache时出错
RuntimeError: value cannot be converted to type float without overflow: 1106498119229061081197051705707146942467671994925354769623645106340485922816.000000
因为cache读取不到,每次ctrl+c杀掉之后,好多文件没写完,所以读取不出来,或者取出来错误。所以每次重启程序要杀掉
ps x | grep 'device 7' | awk '{print $1}' | xargs kill -9
对于深度估计SUNCG数据集来说,优化器选用RMS,学习率0.0002,用MultiStepLR,gamma=0.2,MILESTONE=[10, 15, 20]
模型训练过程中用sgd非常差,新训练的模型都用RMSPro,这样就可以很快的下降到比较好的结果,然后最最最后上线前才用SGDfinetune一下下。

sudo fuser -v /dev/nvidia* 查找占用GPU资源
ps -elf | grep python 找到python程序杀掉

深度估计数据增强:1)Resize,Rotate,Flip,ColorJitter;2)颜色变换一定要慎重

* torch.backends.cudnn.benchmark = True 在程序刚开始加这条语句可以提升一点训练速度,没什么额外开销。我一般都会加
* 有时候可能是因为每次迭代都会引入点临时变量,会导致训练速度越来越慢,基本呈线性增长。开发人员还不清楚原因,但如果周期性的使用torch.cuda.empty_cache()的话就可以解决这个问题。这个命令是清除没用的临时变量的。
* torchvision.transforms里的各种坑,等有空再说。

为什么每个batch算完loss以后要手动清一下缓存。。不然一会儿就OOM了。。我观察过cache memory,确实逐渐增大。
代码里有个loss.item() / norm,需要把norm也取个item,变成loss.item() / norm.item()

一个网络复制另一个的结构,参数,对于一个输入给出了不同的输出
最后发现是 BN 层有 register_buffer,复制含 BN 的网络不止要复制参数


pytorch 的dataloader 进程经常杀不干净,导致GPU内存没有释放。
ps aux|grep lk|grep python|awk '{print $2}'|xargs kill 彻底杀死进程

深度图显示问题:
全部归一化到0-6或者0-8,这样以保证每张图的分布区间都一样,不在自己随意变化最大最小值(即上下界)

Train.py:
    1)验证数据不加shuffle,不加sampler,不加collate_fn
    2)验证时,要加net.eval(),要加速和节省内存时加torch.set_grad_enabled(False)
    
    3)暂无
new_module:
    1)conv_layer增加选项cut和weight_quant
    2)ConvQuant中量化
    

1、训练速度慢:
    batch size太大,或太小
    num_worker太少,8~24
    没用CUDA
    多GPU训练,还有问题
2、训练收敛慢:
    没有用BN层,学习率要调小,那么训练也会变慢
    

3、显存out of memory
    for data, label in trainloader: 
        …… 
        out = model(data) 
        loss = criterion(out, label) 
        loss_sum += loss # <— 这里
    每次随着batch增大显存消耗变大,应改为loss_sum += loss.data[0]

4、net.eval()与torch.no_grad(),torch.set_grad_required()
    前者是eval模式,不会训练BN和Drop out层,后者是停止自动计算梯度引擎,可以减少内存并加速,但是无法反向传播。
    model.eval()和with torch.no_grad()
    定义一个dropout层。 这两行语句输出不一样。 后来查了一下, eval是测试语句。 我一直以为0.4之后with
    torch.no_grad()会让model变为测试模式, 理解错了, 原来是节省内存的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ReLuJie

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值