TensorFlow 后端#
用于 TensorFlow 的 Triton 后端。您可以在后端仓库中了解有关后端的更多信息。在主 Triton 问题页面中提问或报告问题。
常见问题解答#
完整的文档包含在下面,但这些快捷方式可以帮助您朝着正确的方向开始。
在哪里可以询问有关 Triton 和 Triton 后端的一般问题?#
请务必阅读下面的所有信息以及主服务器仓库中提供的通用 Triton 文档。如果您在那里找不到答案,可以在主 Triton 问题页面上提问。
此后端支持哪些 TensorFlow 版本?#
从 23.04 开始,TensorFlow 后端仅支持 TensorFlow 2.x。您可以通过查看发行说明找到任何版本支持的特定版本,发行说明可从主服务器仓库获得。
TensorFlow 后端是否可配置?#
每个模型的配置都可以启用TensorFlow 特定的优化。还有一些命令行选项可用于在启动 Triton 时配置后端。
如何构建 TensorFlow 后端?#
请参阅下面的构建说明。
构建后端时,我可以使用任何版本的 TensorFlow 吗?#
目前,您必须使用来自 NGC 的 TensorFlow 版本。请参阅下面的自定义 TensorFlow 构建说明。
TensorFlow 后端如何管理 GPU 内存?#
TensorFlow 后端在 Triton 进程退出之前不会“释放” GPU 内存。TensorFlow 使用池分配器,因此它会保留它分配的任何内存,直到它自己的进程退出。如果您加载另一个 TensorFlow 模型,它将重用该内存,但即使它不再使用它,也不会将其返回给系统。因此,如果您要重复加载/卸载 TensorFlow 模型,最好将它们分组在同一个 Triton 进程上。
来自 TensorFlow GPU 文档:“内存不会被释放,因为它可能导致内存碎片”。
解决方法#
以下是一些可用于限制 TensorFlow 分配的总内存量的可用选项
自动完成模型配置#
假设 Triton 启动时没有使用 --disable-auto-complete-config
命令行选项,TensorFlow 后端利用 TensorFlow SavedModel 中可用的元数据来填充模型 config.pbtxt 中的必需字段。您可以从此处了解有关 Triton 对自动完成模型配置的支持的更多信息。
但是,在 Graphdef 格式中,模型不携带足够的元数据,因此 Triton 无法为它们生成模型配置。因此,必须为这些模型显式提供 config.pbtxt。
TensorFlow 后端可以完成模型配置中的以下字段
max_batch_size#
自动完成 max_batch_size 遵循以下规则
自动完成功能已确定该模型能够批量处理请求。
模型配置中的 max_batch_size 为 0,或者模型配置中省略了 max_batch_size。
如果满足以上两个规则,则 max_batch_size 设置为 default-max-batch-size。否则,max_batch_size 设置为 0。
输入和输出#
如果模型中提供了 name
、data_type
和 dims
信息,则 TensorFlow 后端能够填充这些信息。已知的限制是在ragged_batching
和sequence_batching
字段中定义的输入。模型中没有足够的信息供后端能够自动完成这些。此外,后端无法自动完成标量张量的配置。
自动完成输出遵循以下规则
如果模型配置中的
outputs
为空或未定义,则将自动完成 savedmodel 中的所有输出如果在
outputs
中定义了一个或多个输出,则将自动完成已定义的输出,而忽略省略的输出。
动态批处理#
如果 max_batch_size > 1 且未提供调度器,则将使用默认设置启用动态批处理调度器。
命令行选项#
命令行选项配置 TensorFlow 后端的属性,然后将其应用于使用该后端的所有模型。
–backend-config=tensorflow,allow-soft-placement=<boolean>#
指示 TensorFlow 在 GPU 实现不可用时使用操作的 CPU 实现。
–backend-config=tensorflow,gpu-memory-fraction=<float>#
为 TensorFlow 模型保留一部分 GPU 内存。默认值 0.0 表示 TensorFlow 应根据需要动态分配内存。值 1.0 表示 TensorFlow 应分配所有 GPU 内存。
–backend-config=tensorflow,version=<int>#
选择要使用的 TensorFlow 库的版本。默认版本为 2。请注意,从 23.04 版本开始,TensorFlow 后端仅支持 TensorFlow 2。如果您想在 23.04 之前的 Triton 版本中使用 TensorFlow 1,可以使用此命令行选项将版本指定为 1。
–backend-config=tensorflow,default-max-batch-size=<int>#
在自动完成模型配置期间,当在模型中检测到批处理支持时,用于 max_batch_size 的默认值。请注意,如果未显式提供,则此选项的默认值为 4。
构建 TensorFlow 后端#
使用最新的 cmake 进行构建。首先安装所需的依赖项。
$ apt-get install rapidjson-dev python3-pip
$ pip3 install patchelf==0.17.2
后端可以构建为支持 TensorFlow 2.x。从 23.04 开始,Triton 不再支持 TensorFlow 1.x,并且专门使用 TensorFlow 2.x。必须使用来自 NGC 的适当 TensorFlow 容器。例如,要构建使用来自 NGC 的 TensorFlow 2.x 容器 23.04 版本的后端
$ mkdir build
$ cd build
$ cmake -DCMAKE_INSTALL_PREFIX:PATH=`pwd`/install -DTRITON_TENSORFLOW_DOCKER_IMAGE="nvcr.io/nvidia/tensorflow:23.04-tf2-py3" ..
$ make install
以下必需的 Triton 仓库将被拉取并在构建中使用。默认情况下,“main”分支/标签将用于每个仓库,但可以使用列出的 CMake 参数来覆盖。
triton-inference-server/backend: -DTRITON_BACKEND_REPO_TAG=[tag]
triton-inference-server/core: -DTRITON_CORE_REPO_TAG=[tag]
triton-inference-server/common: -DTRITON_COMMON_REPO_TAG=[tag]
使用自定义 TensorFlow 构建 TensorFlow 后端#
目前,Triton 要求 TensorFlow 后端使用特殊修补版本的 TensorFlow。这些 TensorFlow 版本的完整源代码可以从 NGC 以 Docker 镜像的形式获得。例如,与 Triton 23.04 版本兼容的 TensorFlow 2.x 版本可以作为 nvcr.io/nvidia/tensorflow:23.04-tf2-py3 提供。
您可以在这些镜像中修改和重建 TensorFlow,以生成 Triton TensorFlow 后端所需的共享库。在 TensorFlow 2.x 容器中,您可以使用以下命令重建:
$ /opt/tensorflow/nvbuild.sh
在容器内重建后,您应该将更新后的容器另存为新的 Docker 镜像(例如,通过使用 *docker commit*),然后按照上面的描述构建后端,并将 TRITON_TENSORFLOW_DOCKER_IMAGE 设置为指向新的 Docker 镜像。
使用 TensorFlow 后端#
平台#
TensorFlow 识别两种模型格式:GraphDef 和 SavedModel。为了区分模型格式,请在模型的 config.pbtxt
文件中指定适当的 platform
,例如
# config.pbtxt for Graphdef format
...
platform: "tensorflow_graphdef"
...
或
# config.pbtxt for SavedModel format
...
platform: "tensorflow_savedmodel"
...
参数#
模型的 TensorFlow 配置通过模型的 config.pbtxt
文件的 Parameters 部分完成。参数及其描述如下。
TF_NUM_INTRA_THREADS
:用于并行化单个操作执行的线程数。默认情况下自动配置。请参阅此处的 protobuf。应为非负数。TF_NUM_INTER_THREADS
:控制可以同时执行的运算符的数量。默认情况下自动配置。请参阅此处的 protobuf。TF_USE_PER_SESSION_THREADS
:布尔值,用于查看是否使用每个会话线程。“True”、“On”和“1”被接受为 true。TF_GRAPH_TAG
:要使用的图的标签。请参阅此处的 protobufTF_SIGNATURE_DEF
:要使用的签名定义。请参阅此处的 protobufMAX_SESSION_SHARE_COUNT
:此参数指定可以共享TF 会话的模型实例的最大数量。默认值为 1,这意味着 Triton 将为每个模型实例创建一个单独的 TF 会话。如果此参数设置为实例总数,则 Triton 将仅创建一个 TF 会话,该会话将由所有实例共享。在模型实例之间共享 TF 会话可以减少加载和执行模型的内存占用。TF_INIT_OPS_FILE
:此参数指定 JSON 格式的文件名,该文件包含初始化操作。JSON 文件必须具有名为“init_ops”的单个元素,该元素描述初始化操作的列表。此文件可以存储在模型版本文件夹或模型目录中。如果在这两个位置都提供,则模型版本文件夹优先于模型文件夹中提供的文件夹。如果在模型版本文件夹中提供,则目录结构应如下所示
|-- 1
| |-- model.graphdef
| `-- init_ops.json
`-- config.pbtxt
以下是 init_ops.json
文件内容的示例。
{
"init_ops": ["init"]
}
模型配置文件中指定这些参数的部分将如下所示
parameters: {
key: "TF_NUM_INTRA_THREADS"
value: {
string_value:"2"
}
}
parameters: {
key: "TF_USE_PER_SESSION_THREADS"
value: {
string_value:"yes"
}
}
parameters: {
key: "TF_GRAPH_TAG"
value: {
string_value: "serve1"
}
}
parameters: {
key: "TF_INIT_OPS_FILE"
value: {
string_value: "init_ops.json"
}
}
parameters: {
key: "TF_SIGNATURE_DEF"
value: {
string_value: "serving2"
}
}