本文命令以 2026-10 的官方文档为准逐条核对过。这几个工具迭代很快,动手前建议再对一眼官方文档。
为什么要自己在本地部署
调用云端 API 简单,但有些场景绕不开自建:
- 数据不出内网:公司文档、代码、业务数据不方便传到第三方
- 可控性:固定版本的模型、固定上下文长度、自己控制并发与限流
- 成本:长期高并发下,自建 GPU 可能比按 token 计费更划算
- 折腾/学习:想搞清楚 SFT 后的模型、量化版本到底表现如何
代价也很直接:显存、电费、运维。所以第一个问题是——你到底需要哪一档。
一句话定位
| Ollama | vLLM | SGLang | |
|---|---|---|---|
| 面向场景 | 个人本机使用 | 服务化推理 | 生产级高并发服务 |
| 底层引擎 | llama.cpp | 自研(PyTorch) | 自研(PyTorch) |
| 模型来源 | 官方模型库;可导入 GGUF / Safetensors | HuggingFace 权重 | HuggingFace 权重 |
| 平台 | macOS / Linux / Windows | Linux + NVIDIA(macOS 需 vLLM-Metal) | Linux + NVIDIA |
| 招牌能力 | 一条命令跑起来,集成 Claude Code、Codex 等客户端 | PagedAttention、连续批处理、前缀缓存 | RadixAttention、前缀缓存、多机多卡 |
| 典型用法 | 本地助手、离线试玩 | 单机多并发 API | 多轮对话 / Agent / RAG 类高并发 |

