构建 Triton#

本节介绍如何从源代码构建 Triton 服务器。有关构建 Triton 客户端库和示例的信息,请参阅 客户端库和示例。有关构建 Triton SDK 容器的信息,请参阅 构建 SDK 镜像。有关测试您的 Triton 构建的信息,请参阅 测试 Triton

您可以创建一个自定义的 Triton Docker 镜像,其中包含已发布后端的子集,而无需从源代码构建。例如,您可能需要一个仅包含 TensorRT 和 Python 后端的 Triton 镜像。对于这种类型的自定义,您无需从源代码构建 Triton,而是可以使用 compose 实用程序

Triton 源代码分布在多个 GitHub 仓库中,这些仓库可以一起构建和安装,以创建一个完整的 Triton 安装。Triton 服务器使用 CMake 和(可选)Docker 构建。为了简化构建过程,Triton 提供了一个 build.py 脚本。build.py 脚本将生成构建 Triton 所需的 CMake 和 Docker 构建步骤,并且可以选择调用这些步骤,或者将调用留给您,如下所述。

build.py 脚本当前支持为以下平台构建 Triton。如果您尝试在未在此处列出的平台上构建 Triton,请参阅 在不支持的平台上构建

如果您正在开发或调试 Triton,请参阅 开发和增量构建,以获取有关如何执行增量构建的信息。

为 Ubuntu 22.04 构建#

对于 Ubuntu-22.04,build.py 同时支持 Docker 构建和非 Docker 构建。

使用 Docker 构建#

构建 Triton 最简单的方法是使用 Docker。构建结果将是一个名为 tritonserver 的 Docker 镜像,其中包含 /opt/tritonserver/bin 中的 tritonserver 可执行文件和 /opt/tritonserver/lib 中的必需共享库。为 Triton 构建的后端和仓库代理将分别位于 /opt/tritonserver/backends 和 /opt/tritonserver/repoagents 中。

构建的第一步是克隆您感兴趣构建的版本的 triton-inference-server/server 仓库分支(或从开发分支构建的 main 分支)。然后按照下述运行 build.py。当使用 Docker 构建时,build.py 脚本会执行这些步骤。

  • 在服务器仓库的 build 子目录中,生成 docker_build 脚本、cmake_build 脚本和构建 Triton 所需的 Dockerfile。如果您使用 –dryrun 标志,build.py 将在此处停止,以便您可以检查这些文件。

  • 运行 docker_build 脚本以执行基于 Docker 的构建。docker_build 脚本执行以下步骤。

    • 构建 tritonserver_buildbase Docker 镜像,该镜像收集构建 Triton 所需的所有构建依赖项。tritonserver_buildbase 镜像基于最小/基础镜像。当使用 GPU 支持构建(–enable-gpu)时,min 镜像是从 NGC 拉取的 <xx.yy>-py3-min 镜像,其中包含构建 Triton 所需的 CUDA、cuDNN、TensorRT 和其他依赖项。当不使用 GPU 支持构建时,min 镜像为标准 ubuntu:22.04 镜像。

    • tritonserver_buildbase 镜像中运行 cmake_build 脚本以实际构建 Triton。cmake_build 脚本执行以下步骤。

    • 将构建的工件从容器复制到主机系统上的 build 子目录中。

    • 创建最终的 tritonserver Docker 镜像,其中包含来自构建的库、可执行文件和其他工件。

    • 创建一个 tritonserver_cibase Docker 镜像,其中包含测试所需的 QA 工件,如 测试 Triton 中所述。

默认情况下,build.py 不启用 Triton 的任何可选功能,但您可以使用 –enable-all 标志启用所有功能、后端和仓库代理。-v 标志启用详细输出。

$ ./build.py -v --enable-all

如果您只想启用某些 Triton 功能、后端和仓库代理,请不要指定 –enable-all。而是您必须指定 –help 文档中记录的各个标志。

使用特定 GitHub 分支构建#

如上所述,构建在服务器仓库中执行,但在构建过程中会从其他几个仓库中获取源代码。通常,您无需指定有关这些其他仓库的任何内容,但是如果您想控制在这些其他仓库中使用哪个分支,您可以按照以下示例所示进行操作。

$ ./build.py ... --repo-tag=common:<container tag> --repo-tag=core:<container tag> --repo-tag=backend:<container tag> --repo-tag=thirdparty:<container tag> ... --backend=tensorrt:<container tag> ... --repoagent=checksum:<container tag> ...

