news 2026/11/2 22:35:57

vLLM/SGLang/Ollama/llama.cpp怎么选?机制与部署实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
vLLM/SGLang/Ollama/llama.cpp怎么选?机制与部署实战

开头我先说个判断:最近后台留言被问得最多的几个问题——"我想跑DeepSeek用哪个引擎"、"Ollama下载模型慢怎么破"、"llama.cpp能不能在手机上跑"——指向的其实是同一个困惑:开源推理引擎这么多,到底该怎么选。

vLLM、SGLang、Ollama、llama.cpp这四个名字,几乎出现在所有大模型部署的讨论里,但它们的定位、原理、适用场景差异很大。把它们的机制搞清楚,比收藏一百份部署教程都管用。这篇文章我尽量用大白话把这些引擎的底细拆开,给出一套可落地的选型思路,再附上我实测过的部署细节与踩坑记录,适合正在纠结「用哪个跑模型」的开发者、以及想本地部署大模型但被各种报错劝退的入门玩家。

1. 四个引擎的底层机制,先搞清楚它们在干什么

选型的前提是理解差异。这四个引擎虽然都能加载模型并提供推理接口,但它们的底层设计哲学完全不同,从内存管理到调度方式再到硬件支持范围,各自都有一套路数。

1.1 vLLM:PagedAttention 与连续批处理

vLLM的核心创新是PagedAttention,中文社区一般翻译成"分页注意力"。这个机制解决的问题很具体:大模型推理时,KV Cache(键值缓存)占用的显存极其夸张。跑一个7B模型,上下文长度拉到32K的时候,KV Cache可能占到20多GB显存,比模型权重本身还大。

传统方案在推理前就要把整段上下文的KV Cache一次性分配好,在这个过程中,显存碎片化问题特别严重,实际利用率经常不到60%。不同请求的长度不一样,有的问一句就完事,有的要读一整篇文档,预分配的空间要么浪费,要么不够用。

PagedAttention的思路跟操作系统管理内存一模一样——把连续的逻辑显存拆成固定大小的物理块,按需分配、用多少分多少,中间还能做块复用。这就是为什么vLLM在长上下文、高并发场景下能把显存利用率和吞吐量都拉上去。

另一个关键特性是Continuous Batching(连续批处理)。以前GPU推理是"攒一批请求再一起算",迟到的请求必须等下一轮,GPU空闲时间不少。vLLM做到了流式调度,一个序列的某个token算完,立刻释放资源,把新请求接进来,整个GPU始终处于满载状态。这两个机制加在一起,vLLM就成为生产环境中GPU资源利用率的天花板。

但这套机制对GPU要求也高。PagedAttention的CUDA kernel实现非常精细,只在NVIDIA GPU和部分AMD GPU上跑得顺。如果你的机器只有CPU、或者显卡太老不支持CUDA,vLLM基本没有用武之地。

1.2 SGLang:结构化生成语言与RadixAttention

SGLang全称是Structured Generation Language,它跟vLLM解决同一个问题——高并发、高吞吐的在线推理服务。但切入角度不一样。SGLang更在意的是"请求和请求之间的共享计算",核心利器叫RadixAttention,一种带前缀树结构的KV Cache复用机制。

举个例子:你做一个AI客服,100个用户同时提问,前30个字都是"你好,我是你们的会员,关于订单问题……",传统推理引擎会把这段公共前缀在每张GPU上重复计算100次。SGLang把KV Cache组织成前缀树,相同前缀只算一次,后面的分支各自生长。遇到系统提示词、少样本示例这种高度复用的场景,省下的算力非常可观。

SGLang还提供了一套受限解码能力,可以在推理时约束输出格式,比如强制生成合法的JSON或正则匹配结果。工程上做结构化输出、工具调用这类场景时,这个能力很实用。不足之处是它对使用者的工程素养要求更高,想充分发挥前缀复用的优势,部署层面需要更多的调优经验,而且社区的生态、镜像更新速度目前还是比vLLM稍逊一筹。

1.3 Ollama:以"好用"为第一原则的本地服务

