• 文档 >
  • 部署 Torch-TensorRT 程序
快捷方式

部署 Torch-TensorRT 程序

编译并保存 Torch-TensorRT 程序后,不再严格依赖完整的 Torch-TensorRT 库。运行编译后的程序所需的只是运行时。因此,除了在应用程序中附带完整的 Torch-TensorRT 编译器之外,还有几种部署程序的方法。

Torch-TensorRT 包 / libtorchtrt.so

程序编译完成后,使用标准 PyTorch API 运行它。所需的只是在 python 中导入该包或在 C++ 中链接它。

运行时库

C++ 发行版中包含了 libtorchtrt_runtime.so。此库仅包含运行 Torch-TensorRT 程序所需的组件。无需链接 libtorchtrt.so 或导入 torch_tensorrt,您可以将 libtorchtrt_runtime.so 链接到您的部署程序中,或者使用 DL_OPENLD_PRELOAD。对于 python,您可以使用 torch.ops.load_library("libtorchtrt_runtime.so") 加载运行时。然后,您可以继续像通过 PyTorch API 那样使用程序。

注意

如果您在 x86 平台上的 Python 中使用标准的 PyTorch 发行版,您可能需要 libtorchtrt_runtime.so 的 pre-cxx11-abi 变体,请查阅 安装 文档了解更多详情。

注意

如果您正在链接 libtorchtrt_runtime.so,使用以下标志可能会有所帮助 -Wl,--no-as-needed -ltorchtrt -Wl,--as-needed,因为对于大多数 Torch-TensorRT 运行时应用程序来说,与 Torch-TensorRT 运行时中的任何内容都没有直接的符号依赖关系。

此处提供了一个如何使用 libtorchtrt_runtime.so 的示例: https://github.com/pytorch/TensorRT/tree/master/examples/torchtrt_runtime_example

插件库

如果您使用 Torch-TensorRT 作为 TensorRT 引擎的转换器,并且您的引擎使用了 Torch-TensorRT 提供的插件,那么 Torch-TensorRT 会提供库 libtorchtrt_plugins.so,其中包含 Torch-TensorRT 在编译期间使用的 TensorRT 插件的实现。此库可以像其他 TensorRT 插件库一样通过 DL_OPENLD_PRELOAD 加载。

多设备安全模式

多设备安全模式是 Torch-TensorRT 中的一个设置,它允许用户确定运行时是否在每次推理调用之前检查设备一致性。

启用多设备安全模式时,每次推理调用都会产生不可忽略的固定成本,这就是为什么它现在默认禁用的原因。可以通过以下兼作上下文管理器的便捷函数来控制它。

# Enables Multi Device Safe Mode
torch_tensorrt.runtime.set_multi_device_safe_mode(True)

# Disables Multi Device Safe Mode [Default Behavior]
torch_tensorrt.runtime.set_multi_device_safe_mode(False)

# Enables Multi Device Safe Mode, then resets the safe mode to its prior setting
with torch_tensorrt.runtime.set_multi_device_safe_mode(True):
    ...

TensorRT 要求每个引擎都与其被调用的活动线程中的 CUDA 上下文相关联。因此,如果在活动线程中更改设备(这在使用同一 Python 进程在多个 GPU 上调用引擎时可能会发生),安全模式将导致 Torch-TensorRT 显示警报并相应地切换 GPU。如果未启用安全模式,引擎设备与 CUDA 上下文设备之间可能存在不匹配,从而可能导致程序崩溃。

在不同 GPU 上管理多个 TRT 引擎同时又不牺牲多设备安全模式性能的一种技术是使用 Python 线程。每个线程负责单个 GPU 上的所有 TRT 引擎,并且每个线程上的默认 CUDA 设备对应于其负责的 GPU(可以通过 torch.cuda.set_device(...) 设置)。通过这种方式,可以在同一个 Python 脚本中使用多个线程,而无需切换 CUDA 上下文并产生性能开销。

Cudagraphs 模式

Cudagraphs 模式是 Torch-TensorRT 中的一个设置,它允许用户确定运行时是否在某些情况下使用 cudagraphs 来加速推理。

Cudagraphs 可以通过减少内核开销来加速某些模型,更多详情可在此处查阅文档:[here](https://pytorch.ac.cn/blog/accelerating-pytorch-with-cuda-graphs/)。

# Enables Cudagraphs Mode
torch_tensorrt.runtime.set_cudagraphs_mode(True)

# Disables Cudagraphs Mode [Default Behavior]
torch_tensorrt.runtime.set_cudagraphs_mode(False)

# Enables Cudagraphs Mode, then resets the mode to its prior setting
with torch_tensorrt.runtime.enable_cudagraphs(trt_module):
    ...

在当前的实现中,使用新的输入形状(例如在动态形状情况下)将导致 Cudagraph 被重新记录。Cudagraph 记录通常不是延迟密集型的,未来的改进包括为多种输入形状缓存 Cudagraphs。

动态输出分配模式

动态输出分配是 Torch-TensorRT 中的一个功能,它允许动态分配 TensorRT 引擎的输出缓冲区。这对于具有动态输出形状的模型非常有用,特别是具有数据依赖形状的操作。动态输出分配模式不能与 CUDA Graphs 或预分配输出功能同时使用。如果没有动态输出分配,输出缓冲区是根据输入大小推断出的输出形状进行分配的。

在以下两种场景下会启用动态输出分配:

1. 在编译时已确定模型至少有一个 TensorRT 子图需要动态输出分配。这些模型将自动启用(并记录)运行时模式,并且与其他运行时模式(例如 CUDA Graphs)不兼容。

转换器可以使用 requires_output_allocator=True 声明它们生成的子图需要输出分配器,从而强制任何使用该转换器的模型自动使用输出分配器运行时模式。例如,

@dynamo_tensorrt_converter(
    torch.ops.aten.nonzero.default,
    supports_dynamic_shapes=True,
    requires_output_allocator=True,
)
def aten_ops_nonzero(
    ctx: ConversionContext,
    target: Target,
    args: Tuple[Argument, ...],
    kwargs: Dict[str, Argument],
    name: str,
) -> Union[TRTTensor, Sequence[TRTTensor]]:
    ...
  1. 用户可以通过 torch_tensorrt.runtime.enable_output_allocator 上下文管理器手动启用动态输出分配模式。

# Enables Dynamic Output Allocation Mode, then resets the mode to its prior setting
with torch_tensorrt.runtime.enable_output_allocator(trt_module):
    ...

文档

查阅 PyTorch 的全面开发者文档

查看文档

教程

获取面向初学者和高级开发者的深入教程

查看教程

资源

查找开发资源并获得问题解答

查看资源