如果您在发布分支上构建,则 <container tag> 将默认为分支名称。例如,如果您在 r24.12 分支上构建,则 <container tag> 将默认为 r24.12。如果您在任何其他分支(包括 main 分支)上构建,则 <container tag> 将默认为 “main”。因此,您通常不需要提供 <container tag>(也不需要前面的冒号)。您可以为组件使用不同的 <container tag>,以便在构建中使用相应的分支/标签。例如,如果您在 onnxruntime_backend 仓库中有一个名为 “mybranch” 的分支,您想在构建中使用它,您可以指定 –backend=onnxruntime:mybranch。

仅 CPU 构建#

如果您想在不使用 GPU 支持的情况下构建,则必须指定各个功能标志,并且不包括 --enable-gpu--enable-gpu-metrics 标志。以下后端仅适用于非 GPU / 仅 CPU 构建:identityrepeatensemblesquaretensorflow2pytorchonnxruntimeopenvinopythonfil

要在仅 CPU 构建中包含 TensorFlow2 后端,您必须向 build.py 提供此附加标志:--extra-backend-cmake-arg=tensorflow2:TRITON_TENSORFLOW_INSTALL_EXTRA_DEPS=ON

TensorFlow 和 PyTorch 后端的仅 CPU 构建需要一些 CUDA 存根和运行时依赖项,这些依赖项在仅 CPU 的基础容器中不存在。这些是从 GPU 基础容器中检索的,可以使用 --image=gpu-base,nvcr.io/nvidia/tritonserver:<xx.yy>-py3-min 标志更改。

不使用 Docker 构建#

要在不使用 Docker 的情况下构建 Triton,您必须安装在使用 Docker 构建时自动处理的构建依赖项。

构建的第一步是克隆您感兴趣构建的版本的 triton-inference-server/server 仓库分支(或从开发分支构建的 main 分支)。

要确定构建所需的依赖项,请使用 –dryrun 标志运行 build.py,然后在 build 子目录中查看 Dockerfile.buildbase。

$ ./build.py -v --enable-all

从 Dockerfile.buildbase 中,您可以看到需要在主机系统上安装哪些依赖项。请注意,当使用 –enable-gpu(或 –enable-all)构建时,Dockerfile.buildbase 依赖于从 NGC 拉取的 <xx.yy>-py3-min 镜像。不幸的是,目前没有 <xx.yy>-py3-min 镜像的 Dockerfile。相反,您必须手动安装 CUDA 和 cuDNN 以及 TensorRT 依赖项,如下所述。

在构建系统上安装这些依赖项后,您可以使用带有 –no-container-build 标志的 build.py 来构建 Triton。

$ ./build.py -v --no-container-build --build-dir=`pwd`/build --enable-all

有关如何使用 cmake_build 脚本执行构建的更多详细信息,请参阅 使用 Docker 构建

CUDA, cuBLAS, cuDNN#

为了使 Triton 支持 NVIDIA GPU,您必须安装 CUDA、cuBLAS 和 cuDNN。这些库必须安装在系统 include 和 library 路径中,以便它们可用于构建。给定版本使用的库版本可以在 框架容器支持矩阵 中找到。

对于给定的 Triton 版本,您可以尝试使用不受支持的库版本进行构建,但您可能会遇到构建或执行问题,因为不受支持的版本未经测试。

TensorRT#

TensorRT 头文件和库必须安装在系统 include 和 library 路径中,以便它们可用于构建。给定版本中使用的 TensorRT 版本可以在 框架容器支持矩阵 中找到。

对于给定的 Triton 版本,您可以尝试使用不受支持的 TensorRT 版本进行构建,但您可能会遇到构建或执行问题,因为不受支持的版本未经测试。

为 JetPack 4.x 构建#

正在建设中

为 Windows 10 构建#

对于 Windows 10,build.py 以类似于 Ubuntu 中描述的方式支持 Docker 构建和非 Docker 构建。主要区别在于,用作 Dockerfile.buildbase 镜像基础的最小/基础镜像可以从提供的 Dockerfile.win10.min 文件构建,如 Windows 10 “Min” 镜像 中所述。运行 build.py 时,使用 –image 标志指定您分配给此镜像的标签。例如,–image=base,win10-py3-min。

Windows 和 Docker#

根据您的 Windows 10 版本和 Docker 版本,您可能需要在执行以下任何步骤之前执行这些附加步骤。

  • 将您的 Docker 设置为与 “Windows 容器” 一起工作。右键单击右下角状态区域中的鲸鱼图标,然后选择 “切换到 Windows 容器”。

Windows 10 “Min” 镜像#

“min” 容器描述了执行 Windows 构建所需的基础依赖项。Windows min 容器是 Dockerfile.win10.min

