快捷方式

运行时阶段

运行时阶段负责构建包含嵌入式 TensorRT 引擎的独立 TorchScript 图,并在调用这些引擎时作为运行时。主接口接受序列化的 TensorRT 引擎。执行阶段会反序列化并将此引擎封装在一个类中,该类为每个引擎维护一个执行上下文以及关于其输入和输出的一些元数据,并且与 TorchScript 解释器兼容,以便它可以像其他 TorchScript IValues 一样被移动和使用。通过将引擎及其输入提供给 tensorrt::execute_engine 操作符来运行引擎,该操作符将获取引擎及其输入并返回引擎执行的结果。

背景

PyTorch JIT 的运行时是围绕堆栈机构建的,所有操作符都从堆栈中弹出参数,将它们传递给某些操作符实现,然后将结果推回堆栈。堆栈的实际元素是 torch::jit::IValues,这与我们在转换阶段(抽象的 torch::jit::Value 类型的实现)评估的类型相同。

TensorRT 引擎执行器 Op

当加载 Torch-TensorRT 时,它会在 PyTorch JIT 操作符库中注册一个名为 trt::execute_engine(Tensor[] inputs, __torch__.torch.classes.tensorrt.Engine engine) -> Tensor[] 的操作符,该操作符接受一个已实例化的引擎和一组输入。编译后的图会将此引擎存储在属性中,使其具有可移植性和可序列化性。当调用该 op 时,会从运行时堆栈中弹出已实例化的引擎和输入张量。这些输入被传递给一个通用的引擎执行函数,该函数将张量通过 TensorRT 引擎运行,并返回新的张量作为结果。这些张量被推到堆栈上,以便下一个操作符(无论是什么)都可以使用它们。

构建结果图

一旦引擎被反序列化并实例化,编译器就会构建一个图,该图将在调用模块时执行引擎。例如:

graph(%self_1 : __torch__.torchvision.models.resnet.___torch_mangle_4847.ResNet_trt,
  %input_0 : Tensor):
    %1 : __torch__.torch.classes.tensorrt.Engine = prim::GetAttr[name="__torch___torchvision_models_resnet____torch_mangle_4847_ResNet_trt_engine"](%self_1)
    %3 : Tensor[] = prim::ListConstruct(%input_0)
    %4 : Tensor[] = trt::execute_engine(%3, %1)
    %5 : Tensor = prim::ListUnpack(%4)
return (%5)

您可以在图中看到引擎属性以及 trt::execute_engine op,它接收输入张量列表和引擎,并产生一个输出张量列表,然后返回。当对模块调用 `forward` 时,该图将被执行,从而运行 TensorRT 引擎。

如果存在多个输出,编译后的图可能会将输出张量重新打包成一个元组(Tuple)返回给用户。

graph(%self_1 : __torch__.PyTorch.Detection.SSD.src.model.SSD300_trt,
  %input_0 : Tensor):
    %1 : __torch__.torch.classes.tensorrt.Engine = prim::GetAttr[name="__torch___PyTorch_Detection_SSD_src_model_SSD300_trt_engine"](%self_1)
    %3 : Tensor[] = prim::ListConstruct(%input_0)
    %4 : Tensor[] = trt::execute_engine(%3, %1)
    %5 : Tensor, %6 : Tensor = prim::ListUnpack(%4)
    %7 : (Tensor, Tensor) = prim::TupleConstruct(%5, %6)
return (%7)

序列化和反序列化

嵌入在 TorchScript 图中的 TensorRT 引擎的序列化和反序列化由引擎的持有类和 TorchBind 处理。当保存 TorchScript 模块时,pickler 会对 cuda 引擎运行序列化,并将序列化后的引擎存储在创建的 zip 文件中。在反序列化时,depickler 会调用引擎持有类的构造函数,并传入序列化后的引擎,以便再次设置它以供执行。

ABI 版本和序列化格式

Torch-TensorRT 程序是标准的 TorchScript,TensorRT 引擎作为对象嵌入在图中。因此,TensorRT 引擎存在序列化格式。Torch-TensorRT 序列化程序的格式具有一个“ABI”版本,该版本告知运行时关于运行时兼容性的信息。

> 当前 ABI 版本是 3

格式是序列化字符串的向量。它们编码以下信息:

  • 程序的 ABI 版本

  • TRT 引擎的名称

  • 设备信息:包括引擎构建的目标设备、SM 能力和其他设备信息。此信息在反序列化时用于选择正确的设备来运行引擎。

  • 序列化的 TensorRT 引擎

文档

访问全面的 PyTorch 开发者文档

查看文档

教程

为初学者和高级开发者提供深入的教程

查看教程

资源

查找开发资源并让您的问题得到解答

查看资源