我已经编写了下面的预测代码,它是从经过训练的分类器模型中预测出来的。现在的预测时间大约是40,000,我想尽量减少。
我是否可以对我的推理脚本做任何优化,或者我应该寻找在训练脚本方面的发展?
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)整个项目可以在火把/上找到
发布于 2018-12-28 12:15:58
如果没有分析器的输出,很难判断其中有多少是由于代码效率低下造成的。话虽如此,PyTorch有很多启动开销--换句话说,与单个映像上的推断时间相比,初始化库、模型、加载权重并将其传输到GPU的速度较慢。对于单个图像的预测,这使得CLI实用程序非常糟糕。
如果您的用例确实需要处理单个映像而不是批处理,那么优化的潜力就不大。我看到的两个选择是
发布于 2022-05-26 16:36:02
您还可以使用例如OpenVINO来优化推理本身。OpenVINO是为英特尔的硬件优化,但它应该与任何CPU一起工作。它通过图的剪枝或合并一些操作来优化推理性能,同时又保持了准确性。
您可以找到关于如何转换PyTorch模型这里的完整教程。下面是一些片段。
安装OpenVINO
最简单的方法是使用PIP。或者,您可以使用这个工具在您的情况下找到最佳方法。
pip install openvino-dev[pytorch,onnx]将模型保存到ONNX
OpenVINO目前还不能直接转换PyTorch模型,但是它可以使用ONNX模型进行转换。此示例代码假定模型用于计算机视觉。
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 )。在命令行中运行:
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)。如果你不知道什么是你最好的选择,只需使用汽车。
# 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工作。
https://stackoverflow.com/questions/53954653
复制相似问题