五:Paddle Inference推理 (python)API详解
1.Config类定义
Config
类为用于配置构建 Predictor
对象的配置信息,如模型路径、是否开启 gpu 等等。
构造函数定义如下:
# Config 类定义,输入为 None
class paddle.inference.Config()
# Config 类定义,输入为其他 Config 对象
class paddle.inference.Config(config: Config)
# Config 类定义,输入分别为模型文件路径和参数文件路径
class paddle.inference.Config(prog_file: str, params_file: str)
示例:
# 引用 paddle inference 预测库
import paddle.inference as paddle_infer
# 创建 config
config = paddle_infer.Config("./mobilenet.pdmodel", "./mobilenet.pdiparams")
# 根据 config 创建 predictor
predictor = paddle_infer.create_predictor(config)
2.设置预测模型
2.1.从文件中加载预测模型
API定义如下:
# 设置模型文件路径,当需要从磁盘加载模型时使用
# 参数:prog_file_path - 模型文件路径
# params_file_path - 参数文件路径
# 返回:None
paddle.inference.Config.set_model(prog_file_path: str, params_file_path: str)
# 设置模型文件路径
# 参数:x - 模型文件路径
# 返回:None
paddle.inference.Config.set_prog_file(x: str)
# 设置参数文件路径
# 参数:x - 参数文件路径
# 返回:None
paddle.inference.Config.set_params_file(x: str)
# 获取模型文件路径
# 参数:None
# 返回:str - 模型文件路径
paddle.inference.Config.prog_file()
# 获取参数文件路径
# 参数:None
# 返回:str - 参数文件路径
paddle.inference.Config.params_file()
示例:
# 引用 paddle inference 预测库
import paddle.inference as paddle_infer
# 创建 config
config = paddle_infer.Config()
# 通过 API 设置模型文件夹路径
config.set_prog_file("./mobilenet_v2.pdmodel")
config.set_params_file("./mobilenet_v2.pdiparams")
# 通过 API 获取 config 中的模型文件和参数文件路径
print(config.prog_file())
print(config.params_file())
# 根据 config 创建 predictor
predictor = paddle_infer.create_predictor(config)
2.2. 从内存中加载预测模型
API定义如下:
# 从内存加载模型
# 参数:prog_buffer - 内存中模型结构数据
# prog_buffer_size - 内存中模型结构数据的大小
# params_buffer - 内存中模型参数数据
# params_buffer_size - 内存中模型参数数据的大小
# 返回:None
paddle.inference.Config.set_model_buffer(prog_buffer: str, prog_buffer_size: int,
params_buffer: str, params_buffer_size: int)
# 判断是否从内存中加载模型
# 参数:None
# 返回:bool - 是否从内存中加载模型
paddle.inference.Config.model_from_memory()
示例:
# 引用 paddle inference 预测库
import paddle.inference as paddle_infer
# 创建 config
config = paddle_infer.Config()
# 加载模型文件到内存
with open('./mobilenet_v2.pdmodel', 'rb') as prog_file:
prog_data=prog_file.read()
with open('./mobilenet_v2.pdiparams', 'rb') as params_file:
params_data=params_file.read()
# 从内存中加载模型
config.set_model_buffer(prog_data, len(prog_data), params_data, len(params_data))
# 通过 API 获取 config 中 model_from_memory 的值 - True
print(config.model_from_memory())
# 根据 config 创建 predictor
predictor = paddle_infer.create_predictor(config)
3. 使用 CPU 进行预测
注意:
1.在 CPU 型号允许的情况下,进行预测库下载或编译试尽量使用带 AVX 和 MKL 的版本。
2.可以尝试使用 Intel 的 MKLDNN 进行 CPU 预测加速,默认 CPU 不启用 MKLDNN。
3.在 CPU 可用核心数足够时,可以通过设置 set_cpu_math_library_num_threads 将线程数调高一些,默认线程数为 1。
3.1. CPU 设置
API定义如下:
# 设置 CPU 加速库计算线程数
# 参数:cpu_math_library_num_threads - CPU 加速库计算线程数
# 返回:None
paddle.inference.Config.set_cpu_math_library_num_threads(cpu_math_library_num_threads: int)
# 获取 CPU 加速库计算线程数
# 参数:None
# 返回:int - CPU 加速库计算线程数
paddle.inference.Config.cpu_math_library_num_threads()
示例:
# 引用 paddle inference 预测库
import paddle.inference as paddle_infer
# 创建 config
config = paddle_infer.Config()
# 设置 CPU 加速库线程数为 10
config.set_cpu_math_library_num_threads(10)
# 通过 API 获取 CPU 加速库线程数 - 10
print(config.cpu_math_library_num_threads())
3.2. MKLDNN 设置
注意:
1.启用 MKLDNN
的前提为已经使用 CPU
进行预测,否则启用 MKLDNN
无法生效
2.启用 MKLDNN BF16
要求 CPU
型号可以支持 AVX512
,否则无法启用 MKLDNN BF16
3.set_mkldnn_cache_capacity
请参考 MKLDNN cache设计文档
API定义如下:
# 启用 MKLDNN 进行预测加速
# 参数:None
# 返回:None
paddle.inference.Config.enable_mkldnn()
# 判断是否启用 MKLDNN
# 参数:None
# 返回:bool - 是否启用 MKLDNN
paddle.inference.Config.mkldnn_enabled()
# 设置 MKLDNN 针对不同输入 shape 的 cache 容量大小
# 参数:int - cache 容量大小
# 返回:None
paddle.inference.Config.set_mkldnn_cache_capacity(capacity: int=0)
# 指定使用 MKLDNN 加速的 OP 集合
# 参数:使用 MKLDNN 加速的 OP 集合
# 返回:None
paddle.inference.Config.set_mkldnn_op(op_list: Set[str])
# 启用 MKLDNN BFLOAT16
# 参数:None
# 返回:None
paddle.inference.Config.enable_mkldnn_bfloat16()
# 指定使用 MKLDNN BFLOAT16 加速的 OP 集合
# 参数:使用 MKLDNN BFLOAT16 加速的 OP 集合
# 返回:None
paddle.inference.Config.set_bfloat16_op(op_list: Set[str])
# 启用 MKLDNN INT8
# 参数:使用 MKLDNN INT8 加速的 OP 集合
# 返回:None
paddle.inference.Config.enable_mkldnn_int8(op_list: Set[str])
代码示例 (1):使用 MKLDNN 进行预测
# 引用 paddle inference 预测库
import paddle.inference as paddle_infer
# 创建 config
config = paddle_infer.Config("./mobilenet.pdmodel", "./mobilenet.pdiparams")
# 启用 MKLDNN 进行预测
config.enable_mkldnn()
# 通过 API 获取 MKLDNN 启用结果 - true
print(config.mkldnn_enabled())
# 设置 MKLDNN 的 cache 容量大小
config.set_mkldnn_cache_capacity(1)
# 设置启用 MKLDNN 进行加速的 OP 列表
config.set_mkldnn_op({"softmax", "elementwise_add", "relu"})
代码示例 (2):使用 MKLDNN BFLOAT16 进行预测
# 引用 paddle inference 预测库
import paddle.inference as paddle_infer
# 创建 config
config = paddle_infer.Config("./mobilenet.pdmodel", "./mobilenet.pdiparams")
# 启用 MKLDNN 进行预测
config.enable_mkldnn()
# 启用 MKLDNN BFLOAT16 进行预测
config.enable_mkldnn_bfloat16()
# 设置启用 MKLDNN BFLOAT16 的 OP 列表
config.set_bfloat16_op({"conv2d"})
代码示例 (3):使用 MKLDNN INT8 进行预测
# 引用 paddle inference 预测库
import paddle.inference as paddle_infer
# 创建 config
config = paddle_infer.Config("./mobilenet.pdmodel", "./mobilenet.pdiparams")
# 启用 MKLDNN 进行预测
config.enable_mkldnn()
# 启用 MKLDNN INT8 进行预测
config.enable_mkldnn_int8()
4. 使用 GPU 进行预测
注意:
1.Config
默认使用 CPU
进行预测,需要通过 EnableUseGpu
来启用 GPU
预测。
2.可以尝试启用 CUDNN
和 TensorRT
进行 GPU
预测加速。
4.1. GPU 设置
API定义如下:
# 启用 GPU 进行预测
# 参数:memory_pool_init_size_mb - 初始化分配的gpu显存,以MB为单位
# device_id - 设备id
# precision_mode - 指定推理精度,默认是PrecisionType.Float32
# 返回:None
paddle.inference.Config.enable_use_gpu(memory_pool_init_size_mb: int, device_id: int, precision_mode: PrecisionType)
# 禁用 GPU 进行预测
# 参数:None
# 返回:None
paddle.inference.Config.disable_gpu()
# 判断是否启用 GPU
# 参数:None
# 返回:bool - 是否启用 GPU
paddle.inference.Config.use_gpu()
# 获取 GPU 的device id
# 参数:None
# 返回:int - GPU 的device id
paddle.inference.Config.gpu_device_id()
# 获取 GPU 的初始显存大小
# 参数:None
# 返回:int - GPU 的初始的显存大小
paddle.inference.Config.memory_pool_init_size_mb()
# 初始化显存占总显存的百分比
# 参数:None
# 返回:float - 初始的显存占总显存的百分比
paddle.inference.Config.fraction_of_gpu_memory_for_pool()
# 低精度模式(float16)下,推理时期望直接 feed/fetch 低精度数据
# 参数:bool - 是否 feed/fetch 低精度数据
# 返回:None
paddle.inference.Config.enable_low_precision_io(x : bool)
GPU设置代码示例:
# 引用 paddle inference 预测库
import paddle.inference as paddle_infer
# 创建 config
config = paddle_infer.Config("./mobilenet.pdmodel", "./mobilenet.pdiparams")
# 启用 GPU 进行预测 - 初始化 GPU 显存 100M, Deivce_ID 为 0
config.enable_use_gpu(100, 0)
# 通过 API 获取 GPU 信息
print("Use GPU is: {}".format(config.use_gpu())) # True
print("Init mem size is: {}".format(config.memory_pool_init_size_mb())) # 100
print("Init mem frac is: {}".format(config.fraction_of_gpu_memory_for_pool())) # 0.003
print("GPU device id is: {}".format(config.gpu_device_id())) # 0
# 禁用 GPU 进行预测
config.disable_gpu()
# 通过 API 获取 GPU 信息
print("Use GPU is: {}".format(config.use_gpu())) # False