部署 Torch-TensorRT 程序¶
在编译和保存Torch-TensorRT程序后,不再严格依赖完整的Torch-TensorRT库。运行编译程序所需的只是运行时。因此,除了将完整的Torch-TensorRT编译器与应用程序一起分发外,还有其他几种部署程序的选择。
Torch-TensorRT 包 / libtorchtrt.so¶
一旦程序被编译,你就可以使用标准的PyTorch API来运行它。唯一的要求是必须在Python中导入包或在C++中链接包。
运行时库¶
与C++发行版一起分发的是libtorchtrt_runtime.so。这个库只包含运行Torch-TensorRT程序所需的组件。在您的部署程序中,您可以链接libtorchtrt_runtime.so,而不是链接libtorchtrt.so或导入torch_tensorrt,或者使用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.org/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记录通常不会对延迟产生重大影响,未来的改进包括为多个输入形状缓存cudagraph。