在 Triton 中部署 vLLM 模型#
以下教程演示了如何使用 Triton 的 基于 Python 的 vLLM 后端,在 Triton Inference Server 上部署一个简单的 facebook/opt-125m 模型。
注意:本教程仅旨在作为参考示例,并且存在已知限制。
步骤 1:准备您的模型仓库#
要使用 Triton,我们需要构建一个模型仓库。在本教程中,我们将使用 vllm_backend 仓库的 samples 文件夹中提供的模型仓库。
以下命令集将创建一个 model_repository/vllm_model/1
目录并复制 2 个文件:model.json
和 config.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 AsyncEngineArgs 和 EngineArgs。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.py
和 prompts.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
。有关更多信息,请参阅此处。