Triton教程 — 自定义操作
Triton系列教程:
- 快速开始
- 利用Triton部署你自己的模型
- Triton架构
- 模型仓库
- 存储代理
- 模型设置
- 优化
- 动态批处理
- 速率限制器
- 模型管理
自定义操作
Triton 推理服务器部分支持允许自定义操作的建模框架。 自定义操作可以在构建时或启动时添加到 Triton,并可供所有加载的模型使用。
TensorRT
TensorRT 允许用户创建自定义层,然后可以在 TensorRT 模型中使用。 对于要在 Triton 中运行的这些模型,必须提供自定义层。
为了使自定义层可供 Triton 使用,TensorRT 自定义层实现必须编译为一个或多个共享库,然后必须使用 LD_PRELOAD 将这些共享库加载到 Triton 中。 例如,假设您的 TensorRT 自定义层被编译到 libtrtcustom.so 中,使用以下命令启动 Triton 将使这些自定义层可用于所有 TensorRT 模型。
这种方法的一个限制是自定义层必须与模型存储库本身分开管理。 更严重的是,如果多个共享库之间存在自定义层名称冲突,目前还没有办法处理它。
构建自定义层共享库时,使用与 Triton 中使用的 TensorRT 版本相同的版本非常重要。 您可以在 Triton 发行说明中找到 TensorRT 版本。 确保您使用正确版本的 TensorRT 的一个简单方法是使用与 Triton 容器对应的 NGC TensorRT 容器。 例如,如果您使用的是 23.05 版本的 Triton,请使用 23.05 版本的 TensorRT 容器。
TensorFlow
TensorFlow 允许用户添加自定义操作,然后可以在 TensorFlow 模型中使用这些操作。 您可以通过两种方式将自定义 TensorFlow 操作加载到 Triton 中:
-
在模型加载时,通过在模型配置中列出它们。
-
在服务器启动时,通过使用 LD_PRELOAD。
要通过模型配置注册自定义操作库,您可以将其包含为附加字段。 请参阅以下配置示例。
$ model_operations { op_library_filename: "path/to/libtfcustom.so" }
请注意,即使模型是在运行时加载的,多个模型也可以使用自定义运算符。 目前无法取消分配自定义操作符,因此它们将保持可用状态,直至 Triton 关闭。
您还可以通过 LD_PRELOAD 注册您的自定义操作库。 例如,假设您的 TensorFlow 自定义操作被编译到 libtfcustom.so 中,使用以下命令启动 Triton 将使这些操作可用于所有 TensorFlow 模型。
$ LD_PRELOAD=libtfcustom.so:${LD_PRELOAD} tritonserver --model-repository=/tmp/models ...
通过这种方法,所有 TensorFlow 自定义操作都依赖于 TensorFlow 共享库,该库在加载时必须可供自定义共享库使用。 实际上,这意味着在发出上述命令之前,您必须确保 /opt/tritonserver/backends/tensorflow1
或 /opt/tritonserver/backends/tensorflow2
位于库路径上。 有多种方法可以控制库路径,最常见的一种是使用 LD_LIBRARY_PATH。 您可以在“docker run”命令中或容器内设置LD_LIBRARY_PATH。
$ export LD_LIBRARY_PATH=/opt/tritonserver/backends/tensorflow1:$LD_LIBRARY_PATH
这种方法的一个限制是自定义操作必须与模型存储库本身分开管理。 更严重的是,如果多个共享库之间存在自定义层名称冲突,目前还没有办法处理它。
在构建自定义操作共享库时,使用与 Triton 中使用的相同版本的 TensorFlow 非常重要。 您可以在 Triton 发行说明中找到 TensorFlow 版本。 确保您使用正确版本的 TensorFlow 的一种简单方法是使用与 Triton 容器相对应的 NGC TensorFlow 容器。 例如,如果您使用的是 23.05 版本的 Triton,请使用 23.05 版本的 TensorFlow 容器。
PyTorch
Torchscript 允许用户添加自定义操作,然后可以在 Torchscript 模型中使用。 通过使用 LD_PRELOAD,您可以将自定义 C++ 操作加载到 Triton 中。 例如,如果您按照 pytorch/extension-script 存储库中的说明进行操作,并且您的 Torchscript 自定义操作被编译到 libpytcustom.so 中,则使用以下命令启动 Triton 将使这些操作可用于所有 PyTorch 模型。 由于所有 Pytorch 自定义操作都依赖于一个或多个 PyTorch 共享库,这些 PyTorch 共享库在加载时必须可供自定义共享库使用。 实际上,这意味着您必须确保 /opt/tritonserver/backends/pytorch
在启动服务器时位于库路径上。 有多种方法可以控制库路径,最常见的一种是使用 LD_LIBRARY_PATH。
$ LD_LIBRARY_PATH=/opt/tritonserver/backends/pytorch:$LD_LIBRARY_PATH LD_PRELOAD=libpytcustom.so:${LD_PRELOAD} tritonserver --model-repository=/tmp/models ...
这种方法的一个限制是自定义操作必须与模型存储库本身分开管理。 更严重的是,如果多个共享库之间或用于在 PyTorch 中注册它们的句柄之间存在自定义层名称冲突,则当前无法处理它。
从 Triton 20.07 版本开始,TorchVision 操作将包含在 PyTorch 后端中,因此不必将它们显式添加为自定义操作。
在构建自定义操作共享库时,使用与 Triton 中使用的相同版本的 PyTorch 非常重要。 您可以在 Triton 发行说明中找到 PyTorch 版本。 确保您使用正确版本的 PyTorch 的一个简单方法是使用与 Triton 容器对应的 NGC PyTorch 容器。 例如,如果您使用的是 23.05 版本的 Triton,请使用 23.05 版本的 PyTorch 容器。
ONNX
ONNX 运行时允许用户添加自定义操作,然后可以在 ONNX 模型中使用这些操作。 要注册自定义操作库,您需要将其作为附加字段包含在模型配置中。 例如,如果您遵循 microsoft/onnxruntime 存储库中的此示例,并且您的 ONNXRuntime 自定义操作被编译到 libonnxcustom.so 中,则将以下内容添加到您的模型的模型配置中,使这些操作可用于该特定的 ONNX 模型。
$ model_operations { op_library_filename: "/path/to/libonnxcustom.so" }
构建自定义操作共享库时,使用与 Triton 中使用的相同版本的 ONNXRuntime 非常重要。 您可以在 Triton 发行说明中找到 ONNXRuntime 版本。