Ollama在我看来是"本地优先"路线的集大成者,它的定位不是生产级推理调优,而是把模型部署这件事做到拿到手就能跑。Ollama本身是一个由llama.cpp等后端引擎驱动的封装服务,你只需要ollama run qwen3:32b,剩下的下载模型、创建服务、暴露API,它全都帮你搞定。

Ollama屏蔽了工程细节,换来的是极度友好的上手体验,这也是它在开发者社区和普通用户群体中爆火的原因。它的架构很聪明:底层推理使用llama.cpp作为主要后端,同时也能适配不同硬件平台,然后自己做了一个模型管理仓库和HTTP API层。用户看到的是一个"模型商店加一键启动器"。

这种设计在便利性和可控性之间做了取舍。Ollama的推理参数默认是保守调优过的,大多数情况下能跑,但你想追求极致吞吐或者用特殊量化策略,就会觉得它的封装太厚,不如直接操作底层引擎来的顺手。不过对于个人开发、原型验证、以及需要快速把模型集成到应用里的场景,这个取舍完全值得。

另外提醒一下,网上经常有LM Studio和Ollama的对比。LM Studio更像一个图形化桌面工具,侧重本地聊天和模型浏览,Ollama则带有服务端属性,更适合作为应用的后端API。两者不冲突,看你需要的是"一个本地聊天软件"还是"一个能接入自己代码的模型服务"。

1.4 llama.cpp:生于边缘的罗塞塔石碑

llama.cpp的起点就带着一个非常现实的目标:让Meta的Llama模型跑在普通消费级CPU上。它的作者Georgi Gerganov用纯C/C++重写了推理核心,研究了GGUF量化格式,让大模型在没NVIDIA显卡的机器上也能以可接受的速度运行。

GGUF量化的核心是把模型权重从16位浮点数压缩到8位、4位甚至更低。Q4_K_M这种量化等级,能把70B模型压到40GB以内,同时把推理精度控制在合理范围。这就是llama.cpp能成为"罗塞塔石碑"的原因——它不挑硬件,从老旧的x86笔记本到树莓派、再到Android手机,只要有一个能跑C语言的环境,它就能把模型运行起来。

llama.cpp还有一层价值:它是Ollama等上层服务的重要底层组件,许多个人开发者用自己的C++程序直接调用它的库来做端侧推理。最近社区里关于"llama.cpp作为本地编程助手"的讨论很多,其实就是把代码补全模型部署在无GPU的开发机上,靠CPU推理实现轻量级的补全服务,延迟虽然比GPU高,但对日常写代码来说已经足够流畅。Android版llama.cpp则让"手机本地跑模型"从概念变成了真的可用的东西,我身边有朋友在高铁上用手机本地跑一个小模型写摘要,体验其实出乎意料地好。

2. 选型判断:先回答三个问题,再做选择

很多人的误区是一上来就问"哪个引擎最强",这个问法本身就是错的。正确答案取决于你手里有什么硬件、跑什么业务、要什么效果。我建议做选型之前先回答下面三个问题。

2.1 资源画像:你的显卡到底什么段位

第一步就是盘点硬件。显存大小直接决定了你能跑多大参数的模型、能不能用vLLM和SGLang这类高性能引擎。

以一张24GB显存的RTX 4090为例:跑7B模型,FP16精度大约需要14GB显存,全量的KV Cache留给长上下文会吃力,所以vLLM的PagedAttention在这个场景下才有发挥空间。如果手里是8GB显存的RTX 4060,那就得走量化路线,GGUF Q4格式更适合你。如果机器完全没独显,只有16GB内存,那llama.cpp就是主力选择,靠量化模型和CPU推理实现"能跑"的目标。

这里有一个实用建议:用"模型权重显存 + 上下文KV Cache显存 + 20%余量"这个公式去粗算。比如某个13B模型权重FP16大约是26GB,你只有24GB显存,那必须量化或者换更小的模型,后路就是git下个GGUF版本用llama.cpp跑。

2.2 业务形态:研究实验还是生产接口

