首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何优化推理脚本,使分类器得到更快的预测?

如何优化推理脚本,使分类器得到更快的预测?
EN

Stack Overflow用户
提问于 2018-12-28 06:40:43
回答 2查看 1.4K关注 0票数 2

我已经编写了下面的预测代码,它是从经过训练的分类器模型中预测出来的。现在的预测时间大约是40,000,我想尽量减少。

我是否可以对我的推理脚本做任何优化,或者我应该寻找在训练脚本方面的发展?

代码语言:javascript
复制
import torch
import torch.nn as nn
from torchvision.models import resnet18
from torchvision.transforms import transforms
import matplotlib.pyplot as plt
import numpy as np
from torch.autograd import Variable
import torch.functional as F
from PIL import Image
import os
import sys
import argparse
import time 
import json

parser = argparse.ArgumentParser(description = 'To Predict from a trained model')

parser.add_argument('-i','--image', dest = 'image_name', required = True, help='Path to the image file')
args = parser.parse_args()

def predict_image(image_path):
    print("prediciton in progress")
    image = Image.open(image_path)

    transformation = transforms.Compose([
        transforms.RandomResizedCrop(224),
        transforms.ToTensor(),
        transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
        ])

    image_tensor = transformation(image).float()
    image_tensor = image_tensor.unsqueeze_(0)

    if cuda:
        image_tensor.cuda()

    input = Variable(image_tensor)
    output = model(input)

    index = output.data.numpy().argmax()
    return index

def parameters():
    hyp_param = open('param_predict.txt','r')
    param = {}
    for line in hyp_param:
        l = line.strip('\n').split(':')

def class_mapping(index):
    with open("class_mapping.json") as cm:
        data = json.load(cm)
    if index == -1:
        return len(data)
    else:
        return data[str(index)]

def segregate():
    with open("class_mapping.json") as cm:
        data = json.load(cm)
    try:
        os.mkdir(seg_dir)
        print("Directory " , seg_dir ,  " Created ") 
    except OSError:
        print("Directory " , seg_dir ,  " already created")
    for x in range (0,len(data)):
        dir_path="./"+seg_dir+"/"+data[str(x)]
        try:
            os.mkdir(dir_path)
            print("Directory " , dir_path ,  " Created ") 
        except OSError:
            print("Directory " , dir_path ,  " already created")


path_to_model = "./models/"+'trained.model'
checkpoint = torch.load(path_to_model)
seg_dir="segregation_folder"

cuda = torch.cuda.is_available()

num_class = class_mapping(index=-1)
print num_class
model = resnet18(num_classes = num_class)

if cuda:
    model.load_state_dict(checkpoint)
else:
    model.load_state_dict(checkpoint, map_location = 'cpu')

model.eval()

if __name__ == "__main__":

    imagepath = "./Predict_Image/"+args.image_name
    since = time.time()
    img = Image.open(imagepath)
    prediction = predict_image(imagepath)
    name = class_mapping(prediction)
    print("Time taken = ",time.time()-since)

    print("Predicted Class: ",name)

整个项目可以在火把/上找到

EN

回答 2

Stack Overflow用户

发布于 2018-12-28 12:15:58

如果没有分析器的输出,很难判断其中有多少是由于代码效率低下造成的。话虽如此,PyTorch有很多启动开销--换句话说,与单个映像上的推断时间相比,初始化库、模型、加载权重并将其传输到GPU的速度较慢。对于单个图像的预测,这使得CLI实用程序非常糟糕。

如果您的用例确实需要处理单个映像而不是批处理,那么优化的潜力就不大。我看到的两个选择是

  1. 跳过GPU执行并保存GPU分配和传输可能是值得的。
  2. 在C++中使用LibTorch编写此代码将获得更好的性能。不过,这是一项大量的开发工作。
票数 4
EN

Stack Overflow用户

发布于 2022-05-26 16:36:02

您还可以使用例如OpenVINO来优化推理本身。OpenVINO是为英特尔的硬件优化,但它应该与任何CPU一起工作。它通过图的剪枝或合并一些操作来优化推理性能,同时又保持了准确性。

您可以找到关于如何转换PyTorch模型这里的完整教程。下面是一些片段。

安装OpenVINO

最简单的方法是使用PIP。或者,您可以使用这个工具在您的情况下找到最佳方法。

代码语言:javascript
复制
pip install openvino-dev[pytorch,onnx]

将模型保存到ONNX

OpenVINO目前还不能直接转换PyTorch模型,但是它可以使用ONNX模型进行转换。此示例代码假定模型用于计算机视觉。

代码语言:javascript
复制
dummy_input = torch.randn(1, 3, IMAGE_HEIGHT, IMAGE_WIDTH)
torch.onnx.export(model, dummy_input, "model.onnx", opset_version=11)

使用模型优化器转换ONNX模型

模型优化器是一个来自OpenVINO开发包的命令行工具,所以请确保您已经安装了它。它将ONNX模型转换为IR,这是OpenVINO的默认格式。它还将精度更改为FP16,以获得更好的性能(您也可以使用FP32 )。在命令行中运行:

代码语言:javascript
复制
mo --input_model "model.onnx" --input_shape "[1,3, 224, 224]" --mean_values="[123.675, 116.28 , 103.53]" --scale_values="[58.395, 57.12 , 57.375]" --data_type FP16 --output_dir "model_ir"

在CPU上运行推理。

转换后的模型可以由运行时加载,并为特定的设备进行编译,例如CPU或GPU (集成到CPU中,比如Intel HD Graphics)。如果你不知道什么是你最好的选择,只需使用汽车。

代码语言:javascript
复制
# Load the network
ie = Core()
model_ir = ie.read_model(model="model_ir/model.xml")
compiled_model_ir = ie.compile_model(model=model_ir, device_name="CPU")

# Get output layer
output_layer_ir = compiled_model_ir.output(0)

# Run inference on the input image
result = compiled_model_ir([input_image])[output_layer_ir]

免责声明:我在OpenVINO工作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53954653

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档