部署 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_OPEN
或 LD_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_OPEN
或 LD_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 可以通过减少内核开销来加速某些模型,如 [此处](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():
...
在当前实现中,使用新的输入形状(例如,在动态形状情况下)会导致重新记录 cudagraph。Cudagraph 记录通常不会占用太多延迟,未来的改进包括为多个输入形状缓存 cudagraphs。