第二个问题是你的业务场景。做本地聊天、跑通一个demo、给学生演示AI能力,Ollama是最省心的答案,它的API和OpenAI格式兼容,代码链路很短。但如果要把模型服务作为真正的生产接口,承载线上请求、提供SLA保障,那vLLM或SGLang才是靠谱的选择。

它们之间的取舍也看业务形态。请求场景里有大量共享前缀,比如重复的系统提示词、大量长文档问答,SGLang的前缀复用机制能省下不少计算。如果业务请求五花八门、相互之间没有重叠,vLLM的PagedAttention和连续批处理带来的综合吞吐提升更明显。一般团队没有精力做精细调优的话,我通常会建议先用vLLM,它的默认策略更稳健,翻车概率低。

2.3 一张表看清四个引擎的边界

把几个引擎的边界整理成一张对照表,日常选型的时候对着看就清楚多了:

引擎硬件侧重最强场景主要短板推荐人群
vLLMNVIDIA/AMD GPU高并发生产服务、长上下文显存门槛高、只支持GPU有GPU服务器资源的团队
SGLangNVIDIA GPU前缀高度复用的服务场景调优复杂、生态较年轻有算法调优能力的团队
Ollama跨平台CPU/GPU个人本地部署、快速原型封装厚、高并发性能一般所有想快速跑模型的开发者
llama.cppCPU/边缘设备/GPU无GPU机器、智能终端吞吐弱、部署需要手动编译边缘开发者、资源受限场景

这张表不是绝对的,比如Ollama底层也可以加载量化模型跑得不错,llama.cpp同样支持GPU加速层。但大体方向不会错:想高性能就上vLLM/SGLang,想把模型塞进任何设备里llama.cpp永远是最低保障,而Ollama则是从零到一最快的路径。

3. 部署实操:从零跑通一条生产链路

选型定了之后,真正的坑才开始出现。这里我挑三个最常被问到的、也是我实际部署过多次的场景,把关键步骤和细节写透。

3.1 vLLM的Docker化部署细节

vLLM官方提供了Docker镜像,版本号同步更新。我最近部署新版GLM的时候社区在问"该用哪个版本的vLLM镜像",这个问题的标准答案其实不难找——VLLM_VERSION这个环境变量会写入模型的requirements文件,看模型发布方在文档里标明的适配版本就行。如果没标明,优先选最新release版本,再对照模型仓库的Issue区确认。比如加载qwen3-embedding-0.6b这类embedding模型,官方镜像v0.27.1就有合入支持,直接拉对应tag的镜像即可。

部署命令我给一个我自己在用的模板:

# 拉取镜像,tag自行替换 docker pull vllm/vllm-openai:v0.27.1 # 启动服务 docker run --runtime nvidia --gpus all \ -p 8000:8000 \ -v /path/to/models:/models \ --ipc=host \ vllm/vllm-openai:v0.27.1 \ --model /models/qwen3-embedding-0.6b \ --max-model-len 32768 \ --gpu-memory-utilization 0.9 \ --enforce-eager

--max-model-len这个参数我单独说。它控制模型接受的最大输入长度,数值越大会占用越多的KV Cache预分配空间。很多人报错"CUDA out of memory"就是因为这个值设太高了,和PagedAttention节省显存的机制互相冲突。经验法则是:普通对话场景从8192开始调试,长文档场景再逐步加到16384或32768,每加一次都观察显存占用是否在安全线内。

--gpu-memory-utilization也不是设越大越好。0.9的意思是允许vLLM使用90%的显存做KV Cache,剩下的留给模型权重和临时计算。但如果你在同一块GPU上同时还跑着别的服务,就必须把这个值调低,避免相互挤占导致OOM。

--enforce-eager这个参数推荐在首次部署时加上。它关闭了CUDA graph优化,但能显著加快启动速度,等确认模型能稳定跑通之后再去掉也不迟。我见过太多人第一次启动vLLM就报CUDA相关错误,加上这个参数能少走很多弯路。

另一个容易忽略的细节是启动线程数。如果设备上CPU核数很多且显存充足,可以在启动参数里加上--num-cpu-threads或者让调度器自动配置。不过这个参数普通用户几乎不用动,默认值在多数场景下表现已经足够好。

3.2 Ollama的安装与模型管理实操Ollama的安装使用本身没什么门槛,真正让人头疼的是模型的下载速度。从官方仓库拉取大模型动辄几十个GB,如果网络状况一般,一个7B模型能下一天。解决思路有两个方向:配置国内镜像源、或者离线安装包。

配置镜像源的方式是通过环境变量指定模型下载地址。在Linux下,执行前先设置OLLAMA_MODELS路径和镜像源地址:

# 设置模型存储路径,避免占用系统盘 export OLLAMA_MODELS=/data/ollama/models # 使用镜像源(此处用国内镜像) export OLLAMA_HOST=0.0.0.0:11434 # 国内镜像加速(举例) export OLLAMA_BASE_URL=https://ollama.example.com # 启动服务 ollama serve

不过这只是一个可用方案,不同平台的镜像源地址更新频繁,而且Windows和macOS下环境变量的设置位置不一样。把环境变量写到系统环境变量文件里比在终端临时导出更稳妥,不然每次重启终端都要重新设置。Windows用户还经常被"安装到D盘"的问题困扰,官方安装包默认路径就是C盘。解决方案是安装完毕后在系统设置里改OLLAMA_MODELS指向D盘目录,再把原本C盘里的模型文件夹迁移过去。这个流程比卸载重装安全得多。

离线安装包的问题更常见。在无外网的生产环境里部署Ollama,直接从有网的机器导出模型就行。ollama pull完成后,模型文件都躺在OLLAMA_MODELS目录下,把整个目录打包带走,在目标机器解压到同样的路径,然后重启ollama serve,模型列表自然就出现了。注意一点:不同操作系统之间迁移模型目录要小心,跨平台模型文件通常可以复用,但路径权限问题会经常冒出来,Linux和Windows之间建议用tar打包而不是直接拷贝。

我自己的实践是,在离线服务器上准备一个固定的/opt/ollama-models挂载盘,环境变量固定指向这里,团队里谁要加模型就通过U盘拷过来解压,非常省事。

3.3 llama.cpp的高效构建与边缘场景落地

llama.cpp的安装和构建比前两者手动得多,但资源受限的机器上它是唯一的答案。构建方式官方文档写得很详细,简单总结就是:

# 克隆代码 git clone https://github.com/ggerganov/llama.cpp cd llama.cpp # 构建,开启GPU加速(如果本机有CUDA) cmake -B build -DGGML_CUDA=ON cmake --build build --config Release -j

如果目标是CPU推理,把GGML_CUDA这项去掉即可。构建时有个小技巧:可以用-j参数指定并行度,我的8核机器一般用-j 8,几十秒就能完成。构建完成后,运行模型的方式一般是:

./build/bin/llama-cli \ -m /path/to/model.Q4_K_M.gguf \ -p "写一段关于推理引擎的代码" \ -n 256 -t 8 --temp 0.7

-t参数指定线程数,实测下来在CPU密集型机器上设成物理核心数而不是逻辑线程数,性能曲线更平滑。--temp控制生成随机性,代码补全场景我习惯调低到0.2左右,生成内容更稳定,不容易出现自由发挥。

edge场景下的一个真实案例是"llama.cpp作为本地编程助手"。我在一台无GPU的旧笔记本上跑了qwen2.5-coder-7B的Q4量化版,8线程推理,补全一句代码大约需要1到2秒,写工具的体感完全可接受。更夸张的是Android版,有人用骁龙888在手机上跑0.5B和1.5B的小模型,聊天延迟在一秒以内,日常记录灵感、离线翻译这些场景绰绰有余。

llama.cpp同样可以开启一个HTTP服务端,模拟OpenAI接口,这样你不需要自己写C++调用代码也能对接开源生态的工具链:

./build/bin/llama-server \ -m /path/to/model.Q4_K_M.gguf \ --host 0.0.0.0 --port 8081 \ -t 8

这种方式的好处是部署形态非常轻,一个可执行文件加一个模型文件就能跑整个服务,对嵌入式设备尤其友好。

4. 常见错误排查与避坑实录

这部分是我最想写的,因为很多问题从报错信息到实际原因之间隔了好几层。

