Triton推理服务器
--- title: "Triton推理服务器" description: "NVIDIA Triton Inference Server实战指南,涵盖动态批处理、模型并发、多模型管理与性能调优" tags: ["Triton", "NVIDIA Triton", "动态批处理", "模型并发"] category: "llm" icon: "🧠"
Triton推理服务器
Triton概述
NVIDIA Triton Inference Server是一个高性能的推理服务平台,支持多种深度学习框架(TensorRT、PyTorch、TensorFlow、ONNX Runtime等)。它提供了动态批处理、并发模型执行、模型流水线等高级特性,是部署LLM推理服务的首选方案之一。
安装与配置
Triton可以通过Docker容器快速部署:
# 拉取Triton容器镜像
docker pull nvcr.io/nvidia/tritonserver:24.01-py3
# 启动Triton服务器
docker run --gpus all --rm -p 8000:8000 -p 8001:8001 -p 8002:8002 \
-v /path/to/models:/models \
nvcr.io/nvidia/tritonserver:24.01-py3 \
tritonserver --model-repository=/models
模型仓库的目录结构需要遵循Triton的规范:
models/
├── llama-7b/
│ ├── config.pbtxt
│ └── 1/
│ └── model.plan
├── llama-13b/
│ ├── config.pbtxt
│ └── 1/
│ └── model.plan
模型配置
每个模型需要一个config.pbtxt配置文件:
name: "llama-7b"
platform: "tensorrt_plan"
max_batch_size: 32
input [
{
name: "INPUT_IDS"
data_type: TYPE_INT32
dims: [ -1 ]
},
{
name: "ATTENTION_MASK"
data_type: TYPE_INT32
dims: [ -1 ]
}
]
output [
{
name: "OUTPUT_IDS"
data_type: TYPE_INT64
dims: [ -1 ]
}
]
dynamic_batching {
preferred_batch_size: [ 8, 16 ]
max_queue_delay_microseconds: 100
preserve_ordering: true
}
instance_group [
{
count: 2
kind: KIND_GPU
gpus: [ 0, 1 ]
}
]
动态批处理
动态批处理是Triton最强大的特性之一,将多个独立请求合并为一个批次进行推理:
dynamic_batching {
preferred_batch_size: [ 8, 16, 32 ]
max_queue_delay_microseconds: 500
preferred_batch_size {
preferred_size: 8
priority: 1
}
preferred_batch_size {
preferred_size: 32
priority: 0
}
}
对于LLM的自回归生成,Triton支持Continuous Batching(也称Iteration-level Batching),允许不同请求在不同的解码步骤中动态加入或退出批次:
import tritonclient.grpc as grpcclient
def generate_with_dynamic_batching(prompt, max_tokens):
client = grpcclient.InferenceServerClient(url="localhost:8001")
inputs = []
inputs.append(grpcclient.InferInput("INPUT_IDS", [1, -1], "INT32"))
inputs.append(grpcclient.InferInput("ATTENTION_MASK", [1, -1], "INT32"))
outputs = []
outputs.append(grpcclient.InferRequestedOutput("OUTPUT_IDS"))
results = client.infer(
model_name="llama-7b",
inputs=inputs,
outputs=outputs
)
return results.as_numpy("OUTPUT_IDS")
模型并发与多模型管理
Triton支持在同一服务器上同时运行多个模型,每个模型可以独立配置并发实例数:
# 高优先级模型配置
instance_group [
{
count: 4
kind: KIND_GPU
gpus: [ 0 ]
}
]
rate_limiter {
resources [
{
name: "gpu"
global: true
count: 8
}
]
}
使用模型控制API可以动态加载和卸载模型:
# 加载模型
curl -X POST http://localhost:8000/v2/repository/models/llama-7b/load
# 卸载模型
curl -X POST http://localhost:8000/v2/repository/models/llama-7b/unload
# 查看模型状态
curl http://localhost:8000/v2/models/llama-7b/ready
性能调优
Triton提供了丰富的性能调优选项:
# 启用CUDA Graph优化
--cuda-graph
# 配置模型流水线
--backend-config=python,shm-default-byte-size=1048576
# 启用Metrics
--metrics-port=8002
# 配置日志
--log-verbose=1 --log-info=true
通过合理配置Triton的动态批处理、模型并发和性能参数,可以显著提升LLM推理的吞吐量和资源利用率。Triton与TensorRT-LLM的结合更是提供了当前最优的推理性能。