← 返回首页
🧠

Triton推理服务器

📂 llm ⏱ 2 min 245 words

--- 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的结合更是提供了当前最优的推理性能。