如何在python中持久化进程

如何在python中持久化进程,python,pytorch,Python,Pytorch,我有以下Pytorch代码,该代码的作用是: 使用net=CRAFT() 使用net.eval()它运行推断 使用for循环,我提供了一个接一个地运行推断的图像 代码: 这段代码中有一个警告,特别是它每次执行步骤1和2时都占用1.8GB的RAM。对图像的实际推断占用更少的RAM(每个图像40mb),但我的大部分内存消耗来自将ML模型加载到RAM中。有没有一种方法可以让我将这个模型一直加载到服务器上的RAM中,然后对图像进行推断?您几乎描述了一个web服务器。您可以围绕这一点创建一个简单的API,

我有以下Pytorch代码,该代码的作用是:

  • 使用
    net=CRAFT()
  • 使用
    net.eval()
    它运行推断
  • 使用for循环,我提供了一个接一个地运行推断的图像
  • 代码:


    这段代码中有一个警告,特别是它每次执行步骤12时都占用
    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))