pytorch内存泄漏

问题描述:

内存泄漏积累过多最终会导致内存溢出,当内存占用过大,进程会被killed掉。

解决过程:

在代码的运行阶段输出内存占用量,观察在哪一块存在内存剧烈增加或者显存异常变化的情况。但是在这个过程中要分级确认问题点,也即如果存在三个文件main.pytrain.pymodel.py

在此种思路下,应该先在main.py中确定问题点,然后,从main.py中进入到train.py中,再次输出显存占用量,确定问题点在哪。随后,再从train.py中的问题点,进入到model.py中,再次确认。如果还有更深层次的调用,可以继续追溯下去。

python 复制代码
import psutil
process = psutil.Process()
current_memory = process.memory_info().rss
print(f"0--------------Current memory usage: {current_memory / (1024 ** 3):.4f} GB")

具体使用的代码

python 复制代码
for epoch in range(start_epoch+1, args.epochs+1):
        process = psutil.Process()
        current_memory = process.memory_info().rss
        print(f"0--------------Current memory usage: {current_memory / (1024 ** 3):.4f} GB")
        count_step = (epoch-1)*len(train_loader)  
        print(f"1--------------Current memory usage: {current_memory / (1024 ** 3):.4f} GB")
        mean_loss, lr = train_one_epoch(model, optimizer, train_loader, device, epoch, count_step,writer,lr_scheduler,
                                         print_freq=args.print_freq)
        print(f"2--------------Current memory usage: {current_memory / (1024 ** 3):.4f} GB")
        val_info = evaluate_vgg(model, epoch, val_loader, device, writer, num_classes=num_classes)
        print(f"3--------------Current memory usage: {current_memory / (1024 ** 3):.4f} GB")
        with open(results_file, "a") as f:
            # 记录每个epoch对应的train_loss、lr以及验证集各指标       
            train_info = f"[epoch: {epoch}]\n" \
                         f"train_loss: {mean_loss:.4f}\n" \
                         f"lr: {lr:.6f}\n"
            f.write(train_info + val_info + "\n\n")

        save_vgg_file = {"model": model.state_dict(),
                     "optimizer": optimizer.state_dict(),
                    #  "lr_scheduler": lr_scheduler.state_dict(),
                     "epoch": epoch,
                     "args": args}
        
        torch.save(save_vgg_file, 'checkpoints/fcn_model_Adam-StepLR_1e-2.pth')
        print(f"update checkpoints/fcn_model_Adam-StepLR_1e-2.pth")
        print(f"4--------------Current memory usage: {current_memory / (1024 ** 3):.4f} GB")

每个epoch训练完之后所占内存会不断增加,也就是说,每轮跑完之后会有冗余的数据一直在消耗内存。于是criterion、train_one_epoch、evaluate三个部分

criterion部分

Mem usage:5310 MiBtrain_one_epoch部分

Mem usage:4439 MiB

evaluate部分

Mem usage:10644

evaluate部分可以看到,所占用内存突然增大,并且之后的代码也占用了大量内存,继续监控得知在下一个epoch中criterion部分占用内存也是16064MiB,由此推测出内存消耗在evaluate部分

解决办法:

删除变量数据在for循环外,把暂时不用的可视化代码注释掉,发现占用内存变化很小

解决pytorch训练时的显存占用递增的问题
Pytorch训练过程中,显存(内存)爆炸解决方法
Python代码优化工具------memory_profiler

相关推荐
NAGNIP2 小时前
一文搞懂深度学习中的通用逼近定理!
人工智能·算法·面试
冬奇Lab3 小时前
一天一个开源项目(第36篇):EverMemOS - 跨 LLM 与平台的长时记忆 OS,让 Agent 会记忆更会推理
人工智能·开源·资讯
冬奇Lab3 小时前
OpenClaw 源码深度解析(一):Gateway——为什么需要一个"中枢"
人工智能·开源·源码阅读
AngelPP7 小时前
OpenClaw 架构深度解析:如何把 AI 助手搬到你的个人设备上
人工智能
宅小年7 小时前
Claude Code 换成了Kimi K2.5后,我再也回不去了
人工智能·ai编程·claude
九狼7 小时前
Flutter URL Scheme 跨平台跳转
人工智能·flutter·github
ZFSS8 小时前
Kimi Chat Completion API 申请及使用
前端·人工智能
天翼云开发者社区9 小时前
春节复工福利就位!天翼云息壤2500万Tokens免费送,全品类大模型一键畅玩!
人工智能·算力服务·息壤
知识浅谈9 小时前
教你如何用 Gemini 将课本图片一键转为精美 PPT
人工智能
Ray Liang9 小时前
被低估的量化版模型,小身材也能干大事
人工智能·ai·ai助手·mindx