三者都提供 OpenAI 兼容接口,所以代码里通常只需要改 base_url 就能切换——可以先用 Ollama 在笔记本上开发,上线时再切到 vLLM 或 SGLang。
官方文档与仓库
| 工具 | 官方文档 | 代码仓库 |
|---|---|---|
| Ollama | docs.ollama.com | ollama/ollama |
| vLLM | docs.vllm.ai | vllm-project/vllm |
| SGLang | docs.sglang.io | sgl-project/sglang |
几个值得单独收藏的深链接:
- vLLM 全部引擎参数:docs.vllm.ai/configuration/engine_args
- vLLM OpenAI 兼容服务说明:docs.vllm.ai/serving/openai_compatible_server
- PagedAttention 原始介绍(vLLM 博客):blog.vllm.ai/2023/06/20/vllm.html
- SGLang 全部启动参数:docs.sglang.io/advanced_features/server_arguments
- SGLang 快速开始:docs.sglang.io/get-started/quickstart
- Ollama CLI 手册:docs.ollama.com/cli
- Ollama OpenAI 兼容说明:docs.ollama.com/api/openai-compatibility
Ollama:五分钟跑起来
安装
# macOS / Linux
curl -fsSL https://ollama.com/install.sh | sh
# Windows (PowerShell)
irm https://ollama.com/install.ps1 | iex
常用命令
ollama run gemma4 # 跑一个模型(首次会自动拉取)
ollama pull gemma4 # 只下载
ollama ls # 本地已有模型
ollama ps # 正在运行的模型
ollama stop gemma4 # 停止
ollama rm gemma4 # 删除
ollama serve # 启动服务,默认监听 11434
新版还带了 ollama launch,可以直接把本地模型接进常用客户端:
ollama launch # 交互式选择要接入的客户端
ollama launch claude # 接入 Claude Code
ollama launch claude --model qwen3.5 # 指定模型
支持的客户端包括 OpenCode、Claude Code、Codex、VS Code、Droid;加 --config 可以只写配置不启动。
原生 API
curl http://localhost:11434/api/chat -d '{
"model": "gemma4",
"messages": [{ "role": "user", "content": "你好" }],
"stream": false
}'
OpenAI 兼容接口
from openai import OpenAI
client = OpenAI(
base_url="http://localhost:11434/v1/",
api_key="ollama", # 必填,但 Ollama 会忽略
)
resp = client.chat.completions.create(
model="gpt-oss:20b",
messages=[{"role": "user", "content": "你好"}],
)
print(resp.choices[0].message.content)
导入自己的模型
写一个 Modelfile:
# 单个 GGUF 文件
FROM /path/to/model.gguf
# 分片 GGUF
FROM /path/to/model-*.gguf
# 或 Safetensors 权重目录
FROM /path/to/safetensors/dir
三种写法按你的权重形态任选其一(一个 Modelfile 只能有一个 FROM)。
然后创建并用:
ollama create my-model
ollama run my-model
注意:Ollama 导入时不会量化 GGUF,想控制量化等级得先用 llama.cpp 的 llama-quantize 处理,再导入。
局限(写进代码前先知道)
- OpenAI 兼容层不支持
tool_choice、logit_bias、n、logprobs;图片只接受 base64,不支持图片 URL - 上下文长度没有 API 参数:要在
Modelfile里写PARAMETER num_ctx,再用ollama create生成一个自定义模型 - 需要和
gpt-3.5-turbo这类固定模型名的工具配合时,用ollama cp做个别名 - 它的设计目标是本机单人使用,高并发服务化不是它的强项
vLLM:把单机吞吐拉满
安装
# Linux + NVIDIA(Python 3.11 ~ 3.14)
uv pip install vllm --torch-backend=auto
# AMD GPU
uv pip install vllm --extra-index-url https://wheels.vllm.ai/rocm/
# Google TPU
uv pip install vllm-tpu
起服务
vllm serve Qwen/Qwen2.5-1.5B-Instruct
默认在 http://localhost:8000 提供 OpenAI 兼容接口(--host、--port 可改)。要加鉴权就带 --api-key,或者设环境变量 VLLM_API_KEY。
调用
curl http://localhost:8000/v1/models
curl http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "Qwen/Qwen2.5-1.5B-Instruct",
"messages": [{"role": "user", "content": "你好"}]
}'
from openai import OpenAI
client = OpenAI(base_url="http://localhost:8000/v1", api_key="EMPTY")
除了 OpenAI 兼容 API,新版还提供 Anthropic Messages API 和 gRPC。
常用部署参数
vllm serve 的旋钮基本都在引擎参数里,最常调的是下面这些(完整清单见上面列的 engine_args 文档页):
| 参数 | 默认值 | 作用 |
|---|---|---|
--tensor-parallel-size / -tp |
1 |
张量并行组数,单机多卡最常用 |
--pipeline-parallel-size / -pp |
1 |
流水线并行组数 |
--max-model-len |
从模型 config 自动推导 | 上下文长度(prompt + 输出);支持 1k(1000)、1K(1024)这类写法,也可以给 -1 / auto 让它自己取显存能容下的最大值 |
--gpu-memory-utilization |
0.92 |
显存占用比例;注意它是按实例算的,不会感知同一张卡上的其他实例 |
--max-num-seqs |
— | 单轮最多处理多少个序列;文档说明默认值主要图测试方便,生产环境建议显式设置 |
--max-num-batched-tokens |
— | 单轮最多处理多少 token,同上建议显式设置 |
--enable-prefix-caching |
— | 开前缀缓存,相同前缀只算一次 |
--enable-chunked-prefill |
— | 分块预填充,长 prompt 不再独占一整轮 |
--dtype |
auto |
权重与激活精度(auto / half / bfloat16 / float / float32) |
--quantization / -q |
无 | 量化方法;不指定时读模型 config 里的 quantization_config |
--kv-cache-dtype |
auto |
KV cache 的存储精度,想省显存可以设 fp8 系列 |
--block-size |
用默认值 | 连续 cache block 的 token 数 |
--served-model-name |
同 --model |
对外暴露的模型名,可以传多个 |
--enforce-eager |
关 | 关掉 CUDA graph / torch.compile 跑 eager,排查问题时的开关 |
--trust-remote-code |
关 | 允许执行模型仓库里的自定义代码 |
--download-dir |
HuggingFace 默认缓存 | 权重下载目录 |
组合起来的一个例子:
vllm serve Qwen/Qwen2.5-7B-Instruct \
--tensor-parallel-size 2 \
--max-model-len 32768 \
--gpu-memory-utilization 0.90 \
--max-num-seqs 64 \
--enable-prefix-caching \
--served-model-name qwen2.5-7b
为什么它吞吐高
- PagedAttention:把 KV cache 按页管理,显存碎片和浪费大幅降低(思路来自操作系统的虚拟内存分页)
- 连续批处理:请求随到随插,一个 batch 里的序列结束就立刻补新的,不用等整批跑完
- 分块预填充:长 prompt 的 prefill 拆块调度,避免长请求把整个 batch 卡住
- 前缀缓存:相同前缀(比如固定 system prompt)只算一次
- 注意力后端可换:FLASH_ATTN / FLASHINFER / TRITON_ATTN
这些机制的意义是:并发越高,它相对朴素实现的优势越明显;只有一个人在用的时候,差别不大。
SGLang:为前缀复用而生
安装
uv venv --python 3.12 && source .venv/bin/activate
# --prerelease=allow 不能省:少了它可能装上旧版本
uv pip install --prerelease=allow sglang
要求 Python 3.10+,当前版本要求 CUDA 13(CUDA 12 的构建线已退役,0.5.19 是最后一个支持 CUDA 12 的版本),目标平台是 Linux + NVIDIA。默认注意力后端是 FlashInfer,需要 sm75 及以上。
起服务
sglang serve meta-llama/Llama-3.1-8B-Instruct --host 0.0.0.0 --port 30000
等价的传统写法(文档里在容器、SkyPilot 等场景仍在用):
python3 -m sglang.launch_server \
--model-path meta-llama/Llama-3.1-8B-Instruct \
--host 0.0.0.0 --port 30000
调用
curl http://localhost:30000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "Qwen/Qwen3-0.6B",
"messages": [{"role": "user", "content": "你好"}]
}'
它同样提供 OpenAI 兼容接口,所以 Python 里把 base_url 指到 http://localhost:30000/v1 即可。
常用部署参数
完整清单可以跑 python3 -m sglang.launch_server --help,或者查上面列的 server_arguments 文档页。常用的这些:
| 参数 | 默认值 | 作用 |
|---|---|---|
--model-path / --model |
— | 模型权重路径或 HuggingFace 仓库 ID |
--host |
127.0.0.1 |
监听地址;要让外部访问就写 0.0.0.0 |
--port |
30000 |
端口 |
--api-key |
无 | 接口鉴权 |
--tensor-parallel-size / --tp-size |
1 |
张量并行度 |
--pipeline-parallel-size / --pp-size |
1 |
流水线并行度 |
--mem-fraction-static |
无 | 权重 + KV cache 池占显存的比例;显存不够就调小 |
--max-running-requests |
无 | 同时在跑的请求数上限 |
--max-total-tokens |
自动计算 | 显存池里的 token 总数(文档标注为调试用) |
--chunked-prefill-size |
无 | 分块预填充每块的 token 数,-1 表示关闭 |
--context-length |
取模型 config.json | 最大上下文长度 |
--dtype |
auto |
精度(auto / bfloat16 / float16 / float32 …) |
--quantization |
无 | 量化方法(awq / fp8 / gptq / marlin / w8a8_int8 …) |
--kv-cache-dtype |
auto |
KV cache 精度(fp8_e4m3 / fp8_e5m2 / bf16 / nvfp4 …) |
--schedule-policy |
fcfs |
调度策略(fcfs / lpm / lof / random / priority / dfs-weight / routing-key) |
--log-level |
info |
日志级别 |
组合起来的一个例子:
sglang serve Qwen/Qwen3-0.6B \
--host 0.0.0.0 --port 30000 \
--tp-size 2 \
--mem-fraction-static 0.85 \
--context-length 32768 \
--schedule-policy lpm
核心是 RadixAttention
SGLang 的招牌是 RadixAttention + 前缀缓存:用基数树(radix tree)管理 KV cache,把多个请求共享的前缀直接复用。这一点在多轮对话、Agent 循环、RAG 这类”一个长 system prompt 反复被用到”的场景里收益最大——同一段前缀不会每轮重算。它同时支持多机多卡并行(序列并行、DP attention、PD 分离),面向的是生产级服务。
选择示例
- 就在自己电脑上跑个助手、接 IDE → Ollama。装完一条命令能用,macOS 也能跑,不用折腾 CUDA
- 要给团队/应用提供 API,单机扛并发 → vLLM。OpenAI 兼容、生态成熟、显存利用率高
- 高并发且前缀重复多(多轮对话、Agent、RAG、固定 prompt 批量任务)→ SGLang,它的前缀复用正是为这个场景设计的
- 还没想好 → 先用 Ollama 把流程跑通。反正三者都是 OpenAI 兼容接口,之后改
base_url就能迁移
测试构建
想在选型前拿到自己的数据,建议固定这几件事:
- 固定模型和量化版本(同一个权重,别拿 7B 和 72B 比)
- 固定 prompt 集:至少准备短/中/长三档输入,和固定输出长度
- 测四个指标:首 token 延迟(TTFT)、单请求输出速度(tokens/s)、并发下的总吞吐、峰值显存占用
- 并发扫一遍:1 / 4 / 16 / 32 路并发各跑一轮 —— 吞吐拐点才是选型依据
顺带一提:还有这些同类工具
各自占一个生态位,这里只点名不展开:
- llama.cpp:Ollama 底下那一层,最便携的 C/C++ 推理实现,CPU 也能跑
- LM Studio:图形界面的本地推理(也有 CLI),适合不想敲命令的人
- TensorRT-LLM:NVIDIA 官方,把模型编译后在自家卡上榨性能
- LMDeploy:压缩 + 部署一体的工具包(上海 AI Lab)
- Xinference:一个平台把 LLM / embedding / rerank 一起管起来
- LocalAI:自托管的 OpenAI 替代品
- MLC LLM:用编译的方式把模型推到端侧(手机、浏览器)
- ExLlamaV2:消费级显卡上跑 EXL2 量化模型
- Triton Inference Server / KServe:不是推理引擎,而是把多个引擎和模型编排起来对外服务的那一层
另外提醒一句:HuggingFace 自家的 TGI(text-generation-inference)仓库已经归档,新项目不建议再从它起步。
小结
三个工具不是替代关系,而是三段:Ollama 负责”快速验证”,vLLM 负责”稳定扛量”,SGLang 负责”高并发下的前缀复用”。它们都收敛到 OpenAI 兼容接口这件事,让迁移成本变得很低——所以不必一开始就选对,先用起来,瓶颈出现时再换。