一文读懂Paddle推理引擎Inference

209 阅读2分钟

背景

Paddle Python预测程序开发说明

  • 首先使用paddle.inference.Config(xx,xx)方法创建config
  • 然后根据paddle.inference.create_predictor(config)创建predictor
  • 最后根据 predictor.run()方法执行一步推理
import argparse
import numpy as np

import paddle.inference as paddle_infer

def parse_args():
    parser = argparse.ArgumentParser()
    parser.add_argument("--model_file", type=str, help="model filename")
    parser.add_argument("--params_file", type=str, help="parameter filename")
    parser.add_argument("--batch_size", type=int, default=1, help="batch size")
    # 调用parse_args()方法解析命令行参数
    return parser.parse_args()

def main():
    args = parse_args()
    # 创建 config
    config = paddle_infer.Config(args.model_file, args.params_file)

    # 根据 config 创建 predictor
    predictor = paddle_infer.create_predictor(config)

    # 获取输入的名称
    input_names = predictor.get_input_names()
    input_handle = predictor.get_input_handle(input_names[0])
    
    # 设置输入
    fake_input = np.random.randn(args.batch_size, 3, 318, 318).astype("float32")
    input_handle.reshape([args.batch_size, 3, 318, 318])
    input_handle.copy_from_cpu(fake_input)

    # 运行predictor
    predictor.run()
    
    # 获取输出 
    output_names = predictor.get_output_names()
    output_handle = predictor.get_output_handle(output_names[0])
    output_data = output_handle.copy_to_cpu() # numpy.ndarray类型
    print("Output data size is {}".format(output_data.size))
    print("Output data shape is {}".format(output_data.shape))
    
    
if __name__ == "__main__":
    main()
    



Paddle预测流程

Paddle Infernce采用Predito进行预测。Predictor是一个高性能预测引擎,该引擎通过对计算图的分析,完成对计算图的一系列优化(如OP融合、内存/显存的优化、MKLDNN、TensorRT等底层加速库的支持等),能够大大提升预测性能。

开发预测程序需要5个步骤,以C++程序为例

  • 1、配置推理选项paddle_infer::Config,包括设置模型路径、运行设备、开启或关闭计算图优化、使用MKLDNN/TensorRT进行部署的加速等。

  • 2、创建推理引擎paddl_infer::Predicor, 通过CreatePredictor(config)接口,一行代码即可完成引擎初始化,其中Config为第一步中生成的配置推理选项

  • 3、准备输入数据,需要以下几个步骤

    • 先通过auto input_names = predictor->GetInputNames()获取模型所有输入Tensor的名称
    • 再通过auto tensor = predictor->GetInputTensor(input_names[0])获取模型所有输入Tensor的名称
    • 最后通过tensor->copy_from_cpu(data),将data中的数据拷贝到tensor中
  • 4、执行预测,只需要运行predictor.run()即可完成预测

  • 5、获取预测结果

    • 先通过auto output_names = predictor->GetOutputNames()获取模型所有输出Tensor的名称
    • 再通过auto tensor = predictor->GetOutputTensor(output_names[i])获取输出Tensor的指针
    • 最后通过tensor->copy_to_cpu(data)将tensor中的数据copy到data指针上

参考

1、paddle 预测示例Python: www.paddlepaddle.org.cn/inference/v…

2、www.paddlepaddle.org.cn/inference/v…