tensorflow 仅加载一次已部署的ONNX模型

bfnvny8b  于 2022-11-25  发布在  其他
关注(0)|答案(1)|浏览(253)

我有一个大型的机器学习/计算机视觉项目,使用ONNX模型,使用python。该项目需要大约3秒(本地)只是加载模型+推理。
加载onnx模型所用的时间:0.2702977657318115 onnx推断所花费的时间1.673530101776123 onnx推断所花费的时间0.7677013874053955
在部署项目之后,这个加载时间总是随着服务器上的每个单独命中而启动。
例如,如果4个用户同时请求,所有结果将花费大约30秒。当只有1个请求时,仅花费大约10秒。

问题是否有任何方法可以在初始化服务器时只加载onnx模型一次,而不是在每个post请求时加载?

我试过async.io
它帮助对请求进行排队,但是最后一个请求仍然需要等待30秒才能得到结果,即使CPU使用率不是100%。我不确定解决我的问题的方法是只加载onnx模型一次,还是多线程,或者我是否通过将www.example.com应用到我的项目中来做最好的事情async.io。

3b6akqbq

3b6akqbq1#

您是否尝试加载模型,然后在每次有请求时进行推断?
您应该只加载一次,并在推理进程的整个生命周期中保留会话。您还可以查看ONNXruntime附带的执行提供程序,以尝试加快推理时间,如CUDA, tensorRT ...

import onnxruntime as ort

def load_model(onnx_model_path):
    inference_session = ort.InferenceSession(
            onnx_model_path,
        )
    
     # get input and output names of model layers for inference placeholder
     inputs = inference_session.get_inputs()[0].name
     outputs = [
            output.name for output in inference_session.get_outputs()
        ]

     return inference_session, {"inputs": inputs, "outputs": outputs}

def main():
    inf_session, input_output_dict = load_model("your/model.onnx")

    while True:
        inf_session.run(input_output_dict["outputs"], {
                str(input_output_dict[inputs]): your_array_input})

相关问题