Model Serving 方案选型
vLLM / Ollama / TGI / Triton Inference Server / SGLang / llama.cpp 对比选择
Model Serving 概述
Model Serving 指将训练好的机器学习模型部署到生产环境,对外提供稳定、高效的推理服务。与离线推理(Batch Inference)不同,Model Serving 需要实时处理请求并返回结果,对系统的吞吐量(Throughput)、延迟(Latency)、并发能力(Concurrency)和易用性(Usability)有更高要求。
核心指标说明:
- 吞吐量:单位时间内处理的请求数或 Token 数,通常用 tokens/s 或 requests/s 衡量。
- 延迟:单个请求从提交到返回结果的耗时,包括首 Token 延迟(TTFT)和每个输出 Token 的延迟(TPOT)。
- 并发:系统同时处理多个请求的能力,涉及请求排队、动态批处理等机制。
- 易用性:部署、配置、维护的复杂程度,包括 API 兼容性、文档质量、社区活跃度等。
选择合适的 Model Serving 方案,需要综合考虑硬件资源、业务场景、性能要求和团队技术栈等因素。下文将对 6 种主流方案进行详细分析。
各方案详解
vLLM
vLLM 是由 UC Berkeley 开发的高吞吐量 LLM 推理引擎,核心创新在于 PagedAttention 显存管理机制。
PagedAttention 将 KV Cache 分页管理,类似操作系统虚拟内存的分页机制。传统方案需要为每个请求预分配连续的显存空间,容易产生显存碎片和浪费。PagedAttention 通过非连续显存块存储 KV Cache,消除了内部碎片,将显存利用率提升至接近 100%,从而支持更大的 Batch Size。
Continuous Batching(动态批处理)允许在推理过程中动态添加或移除请求,而非等待整个 Batch 完成。当一个请求生成完毕,系统立即将其移出 Batch 并加入新请求,最大化 GPU 利用率。
vLLM 提供 OpenAI 兼容 API,可直接替换 OpenAI API 的调用代码,迁移成本极低。部署方式如下:
# 安装 vLLM
pip install vllm
# 启动 API 服务
python -m vllm.entrypoints.openai.api_server \
--model meta-llama/Llama-2-7b-chat-hf \
--port 8000# 客户端调用
from openai import OpenAI
client = OpenAI(base_url="http://localhost:8000/v1", api_key="dummy")
response = client.chat.completions.create(
model="meta-llama/Llama-2-7b-chat-hf",
messages=[{"role": "user", "content": "Hello"}]
)
print(response.choices[0].message.content)主要优势:极高的吞吐量、优秀的显存管理、兼容 OpenAI API、社区活跃。
Ollama
Ollama 致力于提供 一键本地部署 的 LLM 体验,适合开发调试和个人使用。它将模型权重、配置和依赖打包在 Modelfile 中,简化了模型管理。
Modelfile 是 Ollama 的核心配置,类似 Dockerfile,可以定义模型基础、系统提示词、推理参数(温度、上下文长度等):
FROM llama2
# 设置系统提示词
SYSTEM You are a helpful assistant specialized in Python programming.
# 设置推理参数
PARAMETER temperature 0.7
PARAMETER num_ctx 4096模型仓库管理 通过简单的命令即可完成下载和运行:
# 拉取并运行模型
ollama pull llama2
ollama run llama2 "What is the capital of France?"
# 从 Modelfile 创建自定义模型
ollama create my-custom-model -f ./Modelfile主要优势:部署极其简单、跨平台支持(macOS / Linux / Windows)、模型管理方便、适合快速原型验证。
TGI(Text Generation Inference)
TGI 由 Hugging Face 开发,与 Hugging Face 生态深度集成,天然支持 HF Hub 上的数万种模型。
核心特性:
- 原生量化支持:内置 AWQ 和 GPTQ 量化格式支持,可在不显著降低推理质量的情况下减少显存占用。
- Flash Attention:利用 Flash Attention 算法加速注意力计算,降低显存带宽需求。
- 流式输出:支持 Server-Sent Events(SSE)流式返回结果,改善用户体验。
- Token Streaming:首 Token 生成后即可开始传输,减少用户感知的等待时间。
# 使用 Docker 部署 TGI
docker run --gpus all -p 8080:80 \
-v /path/to/models:/data \
ghcr.io/huggingface/text-generation-inference:latest \
--model-id meta-llama/Llama-2-7b-chat-hf \
--quantize awq主要优势:与 HF 生态无缝集成、量化方案成熟、企业级稳定性、官方维护。
Triton Inference Server
Triton Inference Server 由 NVIDIA 出品,是一个企业级的多框架推理服务器,适用于大规模生产环境。
多框架支持:Triton 可同时加载 TensorRT、ONNX、PyTorch、TensorFlow、Python 等多种框架的模型,并在同一个服务中统一管理。这意味着不同框架的模型可以共存于同一个推理集群中。
模型并发与动态批处理:
- 模型并发:多个模型可以在同一 GPU 上并发运行,自动进行显存和计算资源的调度。
- 动态批处理:Triton 会自动将多个请求合并为一个 Batch,最大化 GPU 利用率,同时通过延迟调度策略平衡响应时间。
# 使用 Docker 部署 Triton
docker run --gpus all -p 8000:8000 -p 8001:8001 -p 8002:8002 \
-v /path/to/model_repository:/models \
nvcr.io/nvidia/tritonserver:24.01-py3 \
tritonserver --model-repository=/models# Python 客户端调用
import tritonclient.http as httpclient
client = httpclient.InferenceServerClient(url="localhost:8000")
result = client.infer(
model_name="my_model",
inputs=[httpclient.InferInput("input", [1, 512], "FP32")]
)主要优势:企业级可靠性、多框架支持、模型生命周期管理、性能监控与指标导出(Prometheus)、灰度发布与模型版本管理。
SGLang
SGLang 提出了一种 结构化生成语言(Structured Generation Language),允许用户通过声明式语法描述 LLM 的推理流程,从而实现编译优化。
RadixAttention 前缀缓存:SGLang 将共享前缀的 KV Cache 进行树状缓存和复用。当多个请求包含相同的前缀(如系统提示词、对话历史),只需计算一次即可共享,大幅减少重复计算。
编译优化:SGLang 将用户定义的生成流程编译为高效的执行计划,自动实现算子融合、内存规划和并行调度,比朴素的逐段调用方式快数倍。
import sglang as sgl
@sgl.function
def multi_turn_question(s, question, context):
s += sgl.system("You are a helpful assistant.")
s += sgl.user("Context: " + context)
s += sgl.assistant(sgl.gen("response_1", max_tokens=256))
s += sgl.user(question)
s += sgl.assistant(sgl.gen("response_2", max_tokens=256))
# 启动服务
sgl.set_default_backend(sgl.RuntimeEndpoint("http://localhost:30000"))主要优势:结构化生成降低延迟、前缀缓存减少计算、编译优化提升性能、适合复杂推理链场景。
llama.cpp
llama.cpp 是一个 CPU 优先 的 LLM 推理引擎,用 C/C++ 编写,对消费级硬件友好,是本地和边缘部署的首选方案。
GGUF 量化格式:llama.cpp 推出了 GGUF(GPT-Generated Unified Format)格式,支持从 2-bit 到 8-bit 的多种量化级别。Q4_K_M 是推荐的折中方案,在模型质量和推理速度之间取得良好平衡。
主要特点:
- 无需 GPU 即可运行,但支持 GPU 加速(CUDA / Metal / Vulkan / SYCL)。
- 极小的二进制体积,适合嵌入式设备。
- 支持多种推理后端(CPU / GPU / 混合)。
# 编译 llama.cpp
git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp
cmake -B build
cmake --build build --config Release
# 运行推理
./build/bin/main \
-m /path/to/model.gguf \
-p "Once upon a time" \
-n 256 \
-t 8# Python 绑定
from llama_cpp import Llama
llm = Llama(model_path="/path/to/model.gguf", n_threads=8)
output = llm("What is the capital of France?", max_tokens=128)
print(output["choices"][0]["text"])主要优势:无 GPU 依赖、极致量化压缩、跨平台(包括 ARM)、适合边缘设备。
方案对比表
| 特性 | vLLM | Ollama | TGI | Triton Inference Server | SGLang | llama.cpp |
|---|---|---|---|---|---|---|
| 后端语言 | Python / C++ | Go / C++ | Rust / Python | C++ / Python | Python | C / C++ |
| 推理引擎 | 自研 | llama.cpp 后端 | 自研 | TensorRT / ONNX Runtime | 自研 | 自研 |
| GPU 需求 | 必需(CUDA) | 可选 | 必需(CUDA) | 必需(CUDA) | 必需(CUDA) | 可选(CPU 优先) |
| 部署复杂度 | 中等 | 低 | 中等 | 高 | 中高 | 中 |
| API 兼容性 | OpenAI 兼容 | Ollama API / OpenAI | OpenAI 兼容 | gRPC / HTTP / 自定义 | OpenAI 兼容 | HTTP Server |
| 量化支持 | GPTQ / AWQ | GGUF | AWQ / GPTQ | INT8 / FP8 / INT4 | GPTQ / AWQ | GGUF |
| 动态批处理 | Continuous Batching | 不支持 | Continuous Batching | 动态批处理 | RadixAttention | 不支持 |
| 多模型并发 | 不支持 | 不支持 | 不支持 | 支持 | 不支持 | 不支持 |
| 社区活跃度 | 高 | 高 | 中高 | 中 | 中 | 高 |
| 适合场景 | 云端高吞吐 | 本地开发调试 | HF 生态用户 | 企业多模型 | 复杂推理链 | 边缘/本地 |
选型指南
云端高吞吐生产环境
推荐 vLLM 或 TGI。两者都支持 Continuous Batching 和 OpenAI 兼容 API,能够充分利用 GPU 资源,适合需要处理大量并发请求的线上服务。vLLM 的 PagedAttention 在长上下文场景下优势更明显,而 TGI 在 Hugging Face 生态中集成更紧密。
# vLLM 生产部署建议
python -m vllm.entrypoints.openai.api_server \
--model meta-llama/Llama-3-70b \
--tensor-parallel-size 4 \
--max-num-seqs 256 \
--gpu-memory-utilization 0.95本地开发与调试
推荐 Ollama。零配置即可运行,支持跨平台,丰富的模型库一键拉取。适合在笔记本电脑上快速验证模型效果、调试提示词、进行原型开发。
边缘设备与离线使用
推荐 llama.cpp + GGUF 量化模型。CPU 优先的设计使其无需昂贵的 GPU 即可运行,Q4 量化的模型在保持可用质量的同时大幅降低内存占用,适配树莓派、旧款笔记本等低算力设备。
企业级多模型管理
推荐 Triton Inference Server。支持多框架、多模型并发、动态批处理、模型版本管理、监控指标导出等企业级特性。适合需要统一管理多种模型(如 LLM、推荐模型、视觉模型)的中大型团队。
复杂推理流程
推荐 SGLang。如果业务涉及多步推理、条件分支、结构化输出等复杂流程,SGLang 的结构化生成语言和 RadixAttention 前缀缓存可以显著提升推理效率,减少重复计算。