4.1 500 Internal Server Error:llama-server进程

如果你用Ollama时经常碰到这样的报错:

ollama run qwen3.5:2b error: 500 internal server error: llama-server process

这个报错几乎90%的原因不是Ollama本身坏了,而是Ollama尝试启动llama-server进程的时候失败了。导致失败的原因通常是:显存不够、模型文件损坏、或者系统没装齐全的依赖库。

排查步骤我按顺序排一下:

  1. 验证模型文件完整性:ollama rm删除问题模型后重新pull。文件损坏是下载中断留下的后遗症,也是概率比较高的原因。
  2. 检查显存占用:用nvidia-smi看显存是否被占满。Ollama默认在显存不够时会切回CPU推理,但某些模型的GGUF设置可能有问题,导致切换失败,报500。
  3. 看Ollama日志:Linux下用journalctl -u ollama -f或者直接前台运行ollama serve看打印输出,错误原因会直接出现在日志里,比猜有效得多。

我还遇到过一次很奇怪的情况:只要拉了大参数模型再跑小模型,就会报500。原因后来定位到Ollama的模型加载器在显存不足时不能正确释放旧模型,把Ollama重启一下就恢复了。这种时候别瞎折腾别的,先重启服务。

4.2 模型下载太慢与离线安装方案

"ollama下载太慢"是这个话题下出现频率最高的问题。模型仓库的带宽瓶颈客观存在,尤其是每次版本更新后会重新拉取整个模型文件。我的建议是两条路并行:

一条是配国内镜像。Ollama的模型下载可以通过OLLAMA_BASE_URL环境变量指向代理服务,这样既解决了速度问题,也可以在内网环境里搭建一个模型分发中心,方便团队成员共享模型文件。需要注意的是地址写法要精确匹配,别漏了协议头。

另一条是离线导入。如果你的模型文件已经以GGUF格式存在,可以用下面这个命令把它导入Ollama:

ollama create my-model -f Modelfile

Modelfile里面写上基础模型路径或者FROM /path/to/model.gguf,Ollama就会在本地创建一条模型记录,不再需要从远程仓库下载。这个方法在封闭开发环境里特别管用,也是我处理离线部署最常用的手段。

4.3 几个实操中的"经典决策"

这一节记录几个我在实际部署中反复遇到、且网上资料说得不清楚的决策点。

第一个是关于"Qwen3.5强制不思考"的。新版Qwen模型默认开启了思考模式,在Ollama里如果不想让模型输出思考过程,可以用Modelfile修改提示模板参数,比如设置--no-thinking之类的参数,或者在调用时通过API参数关闭推理模式。不同版本和量化格式支持的参数名不一样,最稳的办法是去模型主页看它支持的chat template参数,直接在对话时传进去。

第二个是向量模型与embedding模型的加载问题。有朋友问"Ollama安装了向量模型后如何使用",实际上Ollama支持加载embedding模型,调用方式和普通对话模型类似,API返回的字段是嵌入向量而不是对话文本。对RAG应用来说,Ollama作为向量生成服务完全够用,但批量大量文本嵌入时的性能、并发能力不如专门的embedding服务,这个需要取舍。

第三个是"Ollama怎么不支持NPU"。这个问题在国产AI芯片讨论里经常出现,Ollama目前的生态主要围绕CUDA、ROCm和CPU三大类后端开发,对NPU的支持确实缺失。如果你必须在非NVIDIA的国产芯片上跑模型,与其执着于Ollama,不如直接用llama.cpp这一层适配,或者考虑对接各芯片厂商自带的推理框架,反而更简单。

第四个被问爆的场景是"通过Docker部署Ollama"和"docker vllm加载qwen3-embedding"。Docker部署Ollama的关键就一条:把模型目录映射出来,别让容器删掉后模型跟着消失。

docker run -d \ -v /da/ollama:/root/.ollama \ -v /da/ollama-models:/models \ -p 11434:11434 \ ollama/ollama

