aliyun/NeWCRFs

验证过程中显存会不断增加

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在线评估一次,我发现显存还是增加