简介
Inference Server 是 NVIDIA 开源的高性能推理服务平台。它的核心设计目标是标准化、高性能地部署和生产化任何框架训练的 AI 模型。
核心特点:
- 统一服务化:将 TensorFlow、PyTorch、ONNX、TensorRT 或像 vLLM 这样的自定义后端模型,统一封装成标准的 HTTP/gRPC API 服务。
- 极致性能:内置并发模型执行、动态批处理、模型流水线,能最大化利用 GPU/CPU 资源,降低推理延迟。
- 生产就绪:直接提供模型版本管理、健康检查、监控指标、并发模型加载等生产级功能。
- https://github.com/triton-inference-server/server
- https://developer.nvidia.com/dynamo-triton
- https://docs.nvidia.com/deeplearning/triton-inference-server/user-guide/docs/index.html
环境准备与模型获取
下载推理框架:
# 1. 拉取 Triton CPU 官方镜像 (选择带Python后端的版本)
docker pull nvcr.io/nvidia/tritonserver:24.10-py3
# 也可以直接下载二进制文件,但要安装好依赖
# 从 GitHub Releases 下载对应版本(以 25.01 为例)
# wget https://github.com/triton-inference-server/server/releases/download/v25.01/tritonserver-25.01-linux-x86_64.tar.gz
# tar -xvf tritonserver-25.01-linux-x86_64.tar.gz
# cd tritonserver
# Ubuntu/Debian 系统,安装系统依赖
# sudo apt-get update
# sudo apt-get install -y libssl-dev libcurl4-openssl-dev libarchive-dev \
# libb64-dev libre2-dev libboost-all-dev \
# rapidjson-dev libopenblas-dev
# 准备 Python 环境(vLLM 依赖)
# 创建 Python 虚拟环境
# python3 -m venv /opt/triton/python_env
# source /opt/triton/python_env/bin/activate
# # 安装 vLLM 和 Triton Python 后端
# pip install vllm tritonclient[all]
下载模型
# 2. 创建模型仓库目录结构
mkdir -p /path/to/model_repository
cd /path/to/model_repository
# 3. 下载示例GGUF模型并创建模型目录
mkdir -p qwen_gguf/1
cd qwen_gguf/1
wget https://huggingface.co/unsloth/Qwen3.5-0.8B-GGUF/resolve/main/qwen3.5-0.8b.Q4_K_M.gguf -O model.gguf
核心配置文件:config.pbtxt
config.pbtxt 文件, 在 /path/to/model_repository/qwen_gguf/ 目录 ,这是Triton模型部署的核心。
# 1. 模型名称:客户端调用时使用的标识符
name: "qwen_llamacpp"
# 2. 后端类型:必须指定为 "python",以使用您编写的 model.py
backend: "python"
# 3. 最大批处理大小:设置为 0 表示禁用 Triton 的动态批处理。
# 原因:llama.cpp 在 model.py 内部已实现其自身的生成循环,由 Triton 在外部做动态批处理会复杂且低效。
max_batch_size: 0
# 4. 输入定义:必须与 model.py 中 `pb_utils.get_input_tensor_by_name` 使用的名称一致。
input [
{
name: "prompt" # 输入张量名称
data_type: TYPE_STRING # 数据类型为字符串
dims: [ -1 ] # 维度为 [-1] 表示可变长度的一维数组(即单个字符串)
}
# 您可以在此添加其他输入,例如生成参数(temperature, max_tokens)
# {
# name: "max_tokens"
# data_type: TYPE_INT32
# dims: [1]
# }
]
# 5. 输出定义:必须与 model.py 中构造的返回张量名称一致。
output [
{
name: "generated_text" # 输出张量名称
data_type: TYPE_STRING
dims: [ -1 ]
}
]
# 6. 实例组配置:**CPU模型部署的核心配置**
instance_group [
{
count: 1 # 实例数量。对于CPU模型,可增加以利用多核,但会倍增内存占用。
kind: KIND_CPU # 指定在 CPU 上执行。这是必须的。
}
]
# 7. 模型版本策略:默认为加载所有版本,保持即可。
version_policy: { all { } }
# 8. 优化配置(可选但重要)
optimization {
# CPU 线程池配置,可影响内部并行度
cpu_execution_accelerators [
{ name: "auto" }
]
}
# 9. 后端参数:**Python后端特有的关键配置**
parameters [
{
key: "EXECUTION_ENV"
# 用于设置 Python 后端的运行时环境变量。
# 例如,可指定共享库路径,确保能找到 llama-cpp-python 的底层 C 库。
value: {string_value: "{\"LD_LIBRARY_PATH\": \"/usr/local/custom_lib:/opt/llama_cpp_libs\"}"}
}
]
Python后端模型脚本:model.py
import triton_python_backend_utils as pb_utils
import numpy as np
from llama_cpp import Llama # 使用llama-cpp-python库
class TritonPythonModel:
def initialize(self, args):
"""模型初始化,加载GGUF文件"""
model_path = os.path.join(args['model_repository'], args['model_version'], 'model.gguf')
# 关键参数:n_ctx为上下文长度,n_threads为推理线程数,n_gpu_layers=0表示纯CPU
self.llm = Llama(
model_path=model_path,
n_ctx=4096,
n_threads=4, # 根据CPU核心数调整
n_gpu_layers=0, # 纯CPU推理
verbose=False
)
print(f"Model loaded from {model_path}")
def execute(self, requests):
"""处理推理请求"""
responses = []
for request in requests:
# 1. 获取输入
prompt = pb_utils.get_input_tensor_by_name(request, "prompt").as_numpy()[0].decode('utf-8')
# 2. 调用模型生成(关键:流式生成或单次生成)
output = self.llm(
prompt,
max_tokens=256,
temperature=0.7,
stop=["</s>", "###"],
echo=False
)
generated_text = output['choices'][0]['text']
# 3. 构造返回张量
output_tensor = pb_utils.Tensor(
"generated_text",
np.array([generated_text.encode('utf-8')], dtype=object)
)
responses.append(pb_utils.InferenceResponse(output_tensors=[output_tensor]))
return responses
def finalize(self):
"""清理资源"""
if hasattr(self, 'llm'):
del self.llm
也可以创建 model.json 文件,定义内置的 vLLM 引擎的具体参数(Triton 24.03+)。但对 gguf 格式的CPU模型,不推荐使用。
{
"model": "/opt/triton/models/qwen35_08b_gguf/1/Qwen3.5-0.8B-Q4_K_M.gguf",
"tokenizer": "Qwen/Qwen3.5-0.8B", // 或使用本地分词器目录
"disable_log_requests": true,
"trust_remote_code": true,
"max_model_len": 8192,
"gpu_memory_utilization": 0.9, // 如果使用 GPU 则保留,纯 CPU 可移除或忽略
"enforce_eager": true,
"dtype": "float16" // GGUF 已量化,此处指定加载的数据类型
}
创建Python环境包
# 在宿主机上创建Python虚拟环境并打包
cd /path/to/model_repository/qwen_gguf/1
python3 -m venv qwen_env
source qwen_env/bin/activate
pip install llama-cpp-python # 核心依赖
pip install numpy tritonclient[all] # Triton Python后端工具
# 打包环境(Triton Python后端要求)
tar -czf qwen_env.tar.gz qwen_env/
# 将此包复制到容器内指定路径,或通过卷挂载
启动Triton服务(生产级参数)
# 使用Docker启动,关键参数已标注
docker run -d --name triton_server \
--shm-size=2g `# 共享内存,用于进程间通信,根据批处理大小调整` \
--memory="8g" `# 限制容器内存` \
--cpus="4.0" `# 限制CPU资源` \
-p 8000:8000 `# HTTP端口` \
-p 8001:8001 `# gRPC端口(性能更优)` \
-p 8002:8002 `# 监控指标端口` \
-v /path/to/model_repository:/models `# 挂载模型仓库` \
-v /path/to/model_repository/qwen_gguf/1/qwen_env.tar.gz:/opt/tritonserver/backends/python/qwen_env.tar.gz `# 挂载Python环境` \
nvcr.io/nvidia/tritonserver:24.10-py3 \
tritonserver \
--model-repository=/models \
--model-control-mode=poll `# 轮询模式,支持模型热更新` \
--http-thread-count=8 `# HTTP处理线程数,建议为CPU核心数1-2倍` \
--allow-metrics=true `# 启用监控指标` \
--metrics-port=8002 \
--log-info=true \
--log-verbose=0 `# 生产环境可关闭详细日志`
# # 二进制启动命令:
# ./bin/tritonserver \
# --model-repository=/opt/triton/models \
# --strict-model-config=false \
# --log-verbose=1 \
# --model-control-mode=explicit \
# --load-model=qwen35_08b_gguf \
# --backend-config=vllm,env="PYTHONPATH=/opt/triton/python_env/lib/python3.10/site-packages"
服务验证与监控
# 1. 检查服务状态
curl -v localhost:8000/v2/health/ready
# 2. 查看已加载模型
curl localhost:8000/v2/models
# 3. 使用HTTP API进行推理
curl -X POST http://localhost:8000/v2/models/qwen_gguf/infer \
-H "Content-Type: application/json" \
-d '{
"inputs": [
{
"name": "prompt",
"shape": [1],
"datatype": "BYTES",
"data": ["请用中文介绍人工智能"]
}
],
"outputs": [{"name": "generated_text"}]
}'
# 4. 获取性能指标(用于Prometheus)
curl localhost:8002/metrics