tensorrt-cpp-api
tensorrt-cpp-api 是一个专注于 NVIDIA TensorRT C++ API 的实战教程项目,旨在帮助开发者轻松掌握高性能 GPU 机器学习推理技术。面对 TensorRT 官方文档繁杂难懂、上手门槛高的问题,该项目通过完整的代码示例和详细的视频讲解,手把手教用户如何在 Ubuntu 环境下部署和优化推理引擎。
它核心解决了从环境搭建、引擎生成到异步推理执行的全流程痛点,支持单/多输入输出模型及动态批处理,涵盖 FP32、FP16 和 INT8 多种精度模式。项目特别强调了 CUDA 流的使用以實現异步推理,并提供了处理 GPU 内存与图像数据的实用方案。作为基于 Insightface、YoloV8 等主流模型的通用底座,用户只需补充后处理逻辑即可快速迁移应用。
这份资源非常适合具备一定 C++ 基础的 AI 工程师、研究人员及系统架构师。对于希望深入理解底层推理机制、追求极致性能优化,或需要将深度学习模型高效部署到生产环境的开发者来说,tensorrt-cpp-api 能大幅缩短学习曲线,避免在复杂的配置细节中迷失方向,是连接理论文档与实际工程落地的优质桥梁。
使用场景
某自动驾驶团队需要在嵌入式 Jetson 设备上实时运行 YOLOv8 模型,以毫秒级延迟检测前方车辆与行人。
没有 tensorrt-cpp-api 时
- 开发者被迫依赖 Python 推理脚本,受限于 GIL 锁和解释器开销,帧率难以突破 30 FPS,无法满足高速场景需求。
- 面对官方晦涩的 C++ 文档,团队需耗费数周手动管理 CUDA 流、显存分配及异步同步逻辑,代码极易出错且难以维护。
- 难以灵活配置 FP16 或 INT8 量化策略,导致模型体积过大,无法在资源受限的边缘设备上部署。
- 处理多输入或多输出模型时,数据预处理与后处理逻辑耦合严重,每次调整网络结构都需重构大量底层代码。
使用 tensorrt-cpp-api 后
- 基于该工具提供的成熟 C++ 模板,团队直接构建高性能推理引擎,将检测延迟降低至 15ms 以内,帧率提升至 60+ FPS。
- 复用其封装好的 CUDA 流管理与显存操作模块,无需重复造轮子,三天内即可完成从模型转换到端侧部署的全流程。
- 通过简单的配置文件即可切换 FP32/FP16/INT8 精度,在几乎不损失精度的前提下,将显存占用减少 50%。
- 借助其对动态 Batch 及多输入输出的原生支持,轻松适配复杂的多任务感知网络,后续迭代开发效率提升 3 倍。
tensorrt-cpp-api 通过屏蔽底层复杂的 GPU 编程细节,让开发者能专注于业务逻辑,真正实现高性能模型在边缘端的落地。
运行环境要求
- Linux (Ubuntu 20.04
- 22.04)
必需 NVIDIA GPU,支持 CUDA 11.0+ (推荐 >=12.0),需安装 cuDNN (>=8, <9),显存大小取决于模型和批处理大小(INT8 校准若报错需减小 batch size 以适应显存)
未说明