在构建 min 容器之前,您必须下载适当的 cuDNN 和 TensorRT 版本,并将它们放置在与 Dockerfile.win10.min 相同的目录中。

  • 对于 cuDNN,Dockerfile.win10.min 中定义的 CUDNN_VERSION 和 CUDNN_ZIP 参数指示您应从 https://developer.nvidia.com/rdp/cudnn-download 下载的 cuDNN 版本。

  • 对于 TensorRT,Dockerfile.win10.min 中定义的 TENSORRT_VERSION 和 TENSORRT_ZIP 参数指示您应从 https://developer.nvidia.com/nvidia-tensorrt-download 下载的 TensorRT 版本。

下载 cuDNN 和 TensorRT 的 zip 文件后,您可以使用以下命令构建 min 容器。

$ docker build -t win10-py3-min -f Dockerfile.win10.min .

构建 Triton 服务器#

Triton 是使用 build.py 脚本构建的。构建系统必须安装 Docker、Python3(以及 pip 安装的 docker 模块)和 git,以便它可以执行 build.py 并执行 docker 构建。默认情况下,build.py 不启用 Triton 的任何可选功能,因此您必须显式启用它们。以下 build.py 调用构建 Windows 上可用的所有功能和后端。

python build.py --cmake-dir=<path/to/repo>/build --build-dir=/tmp/citritonbuild --no-container-pull --image=base,win10-py3-min --enable-logging --enable-stats --enable-tracing --enable-gpu --endpoint=grpc --endpoint=http --repo-tag=common:<container tag> --repo-tag=core:<container tag> --repo-tag=backend:<container tag> --repo-tag=thirdparty:<container tag> --backend=ensemble --backend=tensorrt:<container tag> --backend=onnxruntime:<container tag> --backend=openvino:<container tag> --backend=python:<container tag>

如果您在 main 分支上构建,则 <container tag> 将默认为 “main”。如果您在发布分支上构建,则 <container tag> 将默认为分支名称。例如,如果您在 r24.12 分支上构建,则 <container tag> 将默认为 r24.12。因此,您通常不需要提供 <container tag>(也不需要前面的冒号)。您可以为组件使用不同的 <container tag>,以便在构建中使用相应的分支/标签。例如,如果您在 onnxruntime_backend 仓库中有一个名为 “mybranch” 的分支,您想在构建中使用它,您可以指定 –backend=onnxruntime:mybranch。

提取构建工件#

当 build.py 完成时,一个名为 tritonserver 的 Docker 镜像将包含构建的 Triton 服务器可执行文件、库和其他工件。Windows 容器不支持 GPU 访问,因此您可能需要从 tritonserver 镜像中提取必要的文件,并在您的主机系统上直接运行它们。所有 Triton 工件都可以在 tritonserver 镜像的 /opt/tritonserver 目录中找到。您的主机系统将需要安装用于构建的 CUDA、cuDNN、TensorRT 和其他依赖项。

在不支持的平台上构建#

为不受支持的操作系统和/或硬件平台构建是可能的。所有构建脚本、Dockerfile 和 CMake 调用都包含在公共仓库中,或者由 build.py 生成,如 使用 Docker 构建 中所述。从这些文件中,您可以找到所需的依赖项和 CMake 调用。但是,由于编译器、库、包管理等方面的差异,您可能必须在构建脚本、Dockerfile、CMake 文件和源代码中进行更改。

要查看下面引用的生成的构建脚本和 Dockerfile,请使用

$ ./build.py -v --enable-all --dryrun

您应该通过阅读上述文档来熟悉受支持平台的构建过程,然后按照与您感兴趣的平台最匹配的受支持平台的流程进行操作(例如,如果您尝试为 RHEL/x86-64 构建,则按照 为 Ubuntu 22.04 构建 流程进行操作)。您可能需要在以下区域进行更改,然后手动运行 docker_build 和 cmake_build 或等效命令来执行构建。

  • 生成的 Dockerfile 使用特定于平台的打包工具安装构建的依赖项,例如,Ubuntu 的 apt-get。您需要更改 build.py 以使用适合您平台的打包工具。

  • 您的平台的包和库名称可能与生成的 Dockerfile 使用的名称不同。您需要找到平台上相应的包和库。

  • 您的平台可能使用与支持平台不同的编译器或编译器版本。因此,您可能会遇到构建错误,需要通过编辑源代码或更改编译标志来修复。

  • Triton 依赖于大量它从源代码构建的开源软件包。如果其中一个软件包不支持您的平台,则您可能需要禁用依赖于该软件包的 Triton 功能。例如,Triton 通过构建 aws-sdk-cpp 软件包来支持 S3 文件系统。如果 aws-sdk-cpp 无法为您的平台构建,那么您可以通过在运行 build.py 时不指定 –filesystem=s3 来消除对该软件包的需求。一般来说,您应该首先使用最少所需的功能集运行 build.py。

  • TensorFlow 后端从 TensorFlow NGC 容器中提取预构建的共享库,作为构建的一部分。此容器仅适用于 Ubuntu-22.04 / x86-64,因此如果您的平台需要 TensorFlow 后端,您将需要下载 TensorFlow 容器并修改其构建,以为您的平台生成共享库。您必须使用 NGC 容器内的 TensorFlow 源代码和构建脚本,因为它们包含 Triton TensorFlow 后端所需的 Triton 特定补丁。

  • 默认情况下,PyTorch 后端构建从 PyTorch NGC 容器中提取预构建的共享库。但是,构建也可以使用您为平台单独构建的 PyTorch 共享库。有关详细信息,请参阅 pytorch_backend 构建过程。

