tensor RT/onnx runtime 进行cpu/gpu 推理加速/模型部署

TensorRT,由NVIDIA精心打造,是一款专为深度学习推理任务设计的高效优化工具。它能够显著降低应用的延迟同时提升处理速度,是大规模数据中心、嵌入式设备以及自动驾驶技术等领域推理加速的理想选择。TensorRT的兼容性广泛,支持包括TensorFlow、Caffe、Mxnet和Pytorch在内的主流深度学习框架,与NVIDIA GPU的结合使用。

TensorRT本质上是一个推理加速器,它允许用户在模型训练完成后,直接将模型文件导入TensorRT进行优化,无需再依赖原始的深度学习框架。

 

模型训练:需要fp32,避免梯度下溢和舍入误差

梯度下溢:当梯度值非常小(小于 ~6e-8)时,在FP16中会变成0(即下溢)。一旦梯度变为0,对应的参数就无法更新,学习过程会停滞

舍入误差:在FP16中,由于精度有限,很多微小的更新(比如用一个很小的学习率乘以一个很小的梯度)可能会因为舍入误差而直接变为0。在数百万次的迭代中,这些微小的误差累积起来可能会导致模型无法收敛,或者收敛到一个很差的局部最优点。

模型推理:不涉及到反向传播(梯度计算),只需fp16

在FP32下训练好的模型,其权重和激活值的分布通常在一个合理的范围内。将其转换为FP16进行推理,对于绝大多数任务(如图像分类、目标检测、语音识别等)的最终输出精度影响微乎其微,通常只有小数点后几位的损失,但换来的却是巨大的速度提升和资源节省。

TensorRT 采用多种优化技术来提升深度学习模型的推理性能:

1、层间融合技术:

TensorRT 通过层间融合,将卷积层、偏置层和ReLU激活层合并为单一的CBR结构,实现横向和纵向的层融合。横向融合将这些层合并为单一操作,仅消耗一个CUDA核心,而纵向融合则将具有相同结构但不同权重的层合并成更宽的层,同样只占用一个CUDA核心。这种融合减少了计算图中的层数,降低了CUDA核心的使用量,从而使得模型结构更加紧凑、运行速度更快、效率更高。

2、数据精度优化:

在深度学习模型训练过程中,通常使用32位浮点数(FP32)来保证精度。然而,在推理阶段,由于不需要进行反向传播,可以安全地降低数据精度至FP16或INT8,这不仅减少了内存占用和延迟,还使得模型体积更小,提高了推理速度。

3、Kernel自动调优:

TensorRT 能够自动调整CUDA核心的计算方式,以适应不同的算法、模型结构和GPU平台。这种自动调优确保了模型在特定硬件上以最佳性能运行。

 

TensorRT 部署流程主要有以下五步:

1.训练模型

2.导出模型为 ONNX 格式

3.选择精度

4.转化成 TensorRT 模型

5.部署模型
Pytorch → ONNX → TensorRT

 

特性/维度PyTorch (直接推理)ONNX Runtime (ONNX Runtime)TensorRT
核心定位 研究与训练框架,兼顾推理 跨平台高性能推理引擎 NVIDIA平台极致性能推理SDK
工作流程 torch.jit.trace 或 torch.jit.script 导出模型 -> 用PyTorch C++/Python加载推理 PyTorch/TF等 -> 导出ONNX模型 -> ONNX Runtime加载并推理 PyTorch/TF/ONNX -> 转换和优化 -> 生成TensorRT引擎 -> 执行引擎
性能 较好。利用了PyTorch的优化,但包含一些为训练准备的冗余操作。 优秀。专为推理优化,支持图优化、算子融合等,性能通常优于原生PyTorch。 极致。在NVIDIA GPU上通常是性能天花板。通过内核融合、量化、自动内核调优等技术达到最优。
硬件支持 主要支持CPU和NVIDIA GPU(通过CUDA)。对其它硬件(如AMD GPU, NPU)支持有限或需要额外适配。 非常广泛。通过Execution Providers机制,支持CPU、NVIDIA CUDA/TensorRT、AMD ROCm、Intel OpenVINO、ARM NN、Android NNAPI等。“一次转换,多处运行”。 仅限NVIDIA GPU。包括GeForce, Tesla, Jetson等系列。
易用性与灵活性 最高。直接在训练框架内完成,调试方便,动态图模型(如带有控制流的)处理起来更自然。 高。ONNX是一个开放的标准,生态庞大。转换过程可能遇到不支持的算子,需要一些调试。 较低。优化和构建引擎需要时间,过程像是一个“黑盒”,调试难度较大。量化等操作可能会引入精度损失。
关键技术 TorchScript, torch.jit ONNX格式、图优化、多种Execution Providers 层与内核融合、精度校准(INT8量化)、内核自动调优、动态Tensor优化
典型应用场景 1. 研究原型快速验证
2. 对延迟不敏感的服务器端应用
3. 需要利用PyTorch动态图特性的场景
1. 需要跨平台部署(如同时部署在服务器CPU和边缘设备)
2. 希望获得比原生框架更好的性能,同时又不想被单一硬件厂商锁定
3. 云原生和微服务环境
1. 对延迟和吞吐量要求极致的场景(如自动驾驶、视频直播、高并发推荐系统)
2. 边缘设备(NVIDIA Jetson)
3. 需要INT8量化来大幅提升性能并降低功耗的场景

 PyTorch 部署推理

  • 本质:使用训练框架本身进行推理。

  • 优点:

    • 无缝衔接:无需模型转换,直接从训练环境到推理环境,减少了转换出错的风险。

    • 调试方便:可以使用熟悉的PyTorch工具和API进行调试。

  • 缺点:

    • 性能非最优:PyTorch为了支持训练,保留了很多在推理时不需要的操作和内存布局,这带来了额外的开销。

    • 依赖较重:需要安装完整的PyTorch库,可能不适用于非常轻量级的部署。

    • 硬件支持局限:主要围绕NVIDIA GPU和CPU。