快速开始
TensorRT C++ API 教程
如何使用 TensorRT C++ API 实现高性能 GPU 机器学习推理。
支持具有单个/多个输入以及单个/多个输出的模型,并且可以进行批处理。
项目概述视频
.
代码深度解析视频
寻求维护者 🚀
本项目正在积极寻找维护者,以帮助指导其发展和改进。如果您对该项目充满热情并有意贡献,我非常期待与您交流!
欢迎通过 LinkedIn 联系我,讨论您如何参与其中。
TensorRT C++ 教程
我已阅读所有 NVIDIA TensorRT 文档,这样您就不必再费心了!
本项目演示如何使用 TensorRT C++ API 对图像数据进行高性能 GPU 推理。它涵盖了以下内容:
- 如何在 Ubuntu 20.04 / 22.04 上安装 TensorRT 10。
- 如何为您的 GPU 生成优化后的 TensorRT 引擎文件。
- 如何指定一个简单的优化配置文件。
- 如何运行 FP32、FP16 或 INT8 精度的推理。
- 如何从 GPU 内存读取/写入数据,并处理 GPU 图像。
- 如何使用 CUDA 流执行异步推理并在稍后同步。
- 如何处理具有静态和动态批大小的模型。
- 如何处理具有单个或多个输出张量的模型。
- 如何处理具有多个输入的模型。
- 包含一个 视频教程,我在其中逐行解释代码。
- 此代码可用作任何以固定尺寸图像/图像集作为输入的模型的基础,包括 Insightface ArcFace、YoloV8、SCRFD 人脸检测等。
- 您只需实现相应的后处理代码即可。
- 待办事项:增加对输入形状动态变化的模型的支持。
- 待办事项:增加对 Windows 的支持。
入门指南
以下说明假定您正在使用 Ubuntu 20.04 或 22.04。 您需要提供自己的 ONNX 模型用于此示例代码,或者您可以下载示例模型(请参阅下方的“健康检查”部分)。
前提条件
- 已在 Ubuntu 20.04 和 22.04 上测试并正常工作(目前 不 支持 Windows)
- 安装 CUDA 11 或 12,安装说明 在此。
- 推荐 >= 12.0
- 必需 >= 11.0
- 安装 cuDNN,安装说明 在此。
- 必需 >= 8
- 必需 < 9(OpenCV GPU 尚不支持)
sudo apt install build-essentialsudo snap install cmake --classicsudo apt install libspdlog-dev libfmt-dev(用于日志记录)- 安装带有 CUDA 支持的 OpenCV。要从源代码编译 OpenCV,请运行
./scripts/中提供的build_opencv.sh脚本。- 如果您使用提供的脚本,并且将 cuDNN 安装到了非标准位置,则必须修改脚本中的
CUDNN_INCLUDE_DIR和CUDNN_LIBRARY变量。 - 推荐 >= 4.8
- 如果您使用提供的脚本,并且将 cuDNN 安装到了非标准位置,则必须修改脚本中的
- 从 此处 下载 TensorRT 10。
- 必需 >= 10.0
- 导航到
CMakeLists.txt文件,将TODO替换为您 TensorRT 的安装路径。
构建库
mkdir buildcd buildcmake ..make -j$(nproc)
运行可执行文件
- 导航到构建目录
- 运行可执行文件,并提供您的 ONNX 模型路径。
- 例如:
./run_inference_benchmark --onnx_model ../models/yolov8n.onnx- 注意:有关如何获取 yolo8n 模型的说明,请参阅下方的“健康检查”部分。
- 首次针对特定模型和选项运行可执行文件时,将根据您的 ONNX 模型构建一个 TensorRT 引擎文件。此过程相对较慢,某些模型(如 YOLO 模型)可能需要 5 分钟以上。
- 或者,您也可以直接提供自己的 TensorRT 引擎文件:
- 例如:
./run_inference_benchmark --trt_model ../models/yolov8n.engine.NVIDIAGeForceRTX3080LaptopGPU.fp16.1.1 - 注意:有关提供自定义 TensorRT 引擎文件时的注意事项,请参阅下方的 V5.0 更改日志。
- 例如:
健康检查
- 要进行健康检查,可从 这里 下载
YOLOv8n模型。 - 接下来,使用以下脚本将其从 PyTorch 转换为 ONNX:
- 您需要先运行
pip3 install ultralytics。
- 您需要先运行
from ultralytics import YOLO
model = YOLO("./yolov8n.pt")
model.fuse()
model.info(verbose=False) # 打印模型信息
model.export(format="onnx", opset=12) # 使用 opset 12 将模型导出为 ONNX
- 将生成的 ONNX 模型
yolov8n.onnx放入./models/目录中。 - 使用该模型和位于
./inputs/team.jpg的图像进行推理,应产生以下特征向量:- 注意:由于 TensorRT 不是确定性的,因此特征向量不会完全相同,但会非常相似。
3.41113 16.5312 20.8828 29.8984 43.7266 54.9609 62.0625 65.8594 70.0312 72.9531 ...
INT8 推理
启用 INT8 精度可以在牺牲一定精度(由于动态范围减小)的情况下进一步加速推理。对于 INT8 精度,用户必须提供能够代表模型实际输入数据的校准数据。建议使用 1000 张以上的校准图像。要使用 YoloV8 检查模型启用 INT8 推理,需执行以下步骤:
- 在
main.cpp中将options.precision = Precision::FP16;改为options.precision = Precision::INT8;。 - 必须在
main.cpp中修改options.calibrationDataDirectoryPath = "";,以指定包含校准数据的路径。- 如果使用 YoloV8 模型,建议使用 COCO 验证数据集,可通过
wget http://images.cocodataset.org/zips/val2017.zip下载。
- 如果使用 YoloV8 模型,建议使用 COCO 验证数据集,可通过
- 确保
engine.cpp中Int8EntropyCalibrator2::getBatch方法中的调整大小代码(见TODO)适用于您的模型。- 如果使用 YoloV8 模型,预处理代码是正确的,无需更改。
- 重新编译并运行可执行文件。
- 校准缓存将被写入磁盘(
.calibration扩展名),以便在后续模型优化中重复使用。如果希望重新生成校准数据,则必须删除此缓存文件。 - 如果出现“函数 allocate 内存不足”的错误,则需要降低
Options.calibrationBatchSize的值,以确保整个批次能够容纳在 GPU 内存中。
基准测试
基准测试在 RTX 3050 Ti 笔记本 GPU 和第 11 代 Intel(R) Core(TM) i9-11900H @ 2.50GHz 处理器上运行。
| 模型 | 精度 | 批量大小 | 平均推理时间 |
|---|---|---|---|
| yolov8n | FP32 | 1 | 4.732 ms |
| yolov8n | FP16 | 1 | 2.493 ms |
| yolov8n | INT8 | 1 | 2.009 ms |
| yolov8x | FP32 | 1 | 76.63 ms |
| yolov8x | FP16 | 1 | 25.08 ms |
| yolov8x | INT8 | 1 | 11.62 ms |
示例集成
想知道如何将此库集成到您的项目中吗?或者如何读取 YoloV8 模型的输出以提取有意义的信息?如果是这样,请查看我的两个最新项目:YOLOv8-TensorRT-CPP 和 YOLOv9-TensorRT-CPP,它们演示了如何使用 TensorRT C++ API 运行 YoloV8/9 推理(支持目标检测、语义分割和人体姿态估计)。这些项目在后端都使用了本项目!
项目结构
project-root/
├── include/
│ ├── engine/
│ │ ├── EngineRunInference.inl
│ │ ├── EngineUtilities.inl
│ │ └── EngineBuildLoadNetwork.inl
│ ├── util/...
│ ├── ...
├── src/
| ├── ...
│ ├── engine.cpp
│ ├── engine.h
│ └── main.cpp
├── CMakeLists.txt
└── README.md
理解代码
- 大部分实现位于
include/engine目录中。我在代码中添加了大量的注释,应该能帮助您轻松理解代码的工作原理。 - 推理代码位于
include/engine/EngineRunInference.inl。 - 构建和加载 TensorRT 引擎文件的代码位于
include/engine/EngineBuildLoadNetwork.inl。 - 您也可以观看我的深度解析视频,其中我逐行解释了所有代码。
调试方法
- 实现中使用了
spdlog库进行日志记录。可以通过设置环境变量LOG_LEVEL为以下值之一来更改日志级别:trace、debug、info、warn、error、critical或off。 - 如果在从 ONNX 模型创建 TensorRT 引擎文件时遇到问题,可以尝试将环境变量
LOG_LEVEL设置为trace并重新运行应用程序。这将为您提供有关构建过程具体失败位置的更多信息。
表达感谢
如果这个项目对您有所帮助,欢迎您给它点个赞。这将鼓励我保持项目的更新,并快速解决遇到的问题。如果您需要更具体的帮助,我也提供咨询服务。欢迎通过 LinkedIn 与我联系。
贡献者
![]() Loic Tetrel 💻 |
![]() thomaskleiven 💻 |
![]() WiCyn 💻 |
更改日志
V6.0
- 现在实现要求 TensorRT >= 10.0。
V5.0
Engine类已修改为接受一个模板参数,用于指定模型的输出数据类型。现在支持float、__half、int8_t、int32_t、bool和uint8_t类型的输出。- 增加了直接加载 TensorRT 引擎文件的支持,无需从 ONNX 模型编译。然而,强烈建议使用提供的 API 从 ONNX 模型构建引擎文件,而不是直接加载 TensorRT 模型。如果选择直接加载 TensorRT 模型文件,必须手动检查
Options是否已正确设置(例如,如果您的模型是为 FP32 编译的,但您尝试运行 FP16 推理,则会失败,且可能不会给出详细的错误信息)。 - 添加了命令行解析器。
V4.1
- 增加了对固定批大小 > 1 的支持。
V4.0
- 增加了对 INT8 精度的支持。
V3.0
- 实现已更新为使用 TensorRT 8.6 API(例如
IExecutionContext::enqueueV3())。 - 可执行文件已从
driver重命名为run_inference_benchmark,现在必须通过命令行参数传递 ONNX 模型路径。 - 移除了
Options.doesSupportDynamicBatchSize。实现现在会自动检测支持的批大小。 - 移除了
Options.maxWorkspaceSize。实现现在在模型构建过程中不限制 GPU 内存,允许使用尽可能多的内存池来存储中间层数据。
v2.2
- 将模型名称序列化为引擎文件的一部分。
V2.1
- 增加了对多输入模型的支持。现在支持单输入、多输入、单输出、多输出以及批处理的模型。
V2.0
- 需要安装 OpenCV CUDA。安装方法请参考 这里。
- 移除了
Options.optBatchSizes,替换为Options.optBatchSize。 - 支持具有多个输出的模型(例如 SCRFD)。
- 增加了对不支持批处理推理的模型的支持(第一维输入固定)。
- 增加了更多的错误检查。
- 修复了用户在原始 V1.0 版本中经常遇到的一些常见问题。
- 移除了 GPU 设备名称中的空格。
贡献者 ✨
感谢以下各位优秀的贡献者(emoji key):
本项目遵循 all-contributors 规范。欢迎任何形式的贡献!
常见问题
相似工具推荐
openclaw
OpenClaw 是一款专为个人打造的本地化 AI 助手,旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚,能够直接接入你日常使用的各类通讯渠道,包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息,OpenClaw 都能即时响应,甚至支持在 macOS、iOS 和 Android 设备上进行语音交互,并提供实时的画布渲染功能供你操控。 这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地,用户无需依赖云端服务即可享受快速、私密的智能辅助,真正实现了“你的数据,你做主”。其独特的技术亮点在于强大的网关架构,将控制平面与核心助手分离,确保跨平台通信的流畅性与扩展性。 OpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者,以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力(支持 macOS、Linux 及 Windows WSL2),即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你
stable-diffusion-webui
stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。
everything-claude-code
everything-claude-code 是一套专为 AI 编程助手(如 Claude Code、Codex、Cursor 等)打造的高性能优化系统。它不仅仅是一组配置文件,而是一个经过长期实战打磨的完整框架,旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。 通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能,everything-claude-code 能显著提升 AI 在复杂任务中的表现,帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略,使得模型响应更快、成本更低,同时有效防御潜在的攻击向量。 这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库,还是需要 AI 协助进行安全审计与自动化测试,everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目,它融合了多语言支持与丰富的实战钩子(hooks),让 AI 真正成长为懂上
ComfyUI
ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。
gemini-cli
gemini-cli 是一款由谷歌推出的开源 AI 命令行工具,它将强大的 Gemini 大模型能力直接集成到用户的终端环境中。对于习惯在命令行工作的开发者而言,它提供了一条从输入提示词到获取模型响应的最短路径,无需切换窗口即可享受智能辅助。 这款工具主要解决了开发过程中频繁上下文切换的痛点,让用户能在熟悉的终端界面内直接完成代码理解、生成、调试以及自动化运维任务。无论是查询大型代码库、根据草图生成应用,还是执行复杂的 Git 操作,gemini-cli 都能通过自然语言指令高效处理。 它特别适合广大软件工程师、DevOps 人员及技术研究人员使用。其核心亮点包括支持高达 100 万 token 的超长上下文窗口,具备出色的逻辑推理能力;内置 Google 搜索、文件操作及 Shell 命令执行等实用工具;更独特的是,它支持 MCP(模型上下文协议),允许用户灵活扩展自定义集成,连接如图像生成等外部能力。此外,个人谷歌账号即可享受免费的额度支持,且项目基于 Apache 2.0 协议完全开源,是提升终端工作效率的理想助手。
markitdown
MarkItDown 是一款由微软 AutoGen 团队打造的轻量级 Python 工具,专为将各类文件高效转换为 Markdown 格式而设计。它支持 PDF、Word、Excel、PPT、图片(含 OCR)、音频(含语音转录)、HTML 乃至 YouTube 链接等多种格式的解析,能够精准提取文档中的标题、列表、表格和链接等关键结构信息。 在人工智能应用日益普及的今天,大语言模型(LLM)虽擅长处理文本,却难以直接读取复杂的二进制办公文档。MarkItDown 恰好解决了这一痛点,它将非结构化或半结构化的文件转化为模型“原生理解”且 Token 效率极高的 Markdown 格式,成为连接本地文件与 AI 分析 pipeline 的理想桥梁。此外,它还提供了 MCP(模型上下文协议)服务器,可无缝集成到 Claude Desktop 等 LLM 应用中。 这款工具特别适合开发者、数据科学家及 AI 研究人员使用,尤其是那些需要构建文档检索增强生成(RAG)系统、进行批量文本分析或希望让 AI 助手直接“阅读”本地文件的用户。虽然生成的内容也具备一定可读性,但其核心优势在于为机器


