License

vLLM 后端#

Triton 后端,用于在 vLLM 上运行 支持的模型 vLLM 引擎。 您可以在 后端仓库 中了解更多关于 Triton 后端的信息。

这是一个 基于 Python 的后端。 当使用此后端时,所有请求都会在收到后立即放置在 vLLM AsyncEngine 上。 飞行中批处理和分页注意力由 vLLM 引擎处理。

在哪里可以询问关于 Triton 和 Triton 后端的一般问题? 请务必阅读以下所有信息以及主 server 仓库中提供的 通用 Triton 文档。 如果您在那里找不到答案,您可以在主 Triton 问题页面 上提问。

安装 vLLM 后端#

有几种方法可以安装和部署 vLLM 后端。

选项 1. 使用预构建的 Docker 容器。#

NGC 注册表拉取带有 vLLM 后端的 tritonserver:<xx.yy>-vllm-python-py3 容器。 <xx.yy> 是您想要使用的 Triton 版本。 请注意,Triton 的 vLLM 容器已从 23.10 版本开始引入。

docker pull nvcr.io/nvidia/tritonserver:<xx.yy>-vllm-python-py3

选项 2. 从源代码构建自定义容器#

您可以按照 使用 Docker 构建 指南中描述的步骤,并使用 build.py 脚本。

下面显示了一个示例命令,用于构建启用所有选项的 Triton 服务器容器。 请随意根据您的需求自定义标志。

请使用 NGC 注册表 获取最新版本的 Triton vLLM 容器,该容器对应于 Triton 版本 的最新 YY.MM(年.月)。

# YY.MM is the version of Triton.
export TRITON_CONTAINER_VERSION=<YY.MM>
./build.py -v  --enable-logging
                --enable-stats
                --enable-tracing
                --enable-metrics
                --enable-gpu-metrics
                --enable-cpu-metrics
                --enable-gpu
                --filesystem=gcs
                --filesystem=s3
                --filesystem=azure_storage
                --endpoint=http
                --endpoint=grpc
                --endpoint=sagemaker
                --endpoint=vertex-ai
                --upstream-container-version=${TRITON_CONTAINER_VERSION}
                --backend=python:r${TRITON_CONTAINER_VERSION}
                --backend=vllm:r${TRITON_CONTAINER_VERSION}
                --backend=ensemble

选项 3. 将 vLLM 后端添加到默认 Triton 容器#

您可以将 vLLM 后端直接安装到 NGC Triton 容器中。 在这种情况下,请先安装 vLLM。 您可以通过运行 pip install vllm==<vLLM_version> 来完成此操作。 然后,使用以下命令在容器中设置 vLLM 后端

