用途:从磁盘加载序列化 TensorRT 引擎,用 C++ 现代 Runtime API 执行推理,产出可直接放在 .plan/.engine 旁的极简部署框架。
适用:已有引擎需从 C++ 运行;需 enqueueV3 + setTensorAddress 最小框架;需经 std::istream 或 IStreamReaderV2 加载大文件;需在推理前为动态形状调用 setInputShape。不适用:构建/优化引擎(用 trtexec 或 IBuilder)、Python 部署、编写插件(IPluginV3)、多 GPU/MPS/MIG 编排。
前提:已安装 TensorRT(NvInferRuntime.h 与 libnvinfer.so 在路径中)、CUDA 工具链(nvcc 版本与引擎构建版本一致)、一个同 TRT 大版本与同 GPU 架构构建的引擎、引擎 I/O 张量名、C++17 编译器。
主要步骤:1) createInferRuntime 创建 IRuntime,须长于其创建的引擎,且自定义 Logger 为必需并保持进程级生命周期;2) 小中型引擎(<约 1 GiB)读入 std::vector<char> 后 deserializeCudaEngine(blob, size);3) 大引擎或流式来源实现 IStreamReaderV2(v1 在 TRT 11.0 已废弃),实现 read/seek;4) 创建 ICudaEngine 与 IExecutionContext,引擎只读查询线程安全,每个推理线程单独分配上下文;5) 用 getNbIOTensors/getIOTensorName 枚举,getTensorIOMode、getTensorDataType、getTensorShape 分配缓冲,enqueueV3 前必须为每个张量 setTensorAddress,动态输入先 setInputShape 再查询输出形状;6) 仅使用 enqueueV3(stream),配合同一流上的 cudaMemcpyAsync 与 cudaStreamSynchronize;7) 按 context→engine→runtime 逆序销毁,显式释放 cudaMalloc 内存并销毁流。
构建:g++ -std=c++17 runtime.cpp -o run -lnvinfer -lcudart(按需调整 include 与 lib 路径),运行 ./run model.plan。可用 trtexec --loadEngine=model.plan --verbose 查看输入输出名。
常见问题:引擎 TRT 大版本或 SM 不匹配导致反序列化失败;遗漏 setTensorAddress 或 setInputShape 使 enqueueV3 返回 false;主机缓冲与引擎张量元素数/类型不符引发 cudaErrorIllegalAddress;销毁顺序错误导致崩溃。注意:每个线程一个上下文;传给 enqueueV3 的流须在推理完成前存活;引擎与 TRT 大版本、GPU SM、CUDA 大版本绑定;传给 createInferRuntime 的 logger 须长于 runtime。refit 或权重流式场景需额外调用,本文未涵盖。