Pytorch->ONNX->TensorRT
Pytorch
分类/检测/分割模型转换到ONNX
格式,最后转换成TensorRT Engine
文件进行推理(Python
)。
Pytorch2ONNX
Pytorch
提供了转换函数torch.onnx.export进行模型格式转换,关键点在于是否指定动态批量大小。注意,低版本的TensorRT
版本不一定适配于高等级的opset_version
。
ONNX2TensorRT
对于ONNX
模型转换成TensorRT
模型,需要设置好输入大小(固定还是动态)和精度(FP32/FP16
)。除了调用API
来手动转换外,TensorRT
提供了命令行转换工具trtexec:
注意:TensorRT自带了trtexec,位于/path/to/tensorrt/bin/trtexec
,比如/usr/bin/tensorrt/bin/trtexec
1 | 固定批量大小 |
- 模型加载相关参数
--onnx=<path>
:指定输入模型为 ONNX 格式--explicitBatch
:启用显式批量模式(Explicit Batch Mode)
- 引擎生成与保存相关参数
--saveEngine=<path>
:将生成的 TensorRT 引擎保存到指定路径
- 输入数据相关参数
--shapes=<input_name>:<shape>
:- 定义输入张量的形状(适用于动态形状模型)
- 示例:
--shapes=image:32x3x640x640,scale_factor:32x2
image:32x3x640x640
:表示输入图像张量的形状为[batch_size, channels, height, width]
,即[32, 3, 640, 640]
scale_factor:32x2
:表示另一个输入张量scale_factor
的形状为[32, 2]
--minShapes=<input_name>:<shape>
:- 定义动态形状模型的最小输入形状
- 示例:
--minShapes=input:1x3x224x224
--maxShapes=<input_name>:<shape>
:- 定义动态形状模型的最大输入形状
- 示例:
--maxShapes=input:16x3x224x224
--workspace=<size_in_MB>
- 设置 GPU 内存的工作空间大小(以 MB 为单位)
- 示例:
--workspace=1024
--inputIOFormats=fp16:chw
- 定义输入张量的格式为 FP16 和通道优先(
Channel-Height-Width, CHW
)FP16
:表示输入数据将以半精度浮点数(FP16
)格式传递CHW
:表示输入张量的维度顺序为[channel, height, width]
- 定义输入张量的格式为 FP16 和通道优先(
--outputIOFormats=fp16:chw
- 定义输出张量的格式为
FP16
和通道优先(CHW
)
- 定义输出张量的格式为
- 性能相关参数
--batch=<size>
- 设置推理的批量大小(仅在隐式批量模式下有效)
- 示例:
--batch=32
--avgRuns=<num>
- 计算平均性能时使用的运行次数
- 示例:
--avgRuns=5
- 构建选项相关参数
--fp16
:启用 FP16(半精度浮点数)推理以提高性能
TensorRT
TensorRT
不同版本的变化非常大,往往不能够兼容,所以转换和推理实现均在同一个TensorRT
环境下实现。
1 | python -c "import tensorrt as trt; print(trt.__version__)" |
Docker
Nvidia提供了配置好依赖环境的Docker镜像,可以在容器中进行模型转换和推理:
1 | docker run --gpus all -it --rm nvcr.io/nvidia/pytorch:20.12-py3 |
相关实现
- 模型转换:deploy/export/
- 模型推理:deploy/py/
相关阅读
Pytorch2ONNX
ONNX2TensorRT