ONNX Runtime 部署推理

  • 核心:ONNX (Open Neural Network Exchange)
    ONNX是一个开放的模型表示标准。它定义了一个通用的计算图格式,使得不同框架训练的模型可以被各种推理引擎所使用。

  • 优点:

    • 硬件无关性与生态:其最大的价值在于解耦了模型和硬件。你可以将一个ONNX模型部署到几乎任何主流的硬件平台上,只需切换ONNX Runtime的Execution Provider即可。

    • 性能良好:作为一个专业的推理引擎,它进行了大量图级别的优化(如常量折叠、冗余节点消除等),去除了训练带来的开销。

  • 挑战:

    • 转换支持:并非所有PyTorch/TensorFlow的算子都能完美地转换为ONNX格式,有时会遇到不支持的算子或需要自定义。

    • 性能非极致:虽然性能很好,但由于要兼顾通用性,它无法像TensorRT那样为特定型号的GPU进行极其深入的底层优化。

TensorRT 部署推理

    • 核心:针对NVIDIA GPU的编译器
      TensorRT不是一个简单的推理器,而是一个深度学习优化器和运行时引擎。它的工作流程是:将你的模型(如ONNX)作为输入,然后进行一系列极其激进的优化,最终生成一个高度优化的、序列化后的计划文件(Plan File),这个文件就是TensorRT引擎。

    • 优化技术包括:

      • 层融合:将多个层(如Conv、BN、ReLU)合并成一个单一的、更高效的内核。这大大减少了内核启动次数和内存读写操作。

      • 精度校准:在保证精度损失可接受的前提下,将FP32模型转换为FP16甚至INT8,从而显著提升速度并降低显存占用。

      • 内核自动调优:针对你当前使用的特定GPU型号,自动选择最优的内核实现。

    • 优点:

      • 极致性能:在NVIDIA GPU上,其性能通常是所有方案中最好的。

      • 低延迟/高吞吐:特别适合实时应用和高并发场景。

    • 缺点:

      • 供应商锁定:仅限NVIDIA硬件。

      • 构建耗时:引擎构建(特别是开启所有优化选项时)可能需要较长时间。

      • 复杂度与调试:优化过程是个黑盒,量化可能带来精度问题,调试比较困难。

部署方案:

使用 ONNX Runtime 作为顶层的推理接口。

在安装了NVIDIA GPU的机器上,为ONNX Runtime配置 TensorRT Execution Provider。

这样,你的代码只需调用ONNX Runtime的API,当它在有NVIDIA GPU的环境中运行时,会自动调用底层极速的TensorRT引擎,而在其他环境(如只有CPU)时,则回退到CPU或其他EP。这实现了 “一套代码,多种部署” 的理想状态。

 

ONNX Runtime 的 TensorRT EP 作为一个抽象层,自动处理了所有底层的 TensorRT 操作:

操作传统 TensorRTONNX Runtime + TensorRT EP
引擎构建 需要手动调用 builder.build_engine() 自动处理
序列化 需要手动保存/加载 .engine 文件 自动处理(通过缓存)
优化配置 需要手动设置 builder_config 通过 Provider 选项配置
上下文管理 需要手动创建 execution_context 自动管理
import onnxruntime as ort

# 这一切都是自动的!
trt_options = {
    'trt_fp16_enable': True,
    'trt_engine_cache_enable': True,
    'trt_engine_cache_path': './trt_cache'
}

session = ort.InferenceSession(
    "model.onnx",
    providers=['TensorrtExecutionProvider'],
    provider_options=[trt_options]
)

# 背后自动发生:
# 1. 解析 ONNX 模型
# 2. 调用 TensorRT builder
# 3. 构建优化引擎
# 4. 序列化并缓存(如果启用)

 

posted @ 2025-10-29 16:02  wangssd  阅读(409)  评论(0)    收藏  举报