如何在python中持久化进程
我有以下Pytorch代码,该代码的作用是:如何在python中持久化进程,python,pytorch,Python,Pytorch,我有以下Pytorch代码,该代码的作用是: 使用net=CRAFT() 使用net.eval()它运行推断 使用for循环,我提供了一个接一个地运行推断的图像 代码: 这段代码中有一个警告,特别是它每次执行步骤1和2时都占用1.8GB的RAM。对图像的实际推断占用更少的RAM(每个图像40mb),但我的大部分内存消耗来自将ML模型加载到RAM中。有没有一种方法可以让我将这个模型一直加载到服务器上的RAM中,然后对图像进行推断?您几乎描述了一个web服务器。您可以围绕这一点创建一个简单的API,
net=CRAFT()
net.eval()
它运行推断这段代码中有一个警告,特别是它每次执行步骤1和2时都占用
1.8GB
的RAM。对图像的实际推断占用更少的RAM(每个图像40mb),但我的大部分内存消耗来自将ML
模型加载到RAM中。有没有一种方法可以让我将这个模型一直加载到服务器上的RAM中,然后对图像进行推断?您几乎描述了一个web服务器。您可以围绕这一点创建一个简单的API,类似这样的API将在启动时加载模型,并在web请求中接收图像或路径,然后返回响应。使用uwsgi
或类似的工具运行它,以便一次有多个工人可用(只需确保模型初始化一次,而不是每个工人)
或者你可以更喜欢使用许多RPC库中的一个来创建类似的本地服务器。Hi@viraptor请解释为什么模型应该初始化一次,而不是每个工作者-这可能与我遇到的问题有关。@Luther,因为如果你是每个工作者初始化的,您将使用N*1.8GB内存,其中N是您的工作人员数。如果模型在推断过程中没有改变,那么您可以(可能)使用gc.freeze,并且您将只有一个副本。
def copyStateDict(state_dict):
if list(state_dict.keys())[0].startswith("module"):
start_idx = 1
else:
start_idx = 0
new_state_dict = OrderedDict()
for k, v in state_dict.items():
name = ".".join(k.split(".")[start_idx:])
new_state_dict[name] = v
return new_state_dict
if __name__ == '__main__':
# load net
net = CRAFT() # initialize
print('Loading weights from checkpoint (' + args.trained_model + ')')
if args.cuda:
net.load_state_dict(copyStateDict(torch.load(args.trained_model)))
else:
net.load_state_dict(copyStateDict(torch.load(args.trained_model, map_location='cpu')))
if args.cuda:
net = net.cuda()
net = torch.nn.DataParallel(net)
cudnn.benchmark = False
net.eval()
t = time.time()
# load data
for k, image_path in enumerate(image_list):
print("Test image {:d}/{:d}: {:s}".format(k+1, len(image_list), image_path), end='\r')
image = imgproc.loadImage(image_path)
bboxes, polys, score_text = test_net(net, image, args.text_threshold, args.link_threshold, args.low_text, args.cuda, args.poly)
# save score text
#filename, file_ext = os.path.splitext(os.path.basename(image_path))
#mask_file = result_folder + "/res_" + filename + '_mask.jpg'
#cv2.imwrite(mask_file, score_text)
file_utils.saveResult(image_path, image[:,:,::-1], polys, dirname=result_folder)
print("elapsed time : {}s".format(time.time() - t))