网络训练加速:正常情况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变为测试模式, 理解错了, 原来是节省内存的。
网络训练若干问题小结
最新推荐文章于 2024-07-30 15:01:59 发布