大模型推理部署:vLLM、SGLang 与 Ollama 对比


本文命令以 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

几个值得单独收藏的深链接:

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 就能迁移

测试构建

想在选型前拿到自己的数据,建议固定这几件事:

  1. 固定模型和量化版本(同一个权重,别拿 7B 和 72B 比)
  2. 固定 prompt 集:至少准备短/中/长三档输入,和固定输出长度
  3. 测四个指标:首 token 延迟(TTFT)、单请求输出速度(tokens/s)、并发下的总吞吐、峰值显存占用
  4. 并发扫一遍: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 兼容接口这件事,让迁移成本变得很低——所以不必一开始就选对,先用起来,瓶颈出现时再换。


文章作者: Halensea
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Halensea !
  目录