在 Triton 中部署 vLLM 模型#

以下教程演示了如何使用 Triton 的 基于 Python 的 vLLM 后端,在 Triton Inference Server 上部署一个简单的 facebook/opt-125m 模型。

注意:本教程仅旨在作为参考示例,并且存在已知限制

步骤 1:准备您的模型仓库#

要使用 Triton,我们需要构建一个模型仓库。在本教程中,我们将使用 vllm_backend 仓库的 samples 文件夹中提供的模型仓库。

以下命令集将创建一个 model_repository/vllm_model/1 目录并复制 2 个文件:model.jsonconfig.pbtxt,这些文件是服务 facebook/opt-125m 模型所必需的。

mkdir -p model_repository/vllm_model/1
wget -P model_repository/vllm_model/1 https://raw.githubusercontent.com/triton-inference-server/vllm_backend/r<xx.yy>/samples/model_repository/vllm_model/1/model.json
wget -P model_repository/vllm_model/ https://raw.githubusercontent.com/triton-inference-server/vllm_backend/r<xx.yy>/samples/model_repository/vllm_model/config.pbtxt

其中 <xx.yy> 是您要使用的 Triton 版本。请注意,Triton 的 vLLM 容器是从 23.10 版本开始引入的。

模型仓库应如下所示

model_repository/
└── vllm_model
    ├── 1
    │   └── model.json
    └── config.pbtxt

model.json 的内容是

{
    "model": "facebook/opt-125m",
    "disable_log_requests": "true",
    "gpu_memory_utilization": 0.5
}

可以修改此文件,以便为 vLLM 引擎提供更多设置。有关支持的键值对,请参阅 vLLM AsyncEngineArgsEngineArgs。vLLM 引擎处理 Inflight 批处理和分页注意力。

对于多 GPU 支持,可以在 model.json 中指定 EngineArgs,如 tensor_parallel_size

注意:在默认设置下,vLLM 会贪婪地消耗高达 90% 的 GPU 内存。本教程通过将 gpu_memory_utilization 设置为 50% 来更新此行为。您可以使用 model.json 中的 gpu_memory_utilization 和其他设置来调整此行为。

通读 model.py 中的文档,了解如何为您的用例配置此示例。

步骤 2:启动 Triton Inference Server#

设置好模型仓库后,就可以启动 triton 服务器了。从 23.10 版本开始,NGC 上提供了预装 vLLM 的专用容器。NGC. 要使用此容器启动 Triton,您可以使用下面的 docker 命令。

docker run --gpus all -it --net=host --rm -p 8001:8001 --shm-size=1G --ulimit memlock=-1 --ulimit stack=67108864 -v ${PWD}:/work -w /work nvcr.io/nvidia/tritonserver:<xx.yy>-vllm-python-py3 tritonserver --model-store ./model_repository

在整个教程中,<xx.yy> 是您要使用的 Triton 版本。请注意,Triton 的 vLLM 容器首次发布于 23.10 版本,因此任何早期版本都将无法工作。

启动 Triton 后,您将在控制台上看到输出,显示服务器正在启动并加载模型。当您看到如下输出时,Triton 已准备好接受推理请求。

I1030 22:33:28.291908 1 grpc_server.cc:2513] Started GRPCInferenceService at 0.0.0.0:8001
I1030 22:33:28.292879 1 http_server.cc:4497] Started HTTPService at 0.0.0.0:8000
I1030 22:33:28.335154 1 http_server.cc:270] Started Metrics Service at 0.0.0.0:8002

步骤 3:使用 Triton 客户端发送您的第一个推理请求#

在本教程中,我们将展示如何通过 2 种方式向 facebook/opt-125m 模型发送推理请求

使用 Generate 端点#

在您使用示例 model_repository 启动 Triton 后,您可以快速使用 generate 端点运行您的第一个推理请求。

使用以下命令启动 Triton 的 SDK 容器

docker run -it --net=host -v ${PWD}:/workspace/ nvcr.io/nvidia/tritonserver:<xx.yy>-py3-sdk bash

现在,让我们发送一个推理请求

curl -X POST localhost:8000/v2/models/vllm_model/generate -d '{"text_input": "What is Triton Inference Server?", "parameters": {"stream": false, "temperature": 0}}'

成功后,您应该会看到来自服务器的如下响应

{"model_name":"vllm_model","model_version":"1","text_output":"What is Triton Inference Server?\n\nTriton Inference Server is a server that is used by many"}

使用 gRPC Asyncio 客户端#

现在,我们将了解如何在 Triton 的 SDK 容器中运行客户端,以使用 gRPC asyncio 客户端 库发出多个异步请求。

此方法需要一个 client.py 脚本和一组 prompts,这些脚本和提示在 samples 文件夹的 vllm_backend 仓库中提供。

使用以下命令将 client.pyprompts.txt 下载到当前目录

wget https://raw.githubusercontent.com/triton-inference-server/vllm_backend/main/samples/client.py
wget https://raw.githubusercontent.com/triton-inference-server/vllm_backend/main/samples/prompts.txt

现在,我们准备好启动 Triton 的 SDK 容器了

docker run -it --net=host -v ${PWD}:/workspace/ nvcr.io/nvidia/tritonserver:<xx.yy>-py3-sdk bash

在容器内,使用以下命令运行 client.py

python3 client.py

客户端从 prompts.txt 文件中读取提示,将它们发送到 Triton 服务器进行推理,并将结果存储到名为 results.txt 的文件中(默认情况下)。

客户端的输出应如下所示

Loading inputs from `prompts.txt`...
Storing results into `results.txt`...
PASS: vLLM example

您可以检查 results.txt 的内容以获取服务器的响应。--iterations 标志可以与客户端一起使用,通过循环遍历 prompts.txt 中提供的提示列表来增加服务器上的负载。

当您在 verbose 模式下使用 --verbose 标志运行客户端时,客户端将打印有关请求/响应事务的更多详细信息。

限制#

  • 即使每个请求只有一个响应,我们也使用解耦流式传输协议。

  • asyncio 实现暴露给 model.py。

  • 不支持提供要使用的 GPU 的特定子集。

  • 如果您正在运行多个带有基于 Python 的 vLLM 后端的 Triton 服务器实例,则需要为每个服务器指定不同的 shm-region-prefix-name。有关更多信息,请参阅此处