开发和增量构建#

不使用 Docker 的开发构建#

如果您是 不使用 Docker 构建,请使用 cmake_build 中的 CMake 调用步骤来调用 CMake,以设置一个构建环境,您可以在其中调用 make/msbuild.exe 来增量构建 Triton 核心、后端或仓库代理。

使用 Docker 的开发构建#

如果您是 使用 Docker 构建,则生成的 tritonserver_buildbase 镜像包含执行完整或增量构建所需的所有依赖项。在 tritonserver_buildbase 中,/workspace/build/cmake_build 包含用于构建 Triton 核心、后端和仓库代理的 CMake 调用。

要在 tritonserver_buildbase 容器中执行增量构建,请将您的源代码映射到容器中,然后在容器中从 cmake_build 运行适当的 CMake 和 make(或 msbuild.exe)步骤。

Triton 核心的开发构建#

假设您在主机系统上克隆了 server 仓库,您正在其中进行更改,并且您想执行增量构建来测试这些更改。您的源代码位于 /home/me/server 中。运行 tritonserver_buildbase 容器并将您的服务器源代码目录映射到容器中的 /server。

$ docker run -it --rm -v/home/me/server:/server tritonserver_buildbase bash

在容器中查看 /workspace/build/cmake_build,找到构建 “Triton 核心库” 的命令部分。您可以完全按照这些命令进行操作,也可以修改它们以更改构建目录或 CMake 选项。您 必须 更改 CMake 命令以使用 /server 而不是 /workspace 作为 CMakeLists.txt 文件和源代码的位置

$ cmake <options> /server

然后,您可以将目录更改为构建目录,并按照 cmake_build 中所示运行 make(或 msbuild.exe)。当您在主机系统上更改源代码时,可以通过重新运行 make(或 msbuild.exe)来执行增量构建。

后端或仓库代理的开发构建#

执行后端或仓库代理的完整或增量构建类似于构建 Triton 核心。作为示例,我们将使用 TensorRT 后端。假设您在主机系统上克隆了 TensorRT 后端仓库,您正在其中进行更改,并且您想执行增量构建来测试这些更改。您的源代码位于 /home/me/tritonserver_backend 中。运行 tritonserver_buildbase 容器并将您的 TensorRT 后端源代码目录映射到容器中的 /tensorrt_backend。请注意,某些后端将使用 Docker 作为其构建的一部分,因此主机的 Docker 注册表必须通过挂载 docker.sock 在 tritonserver_buildbase 中可用(在 Windows 上使用 -v.\\pipe\\docker_engine:.\\pipe\\docker_engine)。

$ docker run -it --rm -v/var/run/docker.sock:/var/run/docker.sock -v/home/me/tensorrt_backend:/tensorrt_backend tritonserver_buildbase bash

在容器中查看 /workspace/build/cmake_build,找到构建 “TensorRT 后端” 的命令部分。您可以完全按照这些命令进行操作,也可以修改它们以更改构建目录或 CMake 选项。您 必须 更改 CMake 命令以使用 /tensorrt_backend 而不是 /workspace 作为 CMakeLists.txt 文件和源代码的位置

$ cmake <options> /tensorrt_backend

然后,您可以将目录更改为构建目录,并按照 cmake_build 中所示运行 make(或 msbuild.exe)。当您在主机系统上更改源代码时,可以通过重新运行 make(或 msbuild.exe)来执行增量构建。

使用调试符号构建#

要使用调试符号构建,请在启动 build.py 时使用 –build-type=Debug 参数。如果直接使用 CMake 构建,请使用 -DCMAKE_BUILD_TYPE=Debug。然后,您可以使用 gdb 启动构建的服务器,并在 gdb 跟踪中查看调试符号/信息。