5. 使用 XPU 进行预测

API定义如下:

// 启用 XPU 进行预测
// 参数:l3_size - l3 cache 分配的显存大小。注:昆仑1上最大为 16773120 Byte,昆仑2上最大为 67104768 Byte
// 参数:l3_locked - 分配的L3 cache是否可以锁定。如果为false,表示不锁定L3 cache,则分配的L3 cache可以多个模型共享,多个共享L3 cache的模型在卡上将顺序执行
// 参数:conv_autotune - 是否对模型中的conv算子进行autotune。如果为true,则在第一次执行到某个维度的conv算子时,将自动搜索更优的算法,用以提升后续相同维度的conv算子的性能
// 参数:conv_autotune_file - 指定autotune文件路径。如果指定autotune_file,则使用文件中指定的算法,不再重新进行autotune
// 参数:transformer_encoder_precision - multi_encoder的计算精度
// 参数:transformer_encoder_adaptive_seqlen - multi_encoder的输入是否可变长
// 参数:enable_multi_stream - 是否启用多流推理,如果启动,将自动创建新的流用于推理
// 返回:None
// 备注:此接口仅用于启动 xpu 推理。详细的 xpu 配置参数请使用 SetXpuConfig 接口进行设置
void EnableXpu(int l3_size = 0xfffc00,
               bool l3_locked = false,
               bool conv_autotune = true,
               const std::string& conv_autotune_file = "",
               const std::string& transformer_encoder_precision = "int16",
               bool transformer_encoder_adaptive_seqlen = false,
               bool enable_multi_stream = false);

// XPU 配置参数:XpuConfig 结构体定义
struct XpuConfig {
  // 选择几号卡进行推理
  int device_id{0};

  // 可用的 L3 大小
  // 昆仑1设备上最大的 L3 大小为 16773120 Byte
  // 昆仑2设备上最大的 L3 大小为 67104768 Byte
  size_t l3_size{0};
  // 如果 l3_ptr 不为空,则使用此地址指向的 l3 buffer
  // 如果 l3_ptr 为空,则框架会创建新的 l3 buffer
  void* l3_ptr{nullptr};
  // 用于进行 L3 aututune 的大小
  // 如果 l3_autotune_size 为 0,则不开启 l3 autotune 功能
  // 备注: 剩余的 L3 大小 (l3_size - l3_autotune_size) 将被 kernel 使用(paddle/xdnn kernel 共享剩余的 l3)
  size_t l3_autotune_size{0};

  // 执行流
  // 如果 stream 为空,推理会使用默认流
  void* stream{nullptr};

  // conv autotune 等级
  // 如果 conv_autotune_level 为 0,则不开启 conv aututune 功能
  // 备注:目前仅使用 Paddle-Lite 推理时生效
  int conv_autotune_level{0};
  // 从 conv_autotune_file 读取初始的 conv aututune 信息
  // 备注:目前仅使用 Paddle-Lite 推理时生效
  std::string conv_autotune_file;
  // 是否将新的 conv aututune 信息写会到 conv_autotune_file
  // 备注:目前仅使用 Paddle-Lite 推理时生效
  bool conv_autotune_file_writeback{false};

  // fc autotune 等级
  // 如果 fc_autotune_level 为 0,则不开启 fc aututune 功能
  // 备注:目前仅使用 Paddle-Lite 推理时生效
  int fc_autotune_level{0};
  // 从 fc_autotune_file 读取初始的 fc aututune 信息
  // 备注:目前仅使用 Paddle-Lite 推理时生效
  std::string fc_autotune_file;
  // 是否将新的 fc aututune 信息写会到 fc_autotune_file
  // 备注:目前仅使用 Paddle-Lite 推理时生效
  bool fc_autotune_file_writeback{false};

  // gemm 计算精度。可选值为:0(int8)、1(int16)、2(int31)
  // 备注:gemm_compute_precision 对量化模型中的量化算子不生效
  // 备注:目前仅使用 Paddle-Lite 推理时生效
  int gemm_compute_precision{1};
  // 对 transformer 结构中的 softmax 使用什么样的优化策略。可选择值为:0,1,2
  // 备注:目前仅使用 Paddle-Lite 推理时生效
  int transformer_softmax_optimize_level{0};
  // 是否在 transformer encoder 结构中使用可变长序列优化
  // 备注:目前仅使用 Paddle-Lite 推理时生效
  bool transformer_encoder_adaptive_seqlen{true};

  // 在静态离线量化推理中,将 gelu 输出的最大阈值限制为 quant_post_static_gelu_out_threshold
  // 备注:目前仅使用 Paddle-Lite 推理时生效
  float quant_post_static_gelu_out_threshold{10.f};
  // 在动态在线量化推理中,处理激活值的方式
  // 如果使用昆仑1推理,可选值为:0(per_tensor),1(per_batch),2(per_head)
  // 如果使用昆仑2推理,可选值为:0(per_tensor),1(every_16)
  // 备注:目前仅使用 Paddle-Lite 推理时生效
  int quant_post_dynamic_activation_method{0};
  // 在动态离线量化中,将权重数据预处理为哪种精度。可选值为:0(int8),1(int16),2(float)
  // 备注:目前仅使用 Paddle-Inference 推理时生效
  int quant_post_dynamic_weight_precision{1};
  std::vector<std::string> quant_post_dynamic_op_types;
};

// 设置 XPU 推理配置参数
// 参数:config - xpu 可用的配置参数,详见 XpuConfig 定义
// 返回:None
void SetXpuConfig(const XpuConfig& config);

代码示例:

// 创建 Config 对象
paddle_infer::Config config(FLAGS_model_dir);

// 开启 Lite 子图引擎
config.EnableLiteEngine();

// 启用 XPU
config.EnableXpu();

// 设置 xpu l3 size 为昆仑2上可以使用的最大值
paddle_infer::XpuConfig xpu_config;
xpu_config.l3_size = 67104768;
config.SetXpuConfig(xpu_config);

注意事项: Xpu 推理依赖 Lite 子图引擎,配置需开启 EnableLiteEngine,API 文档参考设置模型优化方法