License

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 分配的总内存量的可用选项

  1. 您可以使用 gpu-memory-fraction,如此处所述。这限制了 TensorFlow 可以为进程分配的总内存的上限。但是,请注意,当使用此选项时,allow-growth 设置为 false,因此如果 TF 需要为其执行分配比允许的更多的内存,则运行 TF 模型仍然可能失败。

  2. 为了限制并发 TensorFlow 执行中内存的大幅增长,您还可以使用 Triton 中的速率限制器来限制允许进入执行的请求数量。

自动完成模型配置#

假设 Triton 启动时没有使用 --disable-auto-complete-config 命令行选项,TensorFlow 后端利用 TensorFlow SavedModel 中可用的元数据来填充模型 config.pbtxt 中的必需字段。您可以从此处了解有关 Triton 对自动完成模型配置的支持的更多信息。

但是,在 Graphdef 格式中,模型不携带足够的元数据,因此 Triton 无法为它们生成模型配置。因此,必须为这些模型显式提供 config.pbtxt。

TensorFlow 后端可以完成模型配置中的以下字段

max_batch_size#

自动完成 max_batch_size 遵循以下规则

  1. 自动完成功能已确定该模型能够批量处理请求。

  2. 模型配置中的 max_batch_size 为 0,或者模型配置中省略了 max_batch_size。

如果满足以上两个规则,则 max_batch_size 设置为 default-max-batch-size。否则,max_batch_size 设置为 0。

输入和输出#

如果模型中提供了 namedata_typedims 信息,则 TensorFlow 后端能够填充这些信息。已知的限制是在ragged_batchingsequence_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:要使用的图的标签。请参阅此处的 protobuf

  • TF_SIGNATURE_DEF:要使用的签名定义。请参阅此处的 protobuf

  • MAX_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"
  }
}

重要提示#

  • 我们已经观察到使用 SavedModel 格式在模型加载和卸载期间存在内存增长问题。这可能不是实际的内存泄漏,而是系统 malloc 启发式方法的结果,导致内存不会立即释放回操作系统。我们注意到,通过将默认的 malloc 库替换为 tcmallocjemalloc,内存占用得到了改善。有关如何在 Triton 中使用 tcmalloc 或 jemalloc 的说明,请参阅文档