而embedding模型在vLLM里加载,本质上就是vLLM在0.27.1之后原生支持了文本嵌入模型的推理,只要把权重路径指向embedding模型所在的目录即可。需要注意vLLM默认把第一个维度当作batch引索,embedding模型加载时可能要调整--task参数为embedding,否则返回内容会不符合预期。

5. 我的最终建议与一点经验

说了这么多,最后给一个我个人的经验总结。很多人把选引擎当成一个"技术选型、配置对比"的问题,但我觉得本质上是一个"资源与需求匹配"的问题。

如果你是一个独立开发者,想在自己的电脑上快速跑通一个模型应用,直接Ollama,别犹豫。它的模型管理、API兼容性、多平台支持,能帮你省下一个下午的调参时间。等你的应用有了一定并发,再考虑把Ollama换成vLLM。

如果你是团队负责人,手上有几张24GB以上的GPU,业务要支撑真实用户请求,那我建议先上vLLM,它是生产环境中最不容易翻车的选择。它的默认参数比较稳重,遇到性能瓶颈再研究SGLang的前缀复用优化。

如果你是嵌入式或者边缘计算方向的人,llama.cpp是绕不开的。它不只是"能跑",而是目前唯一能把大模型塞进各种奇怪硬件里的方案。它值得你花时间学。

这些年我部署过的模型、踩过的坑真的不少,曾经在一个GPU服务器上为了让vLLM跑稳一个长上下文任务,来回调了三天参数,最后发现问题只是--max-model-len设太高。很多技术问题,一旦理解了底层机制,解决起来其实非常简单。希望这篇文章能帮你少走一些弯路。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/11/2 22:33:16

大模型系统性入门:从原理、提示词工程到微调与部署的完整路径

写给想做“大模型”的人:一份真正能照着走的系统性入门资料这两年我经常在后台收到一类问题:“想学大模型,我应该买什么课?看哪本书?能不能直接甩我一份资料清单?”说实话,每次看到这种问法我都…

作者头像 李华
网站建设 2026/11/2 22:32:18

数控编程入门:G代码与M代码指令手册使用指南

简介:这份TOSNUC888指令手册是东芝机械TOSNUC 888数控系统G代码、M代码部分的中文翻译资料,面向从事数控编程、机床操作与调试的技术人员及学习者,可用于查阅指令功能、理解代码含义并指导实际编程应用。压缩包内共1个doc文档,约2…

作者头像 李华
网站建设 2026/11/2 22:31:04

系统仿真入门:从VHDL测试基准到FPGA设计验证

简介:这份PPT课件围绕系统仿真展开,面向电子设计与EDA学习者,尤其是正在接触VHDL与FPGA/CPLD开发流程的初学者和授课教师,帮助其在硬件制造前借助计算机模型验证电路逻辑、理解仿真在电子设计中的定位。压缩包内仅含1个PPT文件&am…

作者头像 李华
网站建设 2026/11/2 22:26:30

FPGA纯RTL点亮TFT RGB屏:彩条时序与上板调试

简介:面向FPGA初学者与显示驱动开发者的Altera平台RGB液晶屏驱动工程包,围绕TFT RGB接口与Colorbar测试图案展开,可用于学习像素时钟、行场同步、并行RGB数据传输及Quartus工程组织方式。压缩包共126个文件,约3.43MB,包…

作者头像 李华
网站建设 2026/11/2 22:26:26

Jev 深度解析:TypeSafe AI 如何让大模型输出可校验、可集成

1. 从热搜词里拆解 Jev 的真实身份先把结论摆在前面:Jev 不是一个单纯的聊天工具,也不是某个厂商的硬件产品,它更像是一套围绕“类型安全”思路构建的 AI 开发与使用范式。热搜词里同时出现了TypeSafe AI、System One Model、SDK、API、jev模…

作者头像 李华
网站建设 2026/11/2 22:21:26

Matlab车牌识别全链路拆解:预处理、定位、切割与模板匹配

简介:围绕Matlab车牌识别课程设计整理的一份docx报告,面向信息科学、自动化等专业需要完成课程设计或图像处理入门实践的学生,帮助梳理从车辆检测、图像采集到牌照定位、字符分割与号码输出的完整实现思路。文档共1个文件,为单份d…

作者头像 李华