个人简介
作者简介:全栈研发,具备端到端系统落地能力,专注大模型的压缩部署、多模态理解与 Agent 架构设计。 热爱“结构”与“秩序”,相信复杂系统背后总有简洁可控的可能。
我叫观熵。不是在控熵,就是在观测熵的流动
个人主页:观熵
个人邮箱:privatexxxx@163.com
座右铭:愿科技之光,不止照亮智能,也照亮人心!
专栏导航
观熵系列专栏导航:
AI前沿探索:从大模型进化、多模态交互、AIGC内容生成,到AI在行业中的落地应用,我们将深入剖析最前沿的AI技术,分享实用的开发经验,并探讨AI未来的发展趋势
AI开源框架实战:面向 AI 工程师的大模型框架实战指南,覆盖训练、推理、部署与评估的全链路最佳实践
计算机视觉:聚焦计算机视觉前沿技术,涵盖图像识别、目标检测、自动驾驶、医疗影像等领域的最新进展和应用案例
国产大模型部署实战:持续更新的国产开源大模型部署实战教程,覆盖从 模型选型 → 环境配置 → 本地推理 → API封装 → 高性能部署 → 多模型管理 的完整全流程
TensorFlow 全栈实战:从建模到部署:覆盖模型构建、训练优化、跨平台部署与工程交付,帮助开发者掌握从原型到上线的完整 AI 开发流程
PyTorch 全栈实战专栏: PyTorch 框架的全栈实战应用,涵盖从模型训练、优化、部署到维护的完整流程
深入理解 TensorRT:深入解析 TensorRT 的核心机制与部署实践,助力构建高性能 AI 推理系统
Megatron-LM 实战笔记:聚焦于 Megatron-LM 框架的实战应用,涵盖从预训练、微调到部署的全流程
AI Agent:系统学习并亲手构建一个完整的 AI Agent 系统,从基础理论、算法实战、框架应用,到私有部署、多端集成
DeepSeek 实战与解析:聚焦 DeepSeek 系列模型原理解析与实战应用,涵盖部署、推理、微调与多场景集成,助你高效上手国产大模型
端侧大模型:聚焦大模型在移动设备上的部署与优化,探索端侧智能的实现路径
行业大模型 · 数据全流程指南:大模型预训练数据的设计、采集、清洗与合规治理,聚焦行业场景,从需求定义到数据闭环,帮助您构建专属的智能数据基座
机器人研发全栈进阶指南:从ROS到AI智能控制:机器人系统架构、感知建图、路径规划、控制系统、AI智能决策、系统集成等核心能力模块
人工智能下的网络安全:通过实战案例和系统化方法,帮助开发者和安全工程师识别风险、构建防御机制,确保 AI 系统的稳定与安全
智能 DevOps 工厂:AI 驱动的持续交付实践:构建以 AI 为核心的智能 DevOps 平台,涵盖从 CI/CD 流水线、AIOps、MLOps 到 DevSecOps 的全流程实践。
C++学习笔记?:聚焦于现代 C++ 编程的核心概念与实践,涵盖 STL 源码剖析、内存管理、模板元编程等关键技术
AI × Quant 系统化落地实战:从数据、策略到实盘,打造全栈智能量化交易系统
《TensorRT 核心加速机制拆解:Layer Fusion、精度优化与图调度全解析》
✨ 摘要:
TensorRT 为什么推理能快 3 到 10 倍?这背后并不只是算力差异,更关键是它对网络结构、算子执行、内存管理等全链路做了高度优化。本文将从 Layer Fusion、精度压缩、内核调度、张量复用等四大角度,逐一拆解 TensorRT 的核心加速机制,并辅以实际例子与可视化 benchmark,帮助你构建起性能调优的系统认知。
🧭 目录:
- Layer Fusion(层融合)机制详解:如何合并网络算子?
- 精度优化策略:FP32、FP16、INT8 逐个拆解
- Kernel Auto-Tuning:运行时怎么选出最快的执行路径?
- 内存复用机制:Tensor 之间的资源如何节省?
- 执行调度器工作原理:串行?并行?多流如何调度?
- 多 Batch 推理加速原理:吞吐量提升的背后
- Profiler 使用技巧:如何识别推理瓶颈?
- 实战案例对比:不同精度、优化配置的速度差异
- 附录:优化配置参数调优参考
、
1. Layer Fusion(层融合)机制详解:如何合并网络算子?
当我们谈到 TensorRT 的“图优化能力”时,最常被提到的关键词就是:Layer Fusion(层融合,又称算子融合)。这是 TensorRT 在构建 Engine 时做的第一步重要优化,也是性能提升最立竿见影的方式之一。
🧠 什么是 Layer Fusion?
Layer Fusion 指的是:将原本在网络中连续、独立的多个算子(Layers)合并成一个复合算子(Kernel)进行联合执行。
例如,下面这个常见的操作链条:
Conv2D → BatchNorm → ReLU
在 TensorRT 中可以融合成一个自定义 CUDA Kernel,一次性完成卷积、归一化和激活的所有计算。这个“合并执行”的操作能大幅减少:
- CUDA Kernel 的启动次数;
- 内存访问次数;
- 中间 Tensor 的显存开销。
⚙️ 为什么 Layer Fusion 会让模型跑得更快?
TensorRT 在默认构建时,会对整个计算图进行图级优化,自动检测哪些相邻层可以融合。融合后,多个操作共享内存调度、一次性读写显存、统一调度执行计划,从而实现:
加速点 | 表现形式 |
---|---|
🚀 减少 Kernel Launch | 原本需要启动 3 次 CUDA Kernel,现在只需 1 次 |
💾 降低内存访问量 | 中间 Tensor 不需要频繁读写显存 |
🧩 提升流水线并发 | 融合后的复合 Kernel 更容易进入 GPU 并发执行队列 |
📉 显存占用下降 | 临时中间 Tensor 可被复用或省略 |
✅ 实测表明:在典型网络中,Layer Fusion 可带来 1.5~2.5 倍的推理提速。
🔍 哪些算子可以被融合?
可融合组合 | 说明 |
---|---|
Conv2D + BatchNorm | 卷积权重可直接吸收 BN 参数 |
Conv2D + ReLU / LeakyReLU / SiLU | 激活函数可作为 fused 操作 |
Conv2D + Add / BiasAdd | 可以合并 bias 或残差连接部分 |
Linear + Activation | 全连接后直接融合非线性变换 |
❗ 注意:融合的前提是这几个层的计算维度兼容,并且中间没有不可融合的分支(如 concat、reshape、loop)。
📦 如何验证模型有没有发生融合?
你可以通过以下方式确认:
- 使用
trtexec
命令带--verbose
参数构建 engine:
trtexec --onnx=model.onnx --fp16 --verbose
输出日志中会看到如:
[TRT] Layer Fusion: Conv2D + ReLU fused into single kernel
- 使用 TensorRT 的 Graph Viewer 工具(或 polygraphy)查看优化前后的网络结构差异。
🎯 实战建议:
操作 | 建议 |
---|---|
训练前 | 使用 Conv + BN 模式训练,尽量避免 Dropout、If 逻辑 |
导出 ONNX | 使用 opset_version ≥ 11 ,保持层合并能力 |
转换前 | 用 onnxsim 简化模型,去除干扰层(如 Identity、Cast) |
构建时 | 开启 --fp16 、--explicitBatch ,保留最大融合能力 |
2. 精度优化策略:FP32、FP16、INT8 逐个拆解
除了 Layer Fusion,TensorRT 最具代表性的性能优化手段之一,就是它支持 多种计算精度格式,并能自动切换、融合使用,从而大幅提升推理速度、降低显存占用,甚至支持低功耗设备部署。
🎯 目标精度的三种类型:
精度类型 | 说明 | 支持情况 |
---|---|---|
FP32(全精度) | 默认精度,计算最精确 | 所有硬件都支持,兼容性最好 |
FP16(半精度) | 速度提升明显,精度基本保持 | Turing(T4)及以上 GPU 完美支持 |
INT8(量化精度) | 精度进一步压缩,适合边缘部署 | 需校准,推理速度最快,占用最小 |
📊 精度对比表(以 ResNet50 为例)
精度 | 推理速度提升 | 显存占用下降 | 精度损失(Top-1 acc) |
---|---|---|---|
FP32 | 1×(基准) | 1×(基准) | 76.1%(原始) |
FP16 | 1.5× ~ 2.5× | ↓ 30%~50% | ≈ 76.0% |
INT8 | 3× ~ 6× | ↓ 60%~70% | ≈ 75.5%(需校准好) |
✅ FP16 加速原理
- FP16 表示使用 16 位浮点格式进行计算;
- NVIDIA Turing/Ampere 架构起引入了 Tensor Core,专为 FP16 加速设计;
- TensorRT 自动识别哪些层可以用 FP16 替代;
- 可通过 BuilderFlag 开启:
config.set_flag(trt.BuilderFlag.FP16)
⚠️ 仅当 GPU 支持时才有效(GTX 系列不建议使用 FP16)
🔄 INT8 精度:量化部署的终极形态
INT8 是指使用 8-bit 整数近似浮点权重与激活值,实现最大程度压缩:
- 权重、输入、输出张量都以整数表示;
- 大幅降低带宽消耗、显存、功耗;
- 精度依赖于量化策略与校准数据集的代表性。
config.set_flag(trt.BuilderFlag.INT8)
config.set_int8_calibrator(MyEntropyCalibrator())
INT8 需要配合 calibrator 使用,在构建 engine 时对输入数据做分布统计,生成量化 scale。
🧩 混合精度部署:性能与精度的最佳平衡点
TensorRT 支持 混合精度部署,你可以设置:
- 部分关键层用 FP32 保留精度
- 其余层用 FP16/INT8 实现性能优化
可以在构建阶段结合 profile 设置哪些层禁用低精度。
⚠️ 精度优化中的注意事项:
场景 | 建议 |
---|---|
使用 FP16 | 确保 GPU 支持 + 打开显式 batch 模式 |
使用 INT8 | 提供 ≥500 张有代表性校准图像;确保激活分布稳定 |
视觉模型部署 | 一般 FP16 足够,INT8 可用于移动/Jetson |
精度敏感模型(如医学) | 建议全 FP32 或混合精度禁量化关键层 |
3. Kernel Auto-Tuning:运行时怎么选出最快的执行路径?
TensorRT 并不是简单地“按网络图顺序执行每一层”,它会根据你的模型结构、输入数据 shape、硬件环境,在构建 engine 的时候做一件事:
为每一层选择最优的 CUDA Kernel 实现,并组合成执行计划(Execution Plan)。
这就是所谓的 Kernel Auto-Tuning 机制,它是 TensorRT 性能超越多数 ONNX 运行时的关键因素之一。
🧠 什么是 Kernel?
在 GPU 编程中,每一个执行的算子(如卷积、矩阵乘法、激活函数)都有多个 kernel 实现版本:
- 不同的线程块划分策略;
- 不同的共享内存调度方式;
- 有的适合小尺寸输入,有的适合大 batch 输入;
- 有的更适合 A100,有的更适合 T4 或 Jetson。
⚙️ TensorRT 如何选择最佳 Kernel?
在构建阶段(build engine),TensorRT 会针对每个 Layer 的具体 shape、精度类型(FP16/INT8):
- 枚举所有可行的 kernel 实现组合;
- 在 GPU 上跑小规模 benchmark;
- 记录每个 kernel 的运行时间;
- 选择整体最快的执行路径构建 engine。
这个过程类似于 自动微调调度策略,每次构建 engine 都是一次为当前设备环境“定制”的推理路径优化。
🧪 如何启用 / 观察 Auto-Tuning 行为?
默认 trtexec / builder 都会启用 auto-tuning:
trtexec --onnx=model.onnx --explicitBatch --fp16 --verbose
你会看到类似日志:
[TRT] Profiling layer: Conv_12
[TRT] Selected tactic 100 for layer Conv_12: time = 0.045ms
其中 “tactic” 就是每个 kernel 策略的编号。
若构建耗时较久,极可能是 tuning 过程在评估多个 tactic,这是正常且必要的过程,建议保留构建 cache 避免重复。
🎯 实战建议:
操作 | 建议 |
---|---|
构建慢? | 尽量先用少量 batch 试构建,确认 kernel 选择 |
多次构建? | 将 plan 文件缓存,每次部署直接 load |
多卡部署? | 尽量在同型号 GPU 上构建 engine,避免不通用 |
构建不稳定? | 降低 profile 范围;禁用 FP16 或禁用不稳定 plugin |
4. 内存复用机制:Tensor 之间的资源如何节省?
除了执行速度,TensorRT 另一个工程优势是:可以极致节省显存和内存资源,支持更大 batch、更小部署代价。
其实现依赖的关键优化机制是:Tensor Memory Reuse(张量内存复用)。
🧠 什么是张量内存复用?
在常规的前向推理中,每一层的输出都是一个张量,如果不做优化,每一层输出都要分配一块新的显存空间,会迅速造成“显存爆炸”。
TensorRT 在构建 engine 时会分析整个图的依赖关系:
- 判断哪些中间输出可以在后续不再被使用;
- 回收这些张量的内存空间;
- 将这块显存用于其他张量的存储。
这就像是一个动态内存管理器,只在必要的时候为张量分配空间。
🔧 TensorRT 的内存复用优势:
项目 | 表现 |
---|---|
显存峰值 | 大幅下降(实测可节省 30~60% 显存) |
支持 batch size | 更容易部署 batch=16 / 32 的模型 |
推理延迟 | 更容易并发调度,避免频繁 malloc/free |
多模型复用 | Engine 可同时存在于共享 GPU 资源池 |
🧪 控制与调优接口(Python):
config.set_memory_pool_limit(trt.MemoryPoolType.WORKSPACE, 1 << 30) # 限制最大 workspace 显存
你还可以通过设置:
profile.set_shape()
控制 shape 对显存的影响;builder.max_batch_size
(TensorRT 8 以后已弃用)改为使用 Profile 控制;allow_gpu_fallback
启用 Tensor fallback。
🎯 实战建议:
场景 | 优化建议 |
---|---|
显存紧张 | 降低 workspace size、优化 profile 范围、使用 FP16 |
多模型部署 | 使用 engine 序列化管理共享内存池 |
Jetson / Orin | 强烈建议使用 INT8 + 精确 profile 来控制资源开销 |
5. 执行调度器工作原理:串行?并行?多流如何调度?
TensorRT 不只是构建 engine 的工具,更是一个运行时的高效执行器。在推理阶段,它会根据网络图结构和优化策略,生成一个 调度计划(Execution Plan),并负责高效调度每一个 Layer 的执行。
⚙️ 串行 vs 并行:推理并不是简单按图执行
常规理解中,模型执行是“从上到下、逐层执行”,但实际在 GPU 上,TensorRT 会尽可能对 无依赖关系的 Layer 并行执行。
举个例子:
┌───→ Conv1 → ReLU1 ──┐
Input →──┤ ├──→ Add → ReLU2 → Output
└───→ Conv2 → ReLU3 ─┘
在这个结构中:
- Conv1 与 Conv2 是并行路径;
- TensorRT 会将这两个分支安排在两个 CUDA Stream 上并发执行;
- Add 和 ReLU2 等待前两个完成后再统一调度。
🔁 TensorRT 的执行调度核心组件
组件名称 | 说明 |
---|---|
Execution Context | 表示一次推理过程,可绑定输入 shape、stream、bindings |
CUDA Stream | GPU 上异步任务的通道,一个 stream 内任务按顺序执行,多 stream 可并行 |
Tactic Scheduler | Kernel Auto-Tuning 的结果,生成每层的最优调度路径 |
CUDA Graph(8.0+) | 高版本可启用 CUDA Graph 提升整个推理过程的调度效率 |
🧪 如何启用多 stream 并发(Python 示例):
stream = cuda.Stream()
context.execute_async_v2(bindings=bindings, stream_handle=stream.handle)
多个推理请求可以绑定在不同 stream 上实现并发:
context1.execute_async_v2(..., stream_handle=stream1.handle)
context2.execute_async_v2(..., stream_handle=stream2.handle)
🎯 实战建议:
场景 | 调度建议 |
---|---|
单模型高并发 | 多个 Execution Context + 多个 CUDA Stream |
多模型协同部署 | 分配不同 Stream,避免互相阻塞 |
部署服务 | 使用 Triton Server 自动实现 stream / batch 并发 |
Jetson 场景 | 并发 stream 数量限制受限于内存,请设定合理上下限 |
6. 多 Batch 推理加速原理:吞吐量提升的背后
在部署服务中,尤其是 AI API、图像处理、自动标注等场景,我们通常不是“一张图跑一次”,而是一次处理 8 张、16 张、甚至 64 张图像,这就涉及到Batch 推理。
TensorRT 对 Batch 推理做了深入的优化,能显著提升吞吐量。
🔍 什么是 Batch 推理?
Batch 指的是一次前向推理中输入多个样本,例如:
Input Tensor Shape: (8, 3, 224, 224)
这种方式下:
- 多个样本共享同一网络结构执行;
- GPU 利用率更高;
- TensorRT 会统一安排中间内存、执行路径。
⚙️ Batch 推理的优化机制
-
内存预分配优化
- TensorRT 会在 Engine 构建阶段为最大 batch 分配 Tensor 空间,避免每次 malloc。
-
Kernel 选择优化
- Auto-Tuning 会根据 batch size 选择最适配的 CUDA Kernel。
-
流式调度优化
- 多 Batch 内部的张量计算尽可能合并成统一 kernel 调度,提升吞吐效率。
🧪 如何构建支持 Batch 推理的 Engine?
profile.set_shape("input", min=(1, 3, 224, 224), opt=(8, 3, 224, 224), max=(32, 3, 224, 224))
config.add_optimization_profile(profile)
执行时:
context.set_binding_shape(0, (16, 3, 224, 224)) # 执行 16 张图
🔍 实际部署中,你可以将多个请求合并成一个 batch 送入推理队列,类似“批处理”。
📈 实测收益(以 YOLOv8 为例):
Batch Size | 单张延迟(ms) | 总推理时间(ms) | 吞吐量(图/s) |
---|---|---|---|
1 | 18.2 | 18.2 | 55 |
4 | 7.1 | 28.4 | 141 |
16 | 4.2 | 67.2 | 238 |
🎯 实战建议:
场景 | 推荐做法 |
---|---|
推理 API 服务 | 设置请求队列聚合,支持 Batch 拼接 |
显存足够 | batch size 越大,单位时间吞吐越高 |
Jetson 平台 | 建议 batch size ≤ 4,注意 profile 限制 |
大模型推理 | Batch 越大显存越高,需提前测试峰值使用率 |
7. Profiler 使用技巧:如何识别推理瓶颈?
当我们部署模型之后,如果性能不如预期,或者 GPU 利用率偏低,这时就需要用 Profiler 工具来“解剖”整个推理过程,找出耗时大户、低效算子、内存瓶颈等问题。
TensorRT 提供了多种方式进行 性能分析与可视化,下面逐一介绍:
✅ 方式一:使用 trtexec 的内置 profiler(最常用)
trtexec --onnx=model.onnx --fp16 --verbose --profilingVerbosity=detailed
你将看到如下输出:
[05/05/2024-10:28:33] [TRT] [V] [PROFILE] Layer Conv_3 + ReLU_3 time: 0.62 ms
[05/05/2024-10:28:33] [TRT] [V] [PROFILE] Layer Add_5 time: 0.18 ms
...
[05/05/2024-10:28:33] [TRT] [V] [PROFILE] Total time: 12.7 ms
每一层的执行时间、输入输出 shape 都会列出,可直观看出哪一层耗时最多。
✅ 方式二:使用 Python 自定义 Profiler(适合部署分析)
class MyProfiler(trt.IProfiler):
def __init__(self):
self.records = []
def report_layer_time(self, layer_name, time_ms):
self.records.append((layer_name, time_ms))
profiler = MyProfiler()
context.profiler = profiler
推理执行后可以打印 profiler.records
,进一步分析单层性能。
✅ 方式三:使用 Nsight Systems / Nsight Compute(可视化分析)
- NVIDIA 提供的专业级 GPU Profiling 工具;
- 支持可视化 kernel 调度、stream 排布、内存读写、上下文切换等信息;
- 对深度优化(如 CUDA Graph、Tensor Core 利用率)分析极有帮助。
🎯 分析 Profiler 输出的核心目的:
问题类型 | 识别信号 | 可能优化方向 |
---|---|---|
某层耗时明显超长 | 单层执行时间 >> 其它层 | 是否未融合?可否 Plugin 重写? |
总体推理时间与期望不符 | 总耗时 > trtexec Benchmark | 检查是否动态输入未生效 |
Stream 并行度低 | 所有层串行执行 | 是否绑定了错误的 Execution Context? |
8. 实战案例对比:不同精度、优化配置的速度差异
这一节我们以典型模型 ResNet50 和 YOLOv8 为例,对比不同配置下的实际推理时间、显存占用与吞吐率,直观体现 TensorRT 加速效果。
✅ 测试环境说明:
- 显卡:NVIDIA T4(16GB)
- 输入尺寸:ResNet50 → (1,3,224,224),YOLOv8 → (1,3,640,640)
- 工具:trtexec + Python 推理脚本
📊 ResNet50 推理性能对比(单位:ms)
配置 | 单张推理时间 | 显存占用 | 吞吐量(图/s) |
---|---|---|---|
FP32 | 12.8 ms | 650 MB | 78 |
FP16 | 6.1 ms | 420 MB | 164 |
INT8 | 4.2 ms | 280 MB | 238 |
FP16 + Layer Fusion | 5.3 ms | 380 MB | 189 |
📊 YOLOv8 推理性能对比(单位:ms)
配置 | 推理时间 | 显存占用 | 是否支持动态 shape |
---|---|---|---|
FP32 + 静态 shape | 54.2 ms | 1100 MB | 否 |
FP16 + 动态 profile | 31.6 ms | 800 MB | ✅ |
INT8 + 动态 profile | 21.3 ms | 540 MB | ✅ |
✅ 优化策略带来的性能提升汇总:
策略 | 性能提升幅度 |
---|---|
FP32 → FP16 | 提升 1.5~2.5 倍 |
FP32 → INT8 | 提升 3~5 倍,显存下降 60% |
开启 Layer Fusion | 15%~35% 性能提升 |
多 Batch 并发 | 吞吐量提升 2~4 倍 |
动态 Profile 精调 | 显存占用下降 30% 以上 |
9. 附录:优化配置参数调优参考指南
为了帮助你快速配置出“既稳又快”的 TensorRT Engine,这里整理了一份 实战推荐参数清单,包括 trtexec
与 Python API 两种常用方式,便于快速查阅和直接复用。
✅ trtexec 推荐配置(适用于性能调试 / benchmark)
trtexec \
--onnx=model.onnx \
--explicitBatch \
--fp16 \
--workspace=2048 \
--minShapes=input:1x3x224x224 \
--optShapes=input:8x3x224x224 \
--maxShapes=input:16x3x224x224 \
--saveEngine=model_fp16.engine \
--verbose \
--profilingVerbosity=detailed
参数 | 说明 |
---|---|
--explicitBatch | 开启显式 Batch 模式,必备 |
--fp16 / --int8 | 开启精度优化 |
--workspace | 最大显存分配,单位 MB(越大越优化) |
--min/opt/maxShapes | 设置动态输入维度范围 |
--verbose | 输出详细日志,便于排查问题 |
--profilingVerbosity | 打印每层耗时 |
✅ Python API 配置参考(适用于部署期)
config = builder.create_builder_config()
config.max_workspace_size = 1 << 30 # 1GB 显存限制
config.set_flag(trt.BuilderFlag.FP16)
profile = builder.create_optimization_profile()
profile.set_shape("input", min=(1,3,224,224), opt=(8,3,224,224), max=(16,3,224,224))
config.add_optimization_profile(profile)
如需使用 INT8,还需注册校准器
config.set_flag(trt.BuilderFlag.INT8)
+config.set_int8_calibrator(...)
🎯 调优建议汇总:
场景 | 推荐做法 |
---|---|
高性能服务器 | 启用 FP16、设置大 workspace、动态 batch |
Jetson / 嵌入式平台 | 启用 INT8、精准 profile、控制 max shape |
多任务部署 | 将多个模型的 Engine 分别构建并统一调度 |
大模型部署(LLM) | TensorRT-LLM 或使用 CUDA Graph + 多流配置 |
10. 如果你觉得这篇有用……
🎉 恭喜你完整读完本篇!我们深入拆解了 TensorRT 的加速核心逻辑,包括:
- Layer Fusion 层融合是如何优化结构执行的;
- 精度选择如何平衡性能与资源(FP32 vs FP16 vs INT8);
- TensorRT 如何调度最优 CUDA Kernel,提升并行度;
- 多 stream 并发、多 batch 吞吐优化的具体原理与配置方式;
- Profiler 如何定位瓶颈、识别高耗时层;
- 实战 benchmark 直观呈现优化效果。
如果你觉得这篇内容对你有帮助,欢迎点个 👍 点赞、⭐ 收藏,并关注我后续的更多 TensorRT 实战干货专栏👇👇👇
持续输出不易,你的支持是我更新下去的最大动力 🙏