验证过程中显存会不断增加
rnlee1998 opened this issue · 15 comments
您好,我在使用您的代码训练时发现,每次验证,显存都会增加,最后导致显存out of memory中断了训练,请问下这个问题怎么解决呢?
不好意思,我们没有遇到过这个问题
您好,我在使用您的代码训练时发现,每次验证,显存都会增加,最后导致显存out of memory中断了训练,请问下这个问题怎么解决呢?
@rnlee1998 您好,我也遇到一样的问题了,请问您解决了吗?
您好,我在使用您的代码训练时发现,每次验证,显存都会增加,最后导致显存out of memory中断了训练,请问下这个问题怎么解决呢?
@rnlee1998 您好,我也遇到一样的问题了,请问您解决了吗?
目前解决办法是通过断点训练,但是显存上涨并没有解决。我们分享其中一个原因可能和显卡有关,我使用的是A5000显卡出现了这个问题,当我们换成TITAN RTX时候发现没有这个问题。如果你也是用A5000显卡出现的这个问题,那确实有可能是显卡的问题。
您好,我在使用您的代码训练时发现,每次验证,显存都会增加,最后导致显存out of memory中断了训练,请问下这个问题怎么解决呢?
@rnlee1998 您好,我也遇到一样的问题了,请问您解决了吗?
目前解决办法是通过断点训练,但是显存上涨并没有解决。我们分享其中一个原因可能和显卡有关,我使用的是A5000显卡出现了这个问题,当我们换成TITAN RTX时候发现没有这个问题。如果你也是用A5000显卡出现的这个问题,那确实有可能是显卡的问题。
感谢分享。我用的是V100,也出现了这个问题。
@rnlee1998 我把online_eval里面的多线程分布式相关的代码注释掉,显存就没涨了。
不太懂分布式训练。。
# if args.multiprocessing_distributed:
# group = dist.new_group([i for i in range(ngpus)])
# dist.all_reduce(tensor=eval_measures, op=dist.ReduceOp.SUM, group=group)
@rnlee1998 我把online_eval里面的多线程分布式相关的代码注释掉,显存就没涨了。 不太懂分布式训练。。
# if args.multiprocessing_distributed: # group = dist.new_group([i for i in range(ngpus)]) # dist.all_reduce(tensor=eval_measures, op=dist.ReduceOp.SUM, group=group)
这个问题之前我考虑过,当你把这三行代码注释掉之后,计算的结果是不完全正确的,因为分布式训练在online eval时用了多张GPU进行测试,然后将测试结果汇聚到一起求和(就是dist.all_reduce这里),想要得到正确的结果需要将代码改为在一张GPU上测试654张图片,但是我尝试后发现,我的显存不够
@rnlee1998 我发现显存增加主要是由于dist.new_group
导致的,每次执行online_eval的时候都会加入新的进程,而旧的进程没有释放?(大概)如果把dist.new_group放到epoch循环的外面,online_eval每次都在相同的group里计算,这样是否正确呢?
def online_eval(model, dataloader_eval, gpu, group, post_process=False):
...
if args.multiprocessing_distributed:
dist.all_reduce(tensor=eval_measures, op=dist.ReduceOp.SUM, group=group)
group = dist.new_group([i for i in range(ngpus_per_node)])
while epoch < args.num_epochs:
...
if args.do_online_eval and global_step and global_step % args.eval_freq == 0 and not model_just_loaded:
time.sleep(0.1)
model.eval()
with torch.no_grad():
eval_measures = online_eval(model, dataloader_eval, gpu, group, post_process=True)
@rnlee1998 我发现显存增加主要是由于
dist.new_group
导致的,每次执行online_eval的时候都会加入新的进程,而旧的进程没有释放?(大概)如果把dist.new_group放到epoch循环的外面,online_eval每次都在相同的group里计算,这样是否正确呢?def online_eval(model, dataloader_eval, gpu, group, post_process=False): ... if args.multiprocessing_distributed: dist.all_reduce(tensor=eval_measures, op=dist.ReduceOp.SUM, group=group)
group = dist.new_group([i for i in range(ngpus_per_node)]) while epoch < args.num_epochs: ... if args.do_online_eval and global_step and global_step % args.eval_freq == 0 and not model_just_loaded: time.sleep(0.1) model.eval() with torch.no_grad(): eval_measures = online_eval(model, dataloader_eval, gpu, group, post_process=True)
我觉得可以试试,但我现在没有卡可以测试,如果你跑训练没有报错的话,那应该是可以这么做的,一个简单的办法,你把评估的轮次改小一些,比如100次迭代online eval一次,如果结果没有异常,应该是可以的
没有异常,计算结果看起来也是正确的。
没有异常,计算结果看起来也是正确的。
好的
想问下楼上两位老师,复现这个模型显存至少需要多大
我跑8个batch,用的4张24G的 GPU liran @.*** 北京航空航天大学
…
------------------ 原始邮件 ------------------ 发件人: "aliyun/NeWCRFs" @.>; 发送时间: 2022年8月30日(星期二) 晚上8:02 @.>; @.>;"State @.>; 主题: Re: [aliyun/NeWCRFs] 验证过程中显存会不断增加 (Issue #8) 想问下楼上两位老师,复现这个模型显存至少需要多大 — Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you modified the open/close state.Message ID: @.***>
好的,谢谢
想问下楼上两位老师,复现这个模型显存至少需要多大
11G 就够,我自己是在2080Ti上训练的
@ArcherFMY @rnlee1998 你们好,我试了你们提出来的解决方案 ,我设置的时500在线评估一次,我发现显存还是增加