本地部署框架对比¶
这篇回答一个工程问题:
我训练或下载了一个开源模型,应该用什么框架把它部署成服务?
先看整体定位。
| 框架 | 适合场景 | 核心关键词 |
|---|---|---|
| llama.cpp | 本地运行、CPU、Apple Silicon、轻量部署 | GGUF、量化、低门槛 |
| llama-cpp-python | Python 调用 llama.cpp | Python binding、OpenAI-compatible server |
| vLLM | GPU 高吞吐服务 | PagedAttention、continuous batching、OpenAI-compatible |
| SGLang | Agent、RAG、结构化生成和复杂推理链 | RadixAttention、prefix cache、structured generation |
先给结论¶
第一轮选型可以按这个判断:
| 你的情况 | 优先选择 | 原因 |
|---|---|---|
| 只是想在 Mac / 笔记本上体验模型 | llama.cpp | 门槛低,GGUF 模型多,对 CPU 和 Apple Silicon 友好 |
| Python 项目里嵌一个本地小模型 | llama-cpp-python | 直接在 Python 里调用,也能起 OpenAI-compatible server |
| 单卡或多卡 GPU 对外提供 HTTP 服务 | vLLM | 吞吐、batch、OpenAI-compatible API 和生态更成熟 |
| Agent / RAG 请求有大量重复前缀和结构化生成 | SGLang | 更强调 prefix 复用、复杂推理链和结构化输出 |
| 你还不知道并发量和延迟要求 | 先 llama.cpp 或 vLLM 单机验证 | 不要过早引入复杂集群和多框架组合 |
这不是永久选择。真实项目经常是:
本地验证:llama.cpp
开发测试:vLLM 单卡
复杂 Agent/RAG:SGLang 或 vLLM + 应用层编排
生产服务:vLLM / SGLang 多卡 + 网关 + 监控 + 评测
先理解部署要做什么¶
部署不是训练。
部署要解决:
加载模型
↓
接收 HTTP 请求
↓
渲染 chat template
↓
tokenizer 编码
↓
prefill / decode
↓
stream 或 JSON 返回
所以部署框架的价值是:
- 管理模型加载。
- 管理显存。
- 管理 KV Cache。
- 管理 batch。
- 提供 HTTP API。
- 提供 streaming。
- 提供监控和日志。
llama.cpp¶
llama.cpp 更适合本地和轻量场景。
典型特点:
- C/C++ 实现。
- 常用 GGUF 模型文件。
- 支持多种量化格式。
- 可以在 CPU、Apple Silicon、GPU 后端上运行。
- 可以启动本地 server。
适合:
我想在笔记本或单机上跑一个模型。
不太适合:
我要做高并发、多租户、大规模 GPU 服务。
常见命令形态:
llama-server -m model.gguf --host 0.0.0.0 --port 8080
你需要重点关注:
- 模型文件是不是 GGUF。
- 量化等级是否适合你的内存和质量要求。
- 上下文长度开大后内存是否够。
- CPU / Metal / CUDA 后端是否正确启用。
llama-cpp-python¶
llama-cpp-python 可以理解成 llama.cpp 的 Python binding。
适合:
我想在 Python 应用里直接加载 GGUF 模型,或者快速起一个本地 OpenAI-compatible 服务。
典型价值:
- 不需要单独管理一个复杂推理服务。
- 本地实验和小工具集成很方便。
- 可以复用 llama.cpp 的 GGUF 和量化生态。
限制也很明确:
- 高并发能力不是它的重点。
- 生产服务仍然要考虑进程管理、监控、资源隔离和失败恢复。
- 和官方 OpenAI API 的字段兼容度需要实际测试。
vLLM¶
vLLM 更适合 GPU 服务化部署。
典型特点:
- OpenAI-compatible API server。
- PagedAttention。
- continuous batching。
- 高吞吐。
- 支持很多 Hugging Face 模型。
- 支持 LoRA 服务能力。
典型使用方式:
vllm serve Qwen/Qwen2.5-7B-Instruct
应用侧可以按 OpenAI-compatible 方式请求:
POST http://localhost:8000/v1/chat/completions
适合:
我要把开源模型部署成稳定 HTTP 服务,供业务系统调用。
你需要重点关注:
dtype:通常在 fp16 / bf16 / fp8 之间选择。max_model_len:上下文越大,KV Cache 成本越高。gpu_memory_utilization:显存利用率开太高容易 OOM。max_num_seqs和max_num_batched_tokens:决定并发和 batch 调度上限。tensor_parallel_size:多卡切分模型时必须和硬件匹配。
vLLM 的优势主要出现在服务化场景:
多个请求同时进来
↓
调度器把它们合成 batch
↓
PagedAttention 管理 KV Cache
↓
在吞吐和延迟之间做平衡
如果只有一个用户在本地聊天,vLLM 的优势不一定明显。
SGLang¶
SGLang 更偏复杂推理程序和高性能服务。
典型特点:
- OpenAI-compatible API。
- RadixAttention。
- 自动复用共享前缀和 KV Cache。
- continuous batching。
- 结构化生成。
- 适合 agent、RAG、多轮和分支生成。
适合:
我的请求不是单次问答,而是有多轮、工具、检索、结构化输出和重复前缀。
如果你做 Agent 产品,SGLang 这类框架的思路值得重点看。
SGLang 更值得关注的点是“程序化推理”:
- 多轮提示和分支生成。
- RAG / Agent 中大量共享前缀的复用。
- JSON、正则、schema 等结构化生成。
- 复杂调用链里的吞吐和缓存复用。
简单说,vLLM 更像通用高吞吐模型服务器;SGLang 更强调把复杂 LLM 程序跑得更高效。
OpenAI-compatible API¶
很多部署框架会提供:
POST /v1/chat/completions
POST /v1/completions
这意味着应用侧可以复用类似 OpenAI 的 HTTP 请求格式。
例子:
curl http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "local-model",
"messages": [
{"role": "user", "content": "解释一下 KV Cache"}
],
"temperature": 0.3
}'
注意:
OpenAI-compatible 不等于完全支持 OpenAI 的所有参数和行为。
不同框架、不同模型、不同版本支持的字段可能不一样。
部署参数¶
常见部署参数分三类。
模型加载¶
| 参数 | 直觉 |
|---|---|
model |
模型路径或模型 ID |
dtype |
计算精度,如 fp16、bf16 |
quantization |
量化方式 |
max_model_len |
最大上下文长度 |
tensor_parallel_size |
多 GPU 切分模型 |
服务性能¶
| 参数 | 直觉 |
|---|---|
max_num_seqs |
同时处理多少序列 |
max_num_batched_tokens |
一个 batch 里最多多少 token |
gpu_memory_utilization |
允许使用多少 GPU 显存 |
enable_prefix_caching |
是否启用前缀缓存 |
生成行为¶
| 参数 | 直觉 |
|---|---|
temperature |
随机性 |
top_p |
候选 token 范围 |
max_tokens |
输出长度 |
stop |
停止条件 |
怎么选¶
第一轮可以这样选:
本地试模型:llama.cpp
Python 本地集成:llama-cpp-python
GPU 服务化:vLLM
复杂 Agent/RAG 推理链:SGLang
真实项目里也可以组合:
开发机:llama.cpp
测试环境:vLLM 单卡
生产环境:vLLM 或 SGLang 多卡
选型决策流程¶
可以按这条链路判断:
1. 只是本地体验?
是:llama.cpp
否:继续
2. 是否需要 GPU 服务化和并发?
是:vLLM 或 SGLang
否:llama-cpp-python 或简单本地 server
3. 请求是否有大量重复前缀、复杂推理链、结构化生成?
是:重点评估 SGLang
否:优先 vLLM
4. 是否需要生产多租户、鉴权、限流、审计?
是:部署框架外面还要加网关和平台层
否:单机 server 足够开始
生产服务还缺什么¶
部署框架只解决“模型如何生成”,不是完整生产系统。
线上通常还需要:
- API Gateway:鉴权、限流、租户隔离、路由。
- Model Router:按模型、成本、延迟和能力选择后端。
- Queue / Scheduler:削峰、排队、取消和超时。
- Observability:请求日志、trace、TTFT、TPOT、吞吐、错误率。
- Eval Pipeline:升级模型或参数前做回归评测。
- Cache:prompt cache、prefix cache、业务层结果缓存。
- Safety:内容过滤、工具权限、敏感数据处理。
如果你做 Agent,还要额外处理:
- 工具执行沙箱。
- 多轮状态存储。
- loop 停止条件。
- 人工审批。
- trace 回放和失败归因。
这些内容分别在 大型 Agent 系统架构设计、Loop Engineering 和 Agent 安全与 Guardrails 展开。
压测时看什么¶
不要只看“能不能跑”。
至少看:
- TTFT:首 token 延迟。
- TPOT:每个输出 token 平均耗时。
- Throughput:单位时间输出 token 数。
- Concurrency:并发请求数。
- GPU memory:显存占用。
- Error rate:错误率。
- OOM:是否容易显存溢出。
压测时至少记录这几组条件:
| 条件 | 为什么重要 |
|---|---|
| 输入 token 长度 | 决定 prefill 成本和 KV Cache 大小 |
| 输出 token 长度 | 决定 decode 时间和总吞吐 |
| 并发请求数 | 决定调度压力 |
| 是否 streaming | 影响用户感知延迟和连接占用 |
| 是否启用 prefix cache | 对 RAG / Agent 前缀复用影响很大 |
| 模型精度和量化方式 | 影响显存、速度和效果 |
不要只测一个“你好”。部署框架在真实业务里的表现,通常被长上下文、并发、流式输出和失败恢复决定。
下一步¶
继续看: