Files
FastDeploy/docs/tech/runtime.md
jiangjiajun 9d87046d78 first commit
2022-07-05 09:30:15 +00:00

3.6 KiB
Raw Blame History

fastdeploy::Runtime

FDTensor Runtime的输入输出数据结构

struct FDTensor {
  std::vector<int64_t> shape; // 形状
  std::string name; // 命名
  FDDataType dtype; // 数据类型
  Device device = Device::CPU; // 数据存放设备

  void* MutableData(); // 获取tensor内存buffer指针

  // 获取tensor数据如若tensor数据在其它设备
  // 此函数会先将数据拷贝至CPU再返回指向
  // CPU内存buffer的指针
  void* Data();

  // 初始化Tensor并复用外部数据指针
  // Tensor的内存buffer将由外部的调用者来创建或释放
  void SetExternalData(const std::vector<int>& new_shape,
                       const FDDataType& data_type,
                       void* data_buffer
                       const Device& dev);

  int Nbytes() const; // 返回tensor数据字节大小

  int Numel() const; // 返回tensor元素个数

  // Debug函数打印tensor的信息包含mean、max、min等
  void PrintInfo(const std::string& prefix = "TensorInfo");
};

FDTensor是前后处理与Runtime进行对接的数据结构,大多情况下建议通过SetExternalData来共享用户传入的数据,减小内存拷贝带来的开销。

Runtime 多后端推理引擎

RuntimeOption 引擎配置

struct RuntimeOption {
  // 模型文件和权重文件
  std::string model_file;
  std::string params_file;
  // 模型格式当前可支持Frontend::PADDLE / Frontend::ONNX
  Frontend model_format = Frontend::PADDLE;
  Backend backend = Backend::ORT:

  // CPU上运行时的线程数
  int cpu_thread_num = 8;

  // 推理硬件当前支持Device::CPU / Device::GPU
  // 在CPU/GPU上需与backend进行搭配选择
  Device device;

  // Backend::ORT的参数
  int ort_graph_opt_level;
  int ort_inter_op_num_threads;
  int ort_execution_mode;

  // Backend::TRT的参数
  std::map<std::string, std::vector<int32_t>> trt_fixed_shape;
  std::map<std::string, std::vector<int32_t>> trt_max_shape;
  std::map<std::string, std::vector<int32_t>> trt_min_shape;
  std::map<std::string, std::vector<int32_t>> trt_opt_shape;
  std::string trt_serialize_file = "";
  bool trt_enable_fp16 = false;
  bool trt_enable_int8 = false;
  size_t trt_max_batch_size = 32;
};

Runtime 引擎

struct Runtime {
  // 加载模型,引擎初始化
  bool Init(const RuntimeOption& _option);

  // 进行推理
  // 其中输入须正确配置tensor中的name
  bool Infer(std::vector<FDTensor>& inputs, std::vector<FDTensor>* outputs);

  int NumInputs(); // 输入个数
  int NumOutputs(); // 输出个数

  TensorInfo GetInputInfo(int index) // 获取输入信息包括shape, dtype, name
  TensorInfo GetOutputInfo(int index) // 获取输出信息包括shape, dtype, name

  RuntimeOption option; // 引擎的配置信息
};

Runtime使用示例

C++

#include "fastdeploy/fastdeploy_runtime.h"

int main() {
  auto option = fastdeploy::RuntimeOption();
  option.model_file = "resnet50/inference.pdmodel";
  option.params_file = "resnet50/inference.pdiparams";

  auto runtime = fastdeploy::Runtime();
  assert(runtime.Init(option));

  // 需准备好输入tensor
  std::vector<FDTensor> inputs;

  std::vector<FDTensor> outputs;
  assert(runtime.Infer(tensors, &outputs));

  // 输出tensor的debug信息查看
  outputs[0].PrintInfo();
}

Python

import fastdeploy as fd
import numpy as np

option = fd.RuntimeOption();
option.model_file = "resnet50/inference.pdmodel"
option.params_file = "resnet50/inference.pdiparams";

runtime = fd.Runtime(option)

result = runtime.infer({"image": np.random.rand(1, 3, 224, 224)});