2.1。用c++实例化TensorRT对象
为了运行推理,您需要使用IExecutionContext对象。为了创建IExecutionContext类型的对象,首先需要创建ICudaEngine(引擎)类型的对象。
引擎可以通过以下两种方式创建:
引擎可以通过两种方式创建: 第一种是通过用户模型中(包含)的网络定义。在这种情况下,引擎还能可选的被串行化保存下来,用于以后的使用。
第二种则是通过读取存盘后的串行化的引擎数据.。在这种情况下,性能更好,因为解析模型和创建中间对象的步骤被省略了。
需要全局创建ILogger类型的对象。它被用作TensorRT API的各种方法的参数。下面是一个演示如何创建日志程序的简单示例:
class Logger : public ILogger
{
void log(Severity severity, const char* msg) override
{
// suppress info-level messages
if (severity != Severity::kINFO)
std::cout << msg << std::endl;
}
} gLogger;
使用全局TensorRT API方法createInferBuilder(gLogger)创建IBuilder类型的对象,如图5所示。

图5。使用iLogger作为输入参数创建IBuilder
为iBuilder定义的createNetwork方法用于创建iNetworkDefinition类型的对象,如图6所示。

图6。createNetwork()用于创建网络
使用INetwork定义作为输入创建一个可用的解析器(Caffe、ONNX或UFF):
ONNX: auto parser = nvonnxparser::createParser(*network, gLogger);
Caffe: auto parser = nvcaffeparser1::createCaffeParser();
UFF: auto parser = nvuffparser::createUffParser();
从类型为iParser的对象中调用一个名为parse()的方法来读取模型文件并填充图7中的TensorRT网络。

图7。解析模型文件解析模型文件
调用IBuilder的buildCudaEngine()方法创建ICudaEngine类型的对象,如图8所示:

图8。创建TensorRT引擎
可以选择序列化引擎并将其转储到文件中。

图9。创建TensorRT引擎——序列化TensorRT引擎
执行上下文用于执行推理。

图10。创建执行上下文
如果将序列化引擎保存并保存到文件中,则可以跳过上面描述的大部分步骤。
而IRuntime类型的对象,则是通过全局TensorRT API函数调用createInferRuntime(gLogger),来建立的,如图11所示:

图11。创建TensorRT运行时
有关TensorRT运行时的更多信息,请参见IRuntime类引用。
通过runtime函数deserializeCudaEngine()来建立引擎...
创建Builder和Runtime对象的时候,将使用当前(creating)线程中所关联的GPU上的CUDA Context。如果当前线程没有建立过CUDA Contet,则会默认自动创建一个。但推荐在创建runtime或者builder对象前,手工建立和配置好CUDA Context,(而不是依赖于自动创建的)。