Paddle 预测 API =============== 为了更简单方便的预测部署,Fluid 提供了一套高层 API 用来隐藏底层不同的优化实现。 `预测库相关代码 `__ 包括 - 头文件 ``paddle_inference_api.h`` 定义了所有的接口 - 库文件\ ``libpaddle_fluid.so`` 或 ``libpaddle_fluid.a`` 编译和依赖可以参考 :ref:`install_or_build_cpp_inference_lib` 。 下面是一些 API 概念的介绍 PaddleTensor ------------ PaddleTensor 定义了预测最基本的输入输出的数据格式,其定义是 .. code:: cpp struct PaddleTensor { std::string name; // variable name. std::vector shape; PaddleBuf data; // blob of data. PaddleDType dtype; }; - ``name`` 用于指定输入数据对应的 模型中variable 的名字 (暂时没有用,但会在后续支持任意 target 时启用) - ``shape`` 表示一个 Tensor 的 shape - ``data`` 数据以连续内存的方式存储在\ ``PaddleBuf`` 中,\ ``PaddleBuf`` 可以接收外面的数据或者独立\ ``malloc``\ 内存,详细可以参考头文件中相关定义。 - ``dtype`` 表示 Tensor 的数据类型 engine ------ 高层 API 底层有多种优化实现,我们称之为 engine,目前有三种 engine - 原生 engine,由 paddle 原生的 forward operator 组成,可以天然支持所有paddle 训练出的模型, - Anakin engine,封装了 `Anakin `__ ,在某些模型上性能不错,但只能接受自带模型格式,无法支持所有 paddle 模型, - TensorRT mixed engine,用子图的方式支持了 `TensorRT `__ ,支持所有paddle 模型,并自动切割部分计算子图到 TensorRT 上加速(WIP) 其实现为 .. code:: cpp enum class PaddleEngineKind { kNative = 0, // Use the native Fluid facility. kAnakin, // Use Anakin for inference. kAutoMixedTensorRT // Automatically mixing TensorRT with the Fluid ops. }; 预测部署过程 ------------ 总体上分为以下步骤 1. 用合适的配置创建 ``PaddlePredictor`` 2. 创建输入用的 ``PaddleTensor``\ ,传入到 ``PaddlePredictor`` 中 3. 获取输出的 ``PaddleTensor`` ,将结果取出 下面完整演示一个简单的模型,部分细节代码隐去 .. code:: cpp #include "paddle_inference_api.h" // 创建一个 config,并修改相关设置 paddle::NativeConfig config; config.model_dir = "xxx"; config.use_gpu = false; // 创建一个原生的 PaddlePredictor auto predictor = paddle::CreatePaddlePredictor(config); // 创建输入 tensor int64_t data[4] = {1, 2, 3, 4}; paddle::PaddleTensor tensor{.name = "", .shape = std::vector({4, 1}), .data = PaddleBuf(data, sizeof(data)), .dtype = PaddleDType::INT64}; // 创建输出 tensor,输出 tensor 的内存可以复用 std::vector outputs; // 执行预测 CHECK(predictor->Run(slots, &outputs)); // 获取 outputs ... 编译时,联编 ``libpaddle_fluid.a/.so`` 即可。 详细代码参考 ------------ - `inference demos `__ - `复杂单线程/多线程例子 `__