Python 预测 API介绍

Fluid提供了高度优化的C++预测库,为了方便使用,我们也提供了C++预测库对应的Python接口,两者含义完全相同,下面是详细的使用说明

PaddleTensor

PaddleTensor是预测库输入和输出的数据结构,包括以下字段

  • name(str): 指定输入的名称
  • shape(tuple|list): Tensor的shape
  • data(PaddleBuf): Tensor的数据,存储在PaddleBuf中,
  • dtype(PaddleDType): Tensor的类型

PaddleBuf

PaddleBuf定义了PaddleTensor的存储结构,创建PaddleBuf:

  1. int64_buf = PaddleBuf([1, 2, 3, 4])
  2. float_buf = PaddleBuf([1., 2., 3., 4.])

PadleBuf包括以下方法

  • resize: 重新分配内存,单位为byte
  • reset: 重新设置数据
  • empty: buffer是否为空
  • float_data: 将数据转为float型的list返回
  • int64_data: 将数据转为int64型的list返回
  • length: 内存大小,单位为byte

PaddleDType

PaddleDType定义了PaddleTensor的类型,包括

  • PaddleDType.INT64: 64位整型
  • PaddleDType.FLOAT32: 32位浮点型

AnalysisConfig

AnalysisConfig是创建预测引擎的配置,主要包括以下方法

  • set_model: 设置模型的路径
  • model_dir: 返回模型路径
  • enable_use_gpu: 设置GPU显存(单位M)和ID
  • disable_gpu: 禁用GPU
  • gpu_device_id: 返回使用的GPU ID
  • switch_ir_optim: IR优化(默认开启)
  • enable_tensorrt_engine: 启用TensorRT
  • enable_mkldnn: 启用MKLDNN

PaddlePredictor

PaddlePredictor是运行预测的引擎,下面是创建和使用的说明

  1. # 创建预测引擎
  2. config = AnalysisConfig(model_dir)
  3. config.enable_use_gpu(200, 0) # 200M显存, 设备id为0
  4. config.enable_tensorrt_engine() # 打开TensorRT
  5.  
  6. predictor = create_paddle_predictor(config)
  7.  
  8. # 设置输入
  9. x = fluid.core.PaddleTensor()
  10. # x.name = ...
  11. # x.shape = ...
  12. # x.data = ...
  13. # x.dtype = ...
  14.  
  15. y = fluid.core.PaddleTensor()
  16. # y.name = ...
  17. # y.shape = ...
  18. # y.data = ...
  19. # y.dtype = ...
  20.  
  21.  
  22. # 运行预测引擎得到结果,返回值是一个PaddleTensor的list
  23. results = predictor.run([x, y])
  24.  
  25. # 获得 results,并应用到自己的应用中

Python API 相关接口与 C++ API 完全对应,可以对照查阅

完整使用示例

下面是一个完整的resnet50预测示例

下载resnet50模型并解压,运行如下命令将会调用预测引擎

  1. python resnet50_infer.py --model_dir model --prog_file model --params_file params --batch_size 2

resnet50_infer.py 的内容是

  1. import argparse
  2. import numpy as np
  3.  
  4. from paddle.fluid.core import PaddleBuf
  5. from paddle.fluid.core import PaddleDType
  6. from paddle.fluid.core import PaddleTensor
  7. from paddle.fluid.core import AnalysisConfig
  8. from paddle.fluid.core import create_paddle_predictor
  9.  
  10.  
  11. def main():
  12. args = parse_args()
  13.  
  14. # Set config
  15. config = AnalysisConfig(args.model_dir)
  16. config.disable_gpu()
  17.  
  18. # Create PaddlePredictor
  19. predictor = create_paddle_predictor(config)
  20.  
  21. # Set inputs
  22. inputs = fake_input(args.batch_size)
  23.  
  24. # Infer
  25. outputs = predictor.run(inputs)
  26.  
  27. # parse outputs
  28. output = outputs[0]
  29. print(output.name)
  30. output_data = output.data.float_data()
  31. assert len(output_data) == 512 * args.batch_size
  32. for i in range(args.batch_size):
  33. print(np.argmax(output_data[i * 512:(i + 1) * 512]))
  34.  
  35.  
  36. def fake_input(batch_size):
  37. image = PaddleTensor()
  38. image.name = "data"
  39. image.shape = [batch_size, 3, 318, 318]
  40. image.dtype = PaddleDType.FLOAT32
  41. image.data = PaddleBuf(
  42. np.random.randn(*image.shape).flatten().astype("float32").tolist())
  43. return [image]
  44.  
  45.  
  46. def parse_args():
  47. parser = argparse.ArgumentParser()
  48. parser.add_argument("--model_dir", type=str, help="model dir")
  49. parser.add_argument("--prog_file", type=str, help="program filename")
  50. parser.add_argument("--params_file", type=str, help="parameter filename")
  51. parser.add_argument("--batch_size", type=int, default=1, help="batch size")
  52.  
  53. return parser.parse_args()
  54.  
  55.  
  56. if __name__ == "__main__":
  57. main()