- Python 预测 API介绍
- PaddleTensor
- PaddleBuf
- PaddleDType
- AnalysisConfig
- PaddlePredictor
- 完整使用示例
Python 预测 API介绍
Fluid提供了高度优化的C++预测库,为了方便使用,我们也提供了C++预测库对应的Python接口,两者含义完全相同,下面是详细的使用说明
PaddleTensor
PaddleTensor
是预测库输入和输出的数据结构,包括以下字段
name
(str): 指定输入的名称shape
(tuple|list): Tensor的shapedata
(PaddleBuf): Tensor的数据,存储在PaddleBuf
中,dtype
(PaddleDType): Tensor的类型
PaddleBuf
PaddleBuf
定义了PaddleTensor
的存储结构,创建PaddleBuf
:
- int64_buf = PaddleBuf([1, 2, 3, 4])
- float_buf = PaddleBuf([1., 2., 3., 4.])
PadleBuf
包括以下方法
resize
: 重新分配内存,单位为bytereset
: 重新设置数据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)和IDdisable_gpu
: 禁用GPUgpu_device_id
: 返回使用的GPU IDswitch_ir_optim
: IR优化(默认开启)enable_tensorrt_engine
: 启用TensorRTenable_mkldnn
: 启用MKLDNN
PaddlePredictor
PaddlePredictor
是运行预测的引擎,下面是创建和使用的说明
- # 创建预测引擎
- config = AnalysisConfig(model_dir)
- config.enable_use_gpu(200, 0) # 200M显存, 设备id为0
- config.enable_tensorrt_engine() # 打开TensorRT
- predictor = create_paddle_predictor(config)
- # 设置输入
- x = fluid.core.PaddleTensor()
- # x.name = ...
- # x.shape = ...
- # x.data = ...
- # x.dtype = ...
- y = fluid.core.PaddleTensor()
- # y.name = ...
- # y.shape = ...
- # y.data = ...
- # y.dtype = ...
- # 运行预测引擎得到结果,返回值是一个PaddleTensor的list
- results = predictor.run([x, y])
- # 获得 results,并应用到自己的应用中
Python API 相关接口与 C++ API 完全对应,可以对照查阅
完整使用示例
下面是一个完整的resnet50预测示例
下载resnet50模型并解压,运行如下命令将会调用预测引擎
- python resnet50_infer.py --model_dir model --prog_file model --params_file params --batch_size 2
resnet50_infer.py
的内容是
- import argparse
- import numpy as np
- from paddle.fluid.core import PaddleBuf
- from paddle.fluid.core import PaddleDType
- from paddle.fluid.core import PaddleTensor
- from paddle.fluid.core import AnalysisConfig
- from paddle.fluid.core import create_paddle_predictor
- def main():
- args = parse_args()
- # Set config
- config = AnalysisConfig(args.model_dir)
- config.disable_gpu()
- # Create PaddlePredictor
- predictor = create_paddle_predictor(config)
- # Set inputs
- inputs = fake_input(args.batch_size)
- # Infer
- outputs = predictor.run(inputs)
- # parse outputs
- output = outputs[0]
- print(output.name)
- output_data = output.data.float_data()
- assert len(output_data) == 512 * args.batch_size
- for i in range(args.batch_size):
- print(np.argmax(output_data[i * 512:(i + 1) * 512]))
- def fake_input(batch_size):
- image = PaddleTensor()
- image.name = "data"
- image.shape = [batch_size, 3, 318, 318]
- image.dtype = PaddleDType.FLOAT32
- image.data = PaddleBuf(
- np.random.randn(*image.shape).flatten().astype("float32").tolist())
- return [image]
- def parse_args():
- parser = argparse.ArgumentParser()
- parser.add_argument("--model_dir", type=str, help="model dir")
- parser.add_argument("--prog_file", type=str, help="program filename")
- parser.add_argument("--params_file", type=str, help="parameter filename")
- parser.add_argument("--batch_size", type=int, default=1, help="batch size")
- return parser.parse_args()
- if __name__ == "__main__":
- main()