mkdir -p /opt/tritonserver/backends/vllm
git clone https://github.com/triton-inference-server/vllm_backend.git /tmp/vllm_backend
cp -r /tmp/vllm_backend/src/* /opt/tritonserver/backends/vllm

使用 vLLM 后端#

您可以在 model_repository 中的 samples 文件夹中查看示例。 您可以按原样使用它,并通过更改 model.json 中的 model 值来更改模型。 model.json 表示在初始化模型时馈送到 vLLM 的 AsyncLLMEngine 的键值字典。 您可以在 vLLM 的 arg_utils.py 中查看支持的参数。 具体来说,这里这里

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

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

启动 Triton 推理服务器#

设置好模型仓库后,就可以启动 Triton 服务器了。 在此示例中,我们将使用来自 NGC预构建的带有 vLLM 后端的 Triton 容器

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-repository ./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

发送您的第一个推理#

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

尝试以下命令。

$ 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"}

samples 文件夹中,您还可以找到一个示例客户端 client.py,它使用 Triton 的 asyncio gRPC 客户端库 在 Triton 上运行推理。

运行最新 vLLM 版本#

您可以从 框架容器支持矩阵 中查看 Triton 推理服务器中包含的 vLLM 版本。 注意: vLLM Triton 推理服务器容器已从 23.10 版本开始引入。

您可以使用容器内的 pip install ... 来升级 vLLM 版本。

运行 Triton 服务器的多个实例#

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

额外的 vLLM 输出#

可以根据每个请求选择性地请求额外的 vLLM 输出。 有关更多信息,请参阅 此文档

Triton 指标#

从 Triton 的 24.08 版本开始,用户现在可以通过查询 Triton 指标端点来获取特定的 vLLM 指标(请参阅完整的 vLLM 指标 此处)。 这可以通过以任何上述方式启动 Triton 服务器(确保构建代码/容器为 24.08 或更高版本)并查询服务器来完成。 收到成功响应后,您可以通过输入以下内容来查询指标端点

curl localhost:8002/metrics

VLLM 统计信息由指标端点在以 vllm: 为前缀的字段中报告。 Triton 当前支持报告来自 vLLM 的以下指标。

# Number of prefill tokens processed.
counter_prompt_tokens
# Number of generation tokens processed.
counter_generation_tokens
# Histogram of time to first token in seconds.
histogram_time_to_first_token
# Histogram of time per output token in seconds.
histogram_time_per_output_token
# Histogram of end to end request latency in seconds.
histogram_e2e_time_request
# Number of prefill tokens processed.
histogram_num_prompt_tokens_request
# Number of generation tokens processed.
histogram_num_generation_tokens_request
# Histogram of the best_of request parameter.
histogram_best_of_request
# Histogram of the n request parameter.
histogram_n_request

这些字段的输出应类似于以下内容

# HELP vllm:prompt_tokens_total Number of prefill tokens processed.
# TYPE vllm:prompt_tokens_total counter
vllm:prompt_tokens_total{model="vllm_model",version="1"} 10
# HELP vllm:generation_tokens_total Number of generation tokens processed.
# TYPE vllm:generation_tokens_total counter
vllm:generation_tokens_total{model="vllm_model",version="1"} 16
# HELP vllm:time_to_first_token_seconds Histogram of time to first token in seconds.
# TYPE vllm:time_to_first_token_seconds histogram
vllm:time_to_first_token_seconds_count{model="vllm_model",version="1"} 1
vllm:time_to_first_token_seconds_sum{model="vllm_model",version="1"} 0.03233122825622559
vllm:time_to_first_token_seconds_bucket{model="vllm_model",version="1",le="0.001"} 0
...
vllm:time_to_first_token_seconds_bucket{model="vllm_model",version="1",le="+Inf"} 1
# HELP vllm:time_per_output_token_seconds Histogram of time per output token in seconds.
# TYPE vllm:time_per_output_token_seconds histogram
vllm:time_per_output_token_seconds_count{model="vllm_model",version="1"} 15
vllm:time_per_output_token_seconds_sum{model="vllm_model",version="1"} 0.04501533508300781
vllm:time_per_output_token_seconds_bucket{model="vllm_model",version="1",le="0.01"} 14
...
vllm:time_per_output_token_seconds_bucket{model="vllm_model",version="1",le="+Inf"} 15
# HELP vllm:e2e_request_latency_seconds Histogram of end to end request latency in seconds.
# TYPE vllm:e2e_request_latency_seconds histogram
vllm:e2e_request_latency_seconds_count{model="vllm_model",version="1"} 1
vllm:e2e_request_latency_seconds_sum{model="vllm_model",version="1"} 0.08686184883117676
vllm:e2e_request_latency_seconds_bucket{model="vllm_model",version="1",le="1"} 1
...
vllm:e2e_request_latency_seconds_bucket{model="vllm_model",version="1",le="+Inf"} 1
# HELP vllm:request_prompt_tokens Number of prefill tokens processed.
# TYPE vllm:request_prompt_tokens histogram
vllm:request_prompt_tokens_count{model="vllm_model",version="1"} 1
vllm:request_prompt_tokens_sum{model="vllm_model",version="1"} 10
vllm:request_prompt_tokens_bucket{model="vllm_model",version="1",le="1"} 0
...
vllm:request_prompt_tokens_bucket{model="vllm_model",version="1",le="+Inf"} 1
# HELP vllm:request_generation_tokens Number of generation tokens processed.
# TYPE vllm:request_generation_tokens histogram
vllm:request_generation_tokens_count{model="vllm_model",version="1"} 1
vllm:request_generation_tokens_sum{model="vllm_model",version="1"} 16
vllm:request_generation_tokens_bucket{model="vllm_model",version="1",le="1"} 0
...
vllm:request_generation_tokens_bucket{model="vllm_model",version="1",le="+Inf"} 1
# HELP vllm:request_params_best_of Histogram of the best_of request parameter.
# TYPE vllm:request_params_best_of histogram
vllm:request_params_best_of_count{model="vllm_model",version="1"} 1
vllm:request_params_best_of_sum{model="vllm_model",version="1"} 1
vllm:request_params_best_of_bucket{model="vllm_model",version="1",le="1"} 1
...
vllm:request_params_best_of_bucket{model="vllm_model",version="1",le="+Inf"} 1
# HELP vllm:request_params_n Histogram of the n request parameter.
# TYPE vllm:request_params_n histogram
vllm:request_params_n_count{model="vllm_model",version="1"} 1
vllm:request_params_n_sum{model="vllm_model",version="1"} 1
vllm:request_params_n_bucket{model="vllm_model",version="1",le="1"} 1
...
vllm:request_params_n_bucket{model="vllm_model",version="1",le="+Inf"} 1

要启用 vLLM 引擎收集指标,需要在 model.json 中将 “disable_log_stats” 选项设置为 false 或留空(默认为 false)。

"disable_log_stats": false

注意: 默认情况下,vLLM 指标不会报告给 Triton 指标服务器,因为可能会降低性能。 要启用 vLLM 模型的指标报告,请也将其以下行添加到其 config.pbtxt 中。

parameters: {
  key: "REPORT_CUSTOM_METRICS"
  value: {
    string_value: "true"
  }
}

vLLM 引擎健康检查 (BETA)#

可以选择启用 vLLM 引擎健康检查,以便服务器报告更准确的模型状态。 有关更多信息,请参阅 此文档

参考教程#

您可以在 vLLM 快速部署指南 中的 tutorials 仓库中进一步阅读。