Python 3.8 RAM流量增加和加载问题

问题描述

首先,我想说的是,这是我们的第一个更大规模的项目,因此我们并不了解所有内容,但我们学得很快。

我们开发了用于图像识别的代码。我们用树莓派4b进行了尝试,但很快就发现这是整体速度降低的方法。目前,我们正在使用NVIDIA Jetson Nano。第一次识别是可以的(大约30秒),第二次尝试甚至更好(大约6到7秒)。第一次花费了很长时间,因为将首次加载模型。通过API,可以触发图像识别,并且来自AI模型的元数据将作为响应。我们为此使用快速API。

但是现在有一个问题,如果我在分类文件的开头(导入时加载)将CNN作为全局变量加载并在线程中使用它,则需要使用mp.set_start_method('spawn' ),否则会出现以下错误:

“ RuntimeError:无法在派生子进程中重新初始化CUDA。 要将CUDA与多处理一起使用,必须使用“ spawn”启动方法”

现在,这当然是一个简单的解决方法。在启动我的线程之前,只需添加上述方法即可。确实,这是可行的,但同时又出现了另一个挑战。将start方法设置为“ spawn”后,错误消失,但Jetson开始为更多内存分配方式。

由于开销和预加载的CNN模型,在线程启动之前,RAM约为2.5Gig。启动后,它不会停止分配RAM,它会消耗掉RAM的所有4Gig以及整个6Gig交换。在此之后,整个API进程都会因以下错误而终止:“无法分配内存”,这很明显。

我也设法通过在分类函数中加载CNN模型来解决此问题。 (不像之前的两种情况那样将其预加载到GPU上)。但是,这里也有问题。将模型加载到GPU的过程大约需要15s-20s,并且每次识别开始。这不适合我们,我们想知道为什么我们不能在两次图像识别后不杀死整个对象的情况下预加载模型。我们的目标是在5秒以内。

#clasify
import torchvision.transforms as transforms
from skimage import io
import time
from torch.utils.data import Dataset
from .loader import *
from .ResNet import *

#if this part is in the classify() function than no allocation problem occurs
net = ResNet152(num_classes=25)
net = net.to('cuda')
save_file = torch.load("./model.pt",map_location=torch.device('cuda'))
net.load_state_dict(save_file)

def classify(imgp=""):
    #do some classification with the net
    pass

if __name__ == '__main__':
    mp.set_start_method('spawn') #if commented out the first error ocours
    manager = mp.Manager()
    return_dict = manager.dict()
    p = mp.Process(target=classify,args=('./bild.jpg',return_dict))
    p.start()
    p.join()
    print(return_dict.values())

这里的任何帮助将不胜感激。谢谢。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...