【Pytorch踩坑记录】深度学习程序在训练第x个Epoch的过程中直接被退出终端

【问题描述】:我在一个大的数据集上训练模型时,终端或vscode界面老是在程序在跑第3个epoch的过程中自动被卡退,注意不是程序报错,而是直接将vscode退出,连错误都不报这就是头疼之处,并不知道问题出现在哪里。

【原因分析】先说答案: 由于程序占用内存越来越大,在占满之后(第3个epoch过程中)使得linux系统直接kill任务,退出vscode界面。分析: 我在训练时使用的数据集比较大(约6万个样本),Batchsize设置为4,也就是在每个epoch中需执行15000次循环,因此我需要在每次循环中记录一些值,所以就用的是以下代码(简要描述代码)来实现。但是由于写的不规范,导致程序在执行循环的过程中没有及时释放内存,所以随着epoch的增加,模型占用的内存是越来越大的,最后导致沾满linux内存,导致系统杀死进程。

total_pose = torch.tensor([])
for i (input, gt) in enumerate(tqdm(train_loader)):
	optimizer.zero.grad()
	output = model(input)
	loss = cr(output, gt)
	loss.backward()
	optimizer.step()
	
	# 我想记录下每个批次产生的pose,get_pose()这个函数里会产生一些中间变量
	pose = get_pose(output)
	# 问题就出在下面这个代码中,使用torch.cat和直接保存张量会使得内存越来越大,不能及时释放
	total_pose = torch.cat((total_pose, pose), dim=0)	
	

【解决方案】:在最开始我怀疑是某些代码写错了,所以导致报错,但是这样也只是会让程序报错,并不会直接退出界面,在花了大量时间之后,终于在一篇博客中找到灵感,问题就在于(其他类似问题出现时可能也因为如此):Linux程序进程被杀,日志突然中止,可以考虑是否因为程序占用内存过高,导致系统内存不足,为避免系统崩溃,系统寻找内存占用最大的进程kill掉。 检查代码后,修改如下。

# 原代码
# total_pose = torch.tensor([])
# 修改如下
total_pose = []
for i (input, gt) in enumerate(tqdm(train_loader)):
	optimizer.zero.grad()
	output = model(input)
	loss = cr(output, gt)
	loss.backward()
	optimizer.step()
	

	# 原代码
	# pose = get_pose(output)	
	# total_pose = torch.cat((total_pose, pose), dim=0)	
	# 修改如下
	pose = get_pose(output.data.cpu().numpy())	
	total_pose.appen(pose)
	

【总结】:在每个epoch的每个循环中,如果想记录一些值,需要将这个张量x变为x.data.cpu().numpy(),并且最好使用list的方式来记录(这一点不确定是不是问题的原因,但建议使用list)。

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值