---
comments: true
---
# PaddleX 高性能推理指南
在实际生产环境中,许多应用对部署策略的性能指标(尤其是响应速度)有着较严苛的标准,以确保系统的高效运行与用户体验的流畅性。为此,PaddleX 提供高性能推理插件,通过自动配置和多后端推理功能,让用户无需关注复杂的配置和底层细节,即可显著提升模型的推理速度。
## 目录
- [1. 基础使用方法](#1.-基础使用方法)
- [1.1 安装高性能推理插件](#1.1-安装高性能推理插件)
- [1.2 启用高性能推理插件](#1.2-启用高性能推理插件)
- [2. 进阶使用方法](#2-进阶使用方法)
- [2.1 高性能推理工作模式](#21-高性能推理工作模式)
- [2.2 高性能推理配置](#22-高性能推理配置)
- [2.3 如何修改高性能推理配置](#23-如何修改高性能推理配置)
- [2.4 修改高性能推理配置示例](#24-修改高性能推理配置示例)
- [2.5 高性能推理在子产线/子模块中的启用/禁用](#25-高性能推理在子产线子模块中的启用禁用)
- [2.6 模型缓存说明](#26-模型缓存说明)
- [2.7 定制模型推理库](#27-定制模型推理库)
- [3. 常见问题](#3.-常见问题)
## 1. 基础使用方法
使用高性能推理插件前,请确保您已经按照[PaddleX本地安装教程](../installation/installation.md) 完成了PaddleX的安装,且按照PaddleX产线命令行使用说明或PaddleX产线Python脚本使用说明跑通了产线的快速推理。
高性能推理支持处理 PaddlePaddle 格式模型和 ONNX 格式模型,对于 ONNX 格式模型建议使用[Paddle2ONNX 插件](./paddle2onnx.md)转换得到。如果模型目录中存在多种格式的模型,会根据需要自动选择。
### 1.1 安装高性能推理插件
目前高性能推理支持的处理器架构、操作系统、设备类型和 Python 版本如下表所示:
| 操作系统 |
处理器架构 |
设备类型 |
Python 版本 |
| Linux |
x86-64 |
| CPU |
3.8–3.12 |
| GPU (CUDA 11.8 + cuDNN 8.6) |
3.8–3.12 |
| NPU |
3.10 |
| aarch64 |
NPU |
3.10 |
#### (1) 基于 Docker 安装高性能推理插件(强烈推荐):
参考 [基于Docker获取PaddleX](../installation/installation.md#21-基于docker获取paddlex) 使用 Docker 启动 PaddleX 容器。启动容器后,根据设备类型,执行如下指令,安装高性能推理插件:
| 设备类型 |
安装指令 |
说明 |
| CPU |
paddlex --install hpi-cpu |
安装 CPU 版本的高性能推理功能。 |
| GPU |
paddlex --install hpi-gpu |
安装 GPU 版本的高性能推理功能。 包含了 CPU 版本的所有功能,无需再单独安装 CPU 版本。 |
| NPU |
paddlex --install hpi-npu |
安装 NPU 版本的高性能推理功能。 使用说明请参考昇腾 NPU 高性能推理教程。 |
#### (2) 本地安装高性能推理插件:
需要本地 [安装CUDA 11.8](https://developer.nvidia.com/cuda-11-8-0-download-archive) 和 [安装cuDNN 8.6](https://docs.nvidia.com/deeplearning/cudnn/archives/cudnn-860/install-guide/index.html) 后执行上面的安装指令。
**注意:**
1. **GPU 只支持 CUDA 11.8 + cuDNN8.6**,CUDA 12.6 已经在支持中。
2. 同一环境下只能存在一个高性能推理插件版本。
3. NPU 设备的使用说明参考 [昇腾 NPU 高性能推理教程](../practical_tutorials/high_performance_npu_tutorial.md)。
3. Windows 只支持基于 Docker 安装和使用高性能推理插件。
### 1.2 启用高性能推理插件
以下是使用 PaddleX CLI 和 Python API 在通用图像分类产线和图像分类模块中启用高性能推理功能的示例。
对于 PaddleX CLI,指定 `--use_hpip`,即可启用高性能推理。
通用图像分类产线:
```bash
paddlex \
--pipeline image_classification \
--input https://paddle-model-ecology.bj.bcebos.com/paddlex/imgs/demo_image/general_image_classification_001.jpg \
--device gpu:0 \
--use_hpip
```
图像分类模块:
```bash
python main.py \
-c paddlex/configs/modules/image_classification/ResNet18.yaml \
-o Global.mode=predict \
-o Predict.model_dir=None \
-o Predict.input=https://paddle-model-ecology.bj.bcebos.com/paddlex/imgs/demo_image/general_image_classification_001.jpg \
-o Global.device=gpu:0 \
-o Predict.use_hpip=True
```
对于 PaddleX Python API,启用高性能推理的方法类似。以通用图像分类产线和图像分类模块为例:
通用图像分类产线:
```python
from paddlex import create_pipeline
pipeline = create_pipeline(
pipeline="image_classification",
device="gpu",
use_hpip=True
)
output = pipeline.predict("https://paddle-model-ecology.bj.bcebos.com/paddlex/imgs/demo_image/general_image_classification_001.jpg")
```
图像分类模块:
```python
from paddlex import create_model
model = create_model(
model_name="ResNet18",
device="gpu",
use_hpip=True
)
output = model.predict("https://paddle-model-ecology.bj.bcebos.com/paddlex/imgs/demo_image/general_image_classification_001.jpg")
```
启用高性能推理插件得到的推理结果与未启用插件时一致。对于部分模型,**在首次启用高性能推理插件时,可能需要花费较长时间完成推理引擎的构建**。PaddleX 将在推理引擎的第一次构建完成后将相关信息缓存在模型目录,并在后续复用缓存中的内容以提升初始化速度。
**启用高性能推理默认作用于整条产线/整个模块**,若想细粒度控制作用范围,如只对产线中某条子产线或某个子模块启用高性能推理插件,可以在产线配置文件中不同层级的配置里设置`use_hpip`,请参考 [2.5 高性能推理在子产线/子模块中的启用/禁用](#25-高性能推理在子产线子模块中的启用禁用)。
## 2. 进阶使用方法
本节介绍高性能推理的进阶使用方法,适合对模型部署有一定了解或希望进行手动配置调优的用户。用户可以参照配置说明和示例,根据自身需求自定义使用高性能推理。接下来将对进阶使用方法进行详细介绍。
### 2.1 高性能推理工作模式
高性能推理分为两种工作模式:
#### (1) 安全自动配置模式
安全自动配置模式,具有保护机制,默认**自动选用当前环境性能较优的配置**。在这种模式下,用户可以覆盖默认配置,但用户提供的配置将受到检查,PaddleX将根据先验知识拒绝不可用的配置。这是默认的工作模式。
#### (2) 无限制手动配置模式
无限制手动配置模式,提供完全的配置自由,可以**自由选择推理后端、修改后端配置等**,但无法保证推理一定成功。此模式适合有经验和对推理后端及其配置有明确需求的用户,建议在熟悉高性能推理的情况下使用。
### 2.2 高性能推理配置
常用高性能推理配置包含以下字段:
| 参数 |
参数说明 |
参数类型 |
默认值 |
auto_config |
是否启用安全自动配置模式。
True为启用安全自动配置模式,False为启用无限制手动配置模式。 |
bool |
True |
backend |
用于指定要使用的推理后端。在无限制手动配置模式下不能为None。 |
str | None |
None |
backend_config |
推理后端的配置,若不为None则可以覆盖推理后端的默认配置项。 |
dict | None |
None |
auto_paddle2onnx |
是否启用Paddle2ONNX插件将Paddle模型自动转换为ONNX模型。 |
bool |
True |
`backend` 可选值如下表所示:
| 选项 |
描述 |
支持设备 |
paddle |
Paddle Inference 推理引擎,支持 Paddle Inference TensorRT 子图引擎的方式提升模型的 GPU 推理性能。 |
CPU, GPU |
openvino |
OpenVINO,Intel 提供的深度学习推理工具,优化了多种 Intel 硬件上的模型推理性能。 |
CPU |
onnxruntime |
ONNX Runtime,跨平台、高性能的推理引擎。 |
CPU, GPU |
tensorrt |
TensorRT,NVIDIA 提供的高性能深度学习推理库,针对 NVIDIA GPU 进行优化以提升速度。 |
GPU |
om |
OM,华为昇腾NPU定制的离线模型格式对应的推理引擎,针对硬件进行了深度优化,减少算子计算时间和调度时间,能够有效提升推理性能。 |
NPU |
`backend_config` 根据不同后端有不同的可选值,如下表所示:
| 后端 |
可选值 |
paddle |
参考PaddleX单模型Python脚本使用说明: 4. 推理后端设置。 |
openvino |
cpu_num_threads:CPU推理使用的逻辑处理器数量。默认为8。 |
onnxruntime |
cpu_num_threads:CPU推理时算子内部的并行计算线程数。默认为8。 |
tensorrt |
precision:使用的精度,fp16或fp32。默认为fp32。
dynamic_shapes:动态形状。动态形状包含最小形状、最优形状以及最大形状,是 TensorRT 延迟指定部分或全部张量维度直到运行时的能力。格式为:{输入张量名称}: [{最小形状}, [{最优形状}], [{最大形状}]]。更多介绍请参考 TensorRT 官方文档。
|
om |
暂无 |
### 2.3 如何修改高性能推理配置
由于实际部署环境和需求的多样性,默认配置可能无法满足所有要求。这时,可能需要手动调整高性能推理配置。以下是两种常见的情况:
- 需要更换推理后端。
- 例如在OCR产线中,指定`text_detection`模块使用`onnxruntime`后端,`text_recognition`模块使用`tensorrt`后端。
- 需要修改 TensorRT 的动态形状配置:
- 当默认的动态形状配置无法满足需求(例如,模型可能需要范围外的输入形状),就需要为每一个输入张量指定动态形状。修改完成后,需要清理模型的`.cache`缓存目录。
在这些情况下,用户可以通过修改**产线/模块配置文件**、**CLI**或**Python API**所传递参数中的 `hpi_config` 字段内容来修改配置。**通过 CLI 或 Python API 传递的参数将覆盖产线/模块配置文件的设置**。
### 2.4 修改高性能推理配置示例
#### (1) 更换推理后端。
##### 通用OCR产线的所有模型使用`onnxruntime`后端:
👉 1. 修改产线配置文件方式(点击展开)
```yaml
pipeline_name: OCR
use_hpip: True
hpi_config:
backend: onnxruntime
...
```
👉 2. CLI传参方式(点击展开)
```bash
paddlex \
--pipeline image_classification \
--input https://paddle-model-ecology.bj.bcebos.com/paddlex/imgs/demo_image/general_image_classification_001.jpg \
--device gpu:0 \
--use_hpip \
--hpi_config '{"backend": "onnxruntime"}'
```
👉 3. Python API传参方式(点击展开)
```python
from paddlex import create_pipeline
pipeline = create_pipeline(
pipeline="OCR",
device="gpu",
use_hpip=True,
hpi_config={"backend": "onnxruntime"}
)
```
##### 图像分类模块的模型使用`onnxruntime`后端:
👉 1. 修改产线配置文件方式(点击展开)
```yaml
# paddlex/configs/modules/image_classification/ResNet18.yaml
...
Predict:
...
use_hpip: True
hpi_config:
backend: onnxruntime
...
...
```
👉 2. CLI传参方式(点击展开)
```bash
python main.py \
-c paddlex/configs/modules/image_classification/ResNet18.yaml \
-o Global.mode=predict \
-o Predict.model_dir=None \
-o Predict.input=https://paddle-model-ecology.bj.bcebos.com/paddlex/imgs/demo_image/general_image_classification_001.jpg \
-o Global.device=gpu:0 \
-o Predict.use_hpip=True \
-o Predict.hpi_config='{"backend": "onnxruntime"}'
```
👉 3. Python API传参方式(点击展开)
```python
from paddlex import create_model
model = create_model(
model_name="ResNet18",
device="gpu",
use_hpip=True,
hpi_config={"backend": "onnxruntime"}
)
```
##### 通用OCR产线的`text_detection`模块使用`onnxruntime`后端,`text_recognition`模块使用`tensorrt`后端:
👉 1. 修改产线配置文件方式(点击展开)
```yaml
pipeline_name: OCR
...
SubModules:
TextDetection:
module_name: text_detection
model_name: PP-OCRv4_mobile_det
model_dir: null
limit_side_len: 960
limit_type: max
thresh: 0.3
box_thresh: 0.6
unclip_ratio: 2.0
# 当前子模块启用高性能推理
use_hpip: True
# 当前子模块使用如下高性能推理配置
hpi_config:
backend: onnxruntime
TextLineOrientation:
module_name: textline_orientation
model_name: PP-LCNet_x0_25_textline_ori
model_dir: null
batch_size: 6
TextRecognition:
module_name: text_recognition
model_name: PP-OCRv4_mobile_rec
model_dir: null
batch_size: 6
score_thresh: 0.0
# 当前子模块启用高性能推理
use_hpip: True
# 当前子模块使用如下高性能推理配置
hpi_config:
backend: tensorrt
```
#### (2) 修改 TensorRT 的动态形状配置
##### 通用图像分类产线修改动态形状配置:
👉 点击展开
```yaml
...
SubModules:
ImageClassification:
...
hpi_config:
backend: tensorrt
backend_config:
precision: fp32
dynamic_shapes:
x:
- [1, 3, 300, 300]
- [4, 3, 300, 300]
- [32, 3, 1200, 1200]
...
...
```
##### 图像分类模块修改动态形状配置:
👉 点击展开
```yaml
...
Predict:
...
use_hpip: True
hpi_config:
backend: tensorrt
backend_config:
precision: fp32
dynamic_shapes:
x:
- [1, 3, 300, 300]
- [4, 3, 300, 300]
- [32, 3, 1200, 1200]
...
...
```
### 2.5 高性能推理在子产线/子模块中的启用/禁用
高性能推理支持通过在子产线/子模块级别使用 `use_hpip`,实现**仅产线中的某个子产线/子模块使用高性能推理**。示例如下:
##### 通用OCR产线的`text_detection`模块使用高性能推理,`text_recognition`模块不使用高性能推理:
👉 点击展开
```yaml
pipeline_name: OCR
...
SubModules:
TextDetection:
module_name: text_detection
model_name: PP-OCRv4_mobile_det
model_dir: null
limit_side_len: 960
limit_type: max
thresh: 0.3
box_thresh: 0.6
unclip_ratio: 2.0
use_hpip: True # 当前子模块启用高性能推理
TextLineOrientation:
module_name: textline_orientation
model_name: PP-LCNet_x0_25_textline_ori
model_dir: null
batch_size: 6
TextRecognition:
module_name: text_recognition
model_name: PP-OCRv4_mobile_rec
model_dir: null
batch_size: 6
score_thresh: 0.0
use_hpip: False # 当前子模块不启用高性能推理
```
**注意:**
1. 在子产线或子模块中设置 `use_hpip` 时,将以最深层的配置为准。
2. **强烈建议通过修改产线配置文件的方式开启高性能推理**,不建议使用CLI或Python API的方式进行设置。如果通过CLI或Python API启用 `use_hpip`,等同于在配置文件的最上层设置 `use_hpip`。
### 2.6 模型缓存说明
模型缓存会存放在模型目录下的 `.cache` 目录下,包括使用 `tensorrt` 或 `paddle` 后端时产生的 `shape_range_info.pbtxt`与`trt_serialized`开头的文件。
当启用`auto_paddle2onnx`选项时,可能会在模型目录下自动生成`inference.onnx`文件。
### 2.7 定制模型推理库
`ultra-infer`是高性能推理底层依赖的模型推理库,位于 `PaddleX/libs/ultra-infer` 目录。编译脚本位于 `PaddleX/libs/ultra-infer/scripts/linux/set_up_docker_and_build_py.sh` ,编译默认编译GPU版本和包含 OpenVINO、TensorRT、ONNX Runtime 三种推理后端的 `ultra-infer`。
自定义编译时可根据需求修改如下选项:
| 选项 |
说明 |
| http_proxy |
在下载三方库时使用具体的http代理,默认空 |
| PYTHON_VERSION |
Python版本,默认 3.10.0 |
| WITH_GPU |
是否编译支持Nvidia-GPU,默认 ON |
| ENABLE_ORT_BACKEND |
是否编译集成ONNX Runtime后端,默认 ON |
| ENABLE_TRT_BACKEND |
是否编译集成TensorRT后端(仅支持GPU),默认 ON |
| ENABLE_OPENVINO_BACKEND |
是否编译集成OpenVINO后端(仅支持CPU),默认 ON |
编译示例:
```shell
# 编译
# export PYTHON_VERSION=...
# export WITH_GPU=...
# export ENABLE_ORT_BACKEND=...
# export ...
cd PaddleX/libs/ultra-infer/scripts/linux
bash set_up_docker_and_build_py.sh
# 安装
python -m pip install ../../python/dist/ultra_infer*.whl
```
## 3. 常见问题
**1. 为什么开启高性能推理插件前后,感觉推理速度没有明显提升?**
高性能推理插件通过智能选择后端来加速推理。
对于单功能模块,由于模型复杂性或不支持算子等情况,部分模型可能无法使用加速后端(如OpenVINO、TensorRT等)。此时日志中会提示相关内容,并选择已知**最快的可用后端**,因此可能退回到普通推理。
对于模型产线,性能瓶颈可能不在模型推理阶段。
可以使用 [PaddleX benchmark](../module_usage/instructions/benchmark.md) 工具进行实际速度测试,以便更准确地评估性能。
**2: 高性能推理功能是否支持所有模型产线与单功能模块?**
高性能推理功能支持所有模型产线与单功能模块,但部分模型可能无法加速推理,具体原因可以参考问题1。
**3: 为什么安装高性能推理插件会失败,日志显示:Currently, the CUDA version must be 11.x for GPU devices.?**
高性能推理功能目前支持的环境如 [1.1节的表](#11-安装高性能推理插件) 所示。如果安装失败,可能是高性能推理功能不支持当前环境。另外,CUDA 12.6 已经在支持中。
**4. 为什么使用高性能推理功能后,程序在运行过程中会卡住或者显示一些 WARNING 和 ERROR 信息?这种情况下应该如何处理?**
在引擎构建过程中,由于子图优化和算子处理,可能会导致程序耗时较长,并生成一些 WARNING 和 ERROR 信息。然而,只要程序没有自动退出,建议耐心等待,程序通常会继续运行至完成。