解决torch.save(outputs, "xxx.pth")时报运行内存不足的错误:kill - 9

一、 问题描述

在利用Faster_RCNN批量提取proposal特征时,报运行内存不足。

二、原因分析

一般该问题在批量提取数据集特征时特别容易出现,原因例如采用了下列这种结构:

results_dict = {}
results_dict.update({img_id: result for img_id, result in zip(image_ids, output)})
return results_dict

这种Python语句将所有的prediction都存入一个列表里面,如果不能及时释放掉,会导致运行内存撑爆。举一反三,如果在其他程序中报运行内存不足的错误,可查看下有没有大数据数据存在,如果有则想办法提前释放掉。

三、解决办法

For example:换成下面这种语句,进行批量保存predictions:

# pip install fvcore
from fvcore.common.file_io import PathManager
#遍历每次batch内产生的output
for idx,image_id in enumerate(image_ids):
	file_name = '%d.pth' % image_id
    with PathManager.open(os.path.join(output_folder, file_name), "wb") as f:
    	# save as CPU tensors
    	torch.save(output[idx], f, _use_new_zipfile_serialization = False)

四、结论

一般内存爆了的话,大概率是某个变量值一直在堆积,提前释放掉即可(保存至硬盘或清空)。

附注:读取 XX.pth、.th、npy、npz等文件的方式

import torch
import os
from fvcore.common.file_io import PathManager
import numpy
import numpy as np
with PathManager.open("1.pth", "rb") as f:
    a = torch.load(f)
    # print(a.extra_fields)
b = a.bbox.numpy()
c = a.extra_fields["box_features"]
np.save("1.jpg",b)  # 默认自动添加后缀 .npy
d = np.load("1.jpg.npy")
print(d)
np.savez("arry.npz", bbox=b,features = c)
e = np.load("arry.npz")
print(e["features"])
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