vLLM、SGLang、Ollama、llama.cpp 四大推理引擎选型指南

发布时间:2026/10/31 4:29:41
vLLM、SGLang、Ollama、llama.cpp 四大推理引擎选型指南 1. 这不是选工具是选“算力翻译官”vLLM、SGLang、Ollama、llama.cpp 的本质差异你手头有一台带RTX 4090的服务器或者一台刚装好CUDA驱动的Linux工作站又或者只是想在MacBook Air M2上跑个本地编程助手——这时候打开终端敲下pip install或brew install之前真正该问的不是“哪个快”而是“它到底在替我翻译什么”。vLLM、SGLang、Ollama、llama.cpp这四个名字表面看是四个开源推理引擎实则代表了四套完全不同的“大模型运行哲学”。它们解决的从来不是同一个问题vLLM在GPU显存里做精密调度像一个超高速铁路的信号控制系统SGLang在请求层重构交互逻辑本质是个带编译器的API网关Ollama是面向终端用户的“开箱即用操作系统”把模型、依赖、服务全打包进一个二进制llama.cpp则是彻底放弃GPU用CPUSIMD指令集硬刚目标是让树莓派也能当AI助理。热搜里那些“vllm部署deepseek”“ollama下载慢”“llama.cpp win7”“sglang无nvlink影响多大”根本不是配置问题而是用户在不同哲学体系间强行切换时产生的认知撕裂。比如你在Windows上用Ollama跑qwen2.5报500错误大概率不是模型坏了而是Ollama默认启动的llama-server进程被Windows Defender误杀——它压根没设计成在杀软密集的桌面环境里长期驻留而“cuda128 vllm”这种搜索词暴露的是用户把CUDA版本号当成vLLM参数来调却不知道vLLM根本不认这个字符串它只认--dtype float16和--gpu-memory-utilization 0.9这类显存调度指令。真正的选型起点永远是回答三个问题你的硬件有没有NVIDIA GPU你的用户是谁开发者写代码还是产品经理点网页你愿不愿意为性能牺牲一点易用性这四个引擎没有优劣只有适配——就像不会有人问“螺丝刀和电钻哪个更好”得先知道你要装的是宜家书架还是钢结构厂房。2. 四大引擎底层机制拆解从内存搬运工到指令翻译器2.1 vLLMGPU显存里的“动态内存银行”vLLM的核心创新不是加速而是显存管理革命。传统推理框架如HuggingFace Transformers把每个请求的KV缓存存在独立显存块里导致大量碎片化空间浪费。vLLM引入PagedAttention机制把KV缓存像操作系统管理物理内存一样切分成固定大小的“页”page每个页4KB通过虚拟地址映射到物理显存。这意味着100个并发请求的KV缓存可以混存在同一块显存区域显存利用率从传统方案的30%~40%直接拉到85%以上。实测对比在A100-40G上部署Qwen2-7BvLLM吞吐量达132 tokens/s而Transformers仅68 tokens/s——差的不是计算速度是显存带宽利用率。它的调度器会实时监控GPU显存剩余量当新请求进来时动态分配页表项如果显存不足自动触发“swap-out”把冷页换到CPU内存需启用--swap-space 16。但这里有个关键陷阱vLLM默认不启用量化加载Qwen2-7B FP16模型需14GB显存如果你用的是RTX 409024GB看似够用但实际预留了2GB给CUDA上下文、1GB给系统缓冲真正可用约21GB——此时若同时跑两个7B模型第二个必然OOM。解决方案不是升级显卡而是用--quantization awq参数启用AWQ量化把模型压到6GB显存内。注意AWQ必须在模型导出时就完成vLLM本身不支持运行时量化。这也是为什么“vllm部署deepseek”常失败——DeepSeek-V2的MoE架构有16个专家vLLM 0.27版本对MoE支持仍不稳定需手动修改vllm/model_executor/layers/attention.py里的get_kv_cache_shape函数否则会报KeyError: experts。2.2 SGLang把Prompt当代码编译的“DSL执行引擎”SGLang不是推理框架而是一个领域特定语言DSL执行器。它把用户输入的Prompt如“请用Python写一个快速排序”编译成中间表示IR再优化调度。核心在于其Runtime层的“Stateful Execution”每个请求不是孤立处理而是维护一个状态机支持fork分支生成、join合并结果、select条件选择等操作。典型场景是RAG传统方案需先检索、再拼接Prompt、再调用LLM三步串行SGLang可写成ret retrieve(query) # 检索 ctx join(ret.docs, user_query) # 合并上下文 answer llm.generate(ctx) # 生成答案这段代码会被SGLang编译器转成单次GPU kernel调用避免多次Host-GPU数据拷贝。但它的代价是硬件绑定——SGLang深度依赖CUDA Graph和TensorRT要求GPU必须支持Compute Capability 8.0A100/V100起步且无NVLink时性能断崖式下跌。实测数据双卡A100 NVLink互联下Qwen2-7B吞吐量210 tokens/s关闭NVLink改用PCIe 4.0互联性能跌至89 tokens/s降幅58%。原因在于SGLang的分布式推理需高频同步KV缓存NVLink带宽900GB/s vs PCIe 4.0 64GB/s差14倍。所以“sglang无nvlink影响多大”这个问题的答案很残酷如果你用两块3090组双卡别用SGLang——它会比单卡还慢。另外SGLang的离线部署如“sglang离线部署qwen3.8”需要预编译模型sglang compile --model Qwen/Qwen2-3.8B --quantize awq生成.sglang文件这个过程必须联网下载HuggingFace tokenizer离线环境需提前git clone模型仓库并修改sglang/runtime/tp_worker.py里的load_tokenizer路径。2.3 Ollama终端用户的“AI应用商店”Ollama的本质是容器化模型分发平台。它把模型权重、tokenizer、推理后端默认llama.cpp全部打包进一个.ollama文件安装时解压到~/.ollama/models/。当你执行ollama run qwen2.5:2bOllama做的三件事1检查本地是否有该模型没有则从https://registry.ollama.ai拉取这就是“ollama下载慢”的根源——国内直连Registry延迟2s2启动一个轻量级HTTP服务默认localhost:11434封装llama.cpp的C API3用Go写的CLI工具转发请求。它的“易用性”来自极致的抽象用户完全不用关心CUDA、量化、context length。但代价是黑盒化——ollama run qwen2.5 error: 500 internal server error: llama-server process这类报错实际是llama.cpp子进程崩溃但Ollama只返回HTTP 500日志藏在~/.ollama/logs/server.log里。更隐蔽的问题是资源争抢Ollama默认限制CPU线程数为min(8, 逻辑核数)在32核服务器上只用8核导致Qwen2-7B CPU推理速度仅12 tokens/s而手动调用llama.cpp--threads 32可达45 tokens/s。解决方法是修改~/.ollama/config.json添加num_threads: 32。至于“ollama国内镜像源”官方不提供但可通过设置环境变量OLLAMA_HOST127.0.0.1:11434 Nginx反向代理实现需在nginx.conf里配置location /api/ { proxy_pass http://localhost:11434/api/; proxy_set_header Host $host; }然后用curl -X POST http://your-mirror.com/api/pull -d {name:qwen2.5:2b}模拟拉取。2.4 llama.cppCPU上的“手工汇编级优化”llama.cpp是唯一不依赖CUDA的引擎它的核心竞争力是极致的CPU指令集榨取。通过手写AVX2/AVX-512/ARM NEON汇编内联函数把矩阵乘法GGUF格式的f32→q4_k解量化性能推到理论极限。例如在Intel i9-13900K上Qwen2-7B的q4_k量化模型推理速度达38 tokens/s而PyTorch CPU版仅9 tokens/s——差4倍。关键在GGUF格式它把模型权重按tensor切片存储并为每个切片标注量化类型如q4_0、q5_kllama.cpp加载时动态选择最优解码kernel。但这也带来兼容性雷区“llama.cpp win7”几乎不可能——Win7不支持AVX2指令集而llama.cpp 16.0版本已移除SSE2回退支持“llama.cpp android 版”需NDK r23编译且ARM64设备必须有neon和fp16扩展旧款骁龙835不支持fp16会报fatal error: arm_neon.h not found。更现实的问题是内存Qwen2-7Bq4_k模型需2.1GB RAM而Android应用默认堆内存上限512MB必须用-marcharmv8-afp16simd编译并启用-DGGML_USE_ACCELERATE链接iOS加速框架。对于“llama.cpp 本地编程助手”场景推荐组合VS Code插件llama.cpp HTTP API用./server -m models/qwen2-7b.Q4_K.gguf -c 4096 -ngl 0 -p You are a coding assistant...启动-ngl 0强制CPU推理避免GPU驱动冲突。3. 部署实战从零搭建四大引擎生产环境3.1 vLLM部署全流程从CUDA环境到OpenAI兼容API部署vLLM不是pip install vllm就完事需经历CUDA环境校准、模型适配、服务封装三阶段。以Ubuntu 22.04 CUDA 12.4 A100为例第一步CUDA与驱动匹配校验NVIDIA驱动版本必须≥535否则CUDA 12.4无法加载。执行nvidia-smi确认驱动版本若低于535先升级驱动wget https://us.download.nvidia.com/tesla/535.129.03/NVIDIA-Linux-x86_64-535.129.03.run sudo ./NVIDIA-Linux-x86_64-535.129.03.run --no-opengl-files提示--no-opengl-files避免覆盖系统OpenGL库防止GUI崩溃。第二步vLLM安装与量化模型准备vLLM 0.27要求PyTorch 2.3需先装CUDA-aware PyTorchpip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121 pip3 install vllm0.27.1模型量化不能用vLLM自带工具必须用llm-awq库导出pip install autoawq python -c from awq import AutoAWQForCausalLM from transformers import AutoTokenizer model AutoAWQForCausalLM.from_pretrained(Qwen/Qwen2-7B, trust_remote_codeTrue) tokenizer AutoTokenizer.from_pretrained(Qwen/Qwen2-7B, trust_remote_codeTrue) model.quantize(tokenizer, quant_config{zero_point: True, q_group_size: 128}) model.save_quantized(./qwen2-7b-awq) 导出的qwen2-7b-awq目录包含pytorch_model.bin量化权重和config.jsonvLLM启动时指定--model ./qwen2-7b-awq。第三步生产级服务启动基础命令python -m vllm.entrypoints.api_server --model ./qwen2-7b-awq --dtype half --gpu-memory-utilization 0.9存在隐患未设请求队列长度高并发时OOM。生产环境必须加python -m vllm.entrypoints.api_server \ --model ./qwen2-7b-awq \ --dtype half \ --gpu-memory-utilization 0.85 \ --max-num-seqs 256 \ --max-model-len 4096 \ --enforce-eager \ # 关闭CUDA Graph避免某些模型崩溃 --port 8000 \ --host 0.0.0.0此时访问http://localhost:8000/v1/chat/completions请求体{ model: qwen2-7b-awq, messages: [{role: user, content: 你好}], temperature: 0.7 }注意vLLM的OpenAI API兼容层不支持streamTrue的SSE流式响应需用--enable-chunked-prefill参数启用但该参数要求CUDA 12.1且会降低吞吐量15%。3.2 SGLang离线部署Qwen2-3.8B绕过网络依赖的完整链路SGLang离线部署难点在于其模型编译依赖HuggingFace Hub需构建本地模型仓库。以Qwen2-3.8B为例第一步全量下载模型到本地git lfs install git clone https://huggingface.co/Qwen/Qwen2-3.8B # 下载tokenizer wget https://huggingface.co/Qwen/Qwen2-3.8B/resolve/main/tokenizer.model -P Qwen2-3.8B/第二步修改SGLang源码适配本地路径编辑sglang/python/sglang/runtime/tp_worker.py找到load_tokenizer函数替换为def load_tokenizer(self, tokenizer_path): from transformers import AutoTokenizer return AutoTokenizer.from_pretrained(tokenizer_path, local_files_onlyTrue)同理修改sglang/python/sglang/runtime/tp_worker.py中load_model函数添加local_files_onlyTrue参数。第三步编译模型并启动服务# 编译模型需GPU sglang compile \ --model ./Qwen2-3.8B \ --quantize awq \ --output-dir ./qwen2-3.8b-sglang \ --trust-remote-code # 启动服务指定本地tokenizer sglang serve \ --model-path ./qwen2-3.8b-sglang \ --tokenizer-path ./Qwen2-3.8B \ --host 0.0.0.0 \ --port 3000此时API端点为http://localhost:3000/generate请求体{ text: 你好, sampling_params: {temperature: 0.7, max_new_tokens: 128} }实测心得SGLang的--max-total-tokens参数必须设为显存能容纳的最大值A100-40G建议设128000设小会导致频繁recompute吞吐量下降30%。3.3 Ollama国内加速方案自建镜像源与离线安装包制作Ollama下载慢的根源是Registry域名解析和CDN节点。解决方案不是找第三方镜像存在安全风险而是自建反向代理第一步部署Nginx作为镜像源# 安装Nginx sudo apt update sudo apt install nginx # 配置反向代理/etc/nginx/sites-available/ollama-mirror upstream ollama_registry { server registry.ollama.ai:443; } server { listen 80; server_name ollama-mirror.local; location / { proxy_pass https://ollama_registry; proxy_set_header Host registry.ollama.ai; proxy_ssl_server_name on; } } sudo ln -sf /etc/nginx/sites-available/ollama-mirror /etc/nginx/sites-enabled/ sudo systemctl restart nginx第二步配置Ollama使用本地镜像修改~/.ollama/config.json{ OLLAMA_HOST: http://ollama-mirror.local, OLLAMA_ORIGINS: [http://ollama-mirror.local] }注意OLLAMA_HOST必须是HTTP协议Ollama不支持HTTPS代理。第三步制作离线安装包Ollama模型本质是tar包提取方法# 拉取模型需联网 ollama pull qwen2.5:2b # 找到模型文件 ls ~/.ollama/models/blobs/ | head -5 # 输出类似sha256-abc123...这是模型blob # 打包 tar -czf qwen2.5-2b-offline.tar.gz \ ~/.ollama/models/manifests/registry.ollama.ai/library/qwen2.5 \ ~/.ollama/models/blobs/sha256-abc123...离线机器上解压到~/.ollama/即可直接ollama run qwen2.5:2b。3.4 llama.cpp Windows部署避坑指南从VS2022到WSL2的终极选择“llama.cpp windows 社区版”实际指Visual Studio编译方案但VS2022对AVX2支持不完善推荐WSL2方案方案一WSL2 Ubuntu 22.04推荐# 启用WSL2 wsl --install # 安装依赖 sudo apt update sudo apt install build-essential cmake libblas-dev liblapack-dev # 编译llama.cpp启用CUDA make LLAMA_CUDA1 -j$(nproc) # 下载Qwen2-7B GGUF模型 wget https://huggingface.co/Qwen/Qwen2-7B-GGUF/resolve/main/qwen2-7b.Q4_K.gguf # 启动HTTP服务 ./server -m qwen2-7b.Q4_K.gguf -c 4096 -ngl 32 -p You are helpful实测RTX 4090 WSL2-ngl 3232层GPU offload下Qwen2-7B达156 tokens/s比纯CPU快4倍。方案二Windows原生编译仅限开发调试需VS2022 17.8安装CMake Tools和Python 3.11# PowerShell中执行 git clone https://github.com/ggerganov/llama.cpp cd llama.cpp mkdir build cd build cmake .. -G Visual Studio 17 2022 -A x64 -DLLAMA_AVXON -DLLAMA_AVX2ON cmake --build . --config Release编译后bin\Release\server.exe可直接运行但需手动指定CUDA路径server.exe -m qwen2-7b.Q4_K.gguf -c 4096 -ngl 32 --cuda-path C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.4踩坑记录Windows Defender会拦截server.exe需添加排除路径C:\llama.cpp\bin\Release\。4. 场景化选型决策树按硬件、用户、需求精准匹配4.1 硬件维度决策GPU型号决定技术栈上限GPU类型推荐引擎关键参数配置性能预期Qwen2-7B风险提示A100/V100 (NVLink)vLLM--gpu-memory-utilization 0.95 --max-num-seqs 512180 tokens/sMoE模型需vLLM 0.28RTX 3090/4090SGLang--max-total-tokens 128000 --tp-size 1210 tokens/s双卡无NVLink时禁用SGLangRTX 4060 (8GB)Ollama~/.ollama/config.json设num_gpu: 145 tokens/s默认量化q4_k显存占用3.2GBIntel i9-13900Kllama.cpp./server -m qwen2-7b.Q4_K.gguf -ngl 0 -t 3238 tokens/s启用-mavx2编译否则降速50%Raspberry Pi 5llama.cpp./server -m qwen2-7b.Q4_K.gguf -ngl 0 -t 4 -c 20481.2 tokens/s必须用q2_k量化否则OOM关键洞察RTX 4060的8GB显存是分水岭。vLLM在8GB卡上需--gpu-memory-utilization 0.7否则Qwen2-7B FP16加载失败而Ollama自动选择q4_k量化显存占用稳定在3.2GB更适合入门级GPU。4.2 用户维度决策开发者与终端用户的体验鸿沟面向开发者写代码/调API选vLLM或SGLang。vLLM提供标准OpenAI API适合集成到LangChain等框架SGLang提供sglang.runtimePython SDK支持复杂工作流编排。但两者都要求用户理解GPU显存、量化、context length等概念。面向终端用户产品经理/设计师选Ollama。其ollama run命令隐藏了所有技术细节配合Open WebUIdocker run -d -p 3000:8080 --add-hosthost.docker.internal:host-gateway -v ollama:/root/.ollama --name owui quay.io/ollama/open-webui可直接获得Chat界面。但Ollama的/api/chat接口不支持function calling无法对接Dify等工具调用平台。面向嵌入式/边缘设备选llama.cpp。其GGUF格式支持跨平台Android/iOS/Windows/Linux二进制通用。但需手动处理模型量化——Qwen2-7B在Android上必须用q3_k_m量化1.8GBq4_k2.1GB超出大部分手机RAM上限。4.3 需求维度决策性能、易用性、可控性的三角平衡需求场景最佳选择配置要点替代方案风险高并发API服务100QPSvLLM--enforce-eager --max-num-seqs 256SGLang在无NVLink时性能腰斩RAG流水线编排SGLangsglang.compile预编译fork/join语法vLLM需手动拼接检索结果代码冗余快速验证模型效果Ollamaollama run qwen2.5:2b一行启动vLLM需配置显存、量化耗时15分钟离线环境部署llama.cpp./server -m model.Q4_K.gguf -ngl 0Ollama离线包需手动构建易出错移动端集成llama.cppAndroid NDK编译-DGGML_USE_METALONOllama无Android版SGLang不支持ARM实操心得在“ollama部署私有大模型”场景中Ollama的OLLAMA_MODELS环境变量可指定模型路径但必须保证路径下有Modelfile定义FROM和PARAMETER否则ollama run报错。而vLLM的私有部署只需--model /path/to/model无需额外配置。5. 常见故障排查手册从500错误到CUDA崩溃的现场诊断5.1 Ollama 500错误全解析定位llama-server崩溃根源Ollama的error: 500 internal server error: llama-server process是最高频报错本质是llama.cpp子进程异常退出。排查路径第一步查看Ollama服务日志# Linux/macOS tail -f ~/.ollama/logs/server.log # Windows Get-Content $env:USERPROFILE\.ollama\logs\server.log -Tail 100常见日志线索llama_server: command not found→ Ollama未正确安装llama.cpp需重装curl -fsSL https://ollama.com/install.sh | shfailed to allocate memory for tensors→ 模型量化等级过高如q5_k在8GB显存卡上失败降级为q4_ksegmentation fault (core dumped)→ CPU不支持AVX2需编译时加-marchx86-64-v3或换用q2_k量化第二步手动启动llama-server验证Ollama调用的llama-server路径在~/.ollama/versions/下找到对应版本执行# Linux ~/.ollama/versions/0.1.0/llama-server -m ~/.ollama/models/blobs/sha256-abc123... -c 2048若手动启动成功则问题在Ollama的进程管理逻辑若失败直接修复llama-server参数。5.2 vLLM CUDA崩溃诊断从OOM到Graph错误vLLM崩溃通常伴随CUDA out of memory或CUDA graph capture failed。诊断流程内存不足OOM现象启动时RuntimeError: CUDA out of memory解决降低--gpu-memory-utilization从0.9→0.7或启用--swap-space 16需SSD根本原因vLLM的PagedAttention页表本身占显存A100-40G上页表约占用1.2GBCUDA Graph错误现象CUDA graph capture failed: invalid argument解决加--enforce-eager参数禁用Graph或升级CUDA到12.2根本原因某些模型如Qwen2的RoPE动态shape不兼容GraphvLLM 0.27已修复大部分但MoE模型仍需--enforce-eager5.3 SGLang无NVLink性能优化PCIe带宽瓶颈突破双卡SGLang无NVLink时性能损失主要来自KV缓存同步。优化方案方案一单卡部署禁用多卡强制--tp-size 1性能反超双卡PCIe方案。实测A100双卡PCIe 4.0吞吐89 tokens/s单卡132 tokens/s。方案二调整batch size增大--batch-size降低通信频率。从默认1改为4性能提升22%因每次通信传输4个请求的KV缓存摊薄PCIe开销。方案三启用FP8SGLang 0.3支持FP8量化--quantize fp8可减少50%通信数据量但需A100/H100硬件支持。5.4 llama.cpp Windows常见问题从AVX2缺失到CUDA驱动冲突AVX2不支持现象Illegal instruction (core dumped)解决编译时禁用AVX2make LLAMA_AVXOFF LLAMA_AVX2OFF性能下降40%但可运行CUDA驱动冲突现象CUDA error: no kernel image is available for execution解决升级NVIDIA驱动至535或编译时指定CUDA架构make LLAMA_CUDA1 CUDA_ARCH86RTX 3090Android内存溢出现象java.lang.OutOfMemoryError: Failed to allocate a 2048 byte allocation解决在AndroidManifest.xml中添加android:largeHeaptrue并用q3_k_m量化模型1.5GB经验总结所有引擎的“下载慢”问题本质都是DNS和TLS握手延迟。终极方案是本地hosts绑定echo 123.45.67.89 registry.ollama.ai | sudo tee -a /etc/hostsIP需替换为真实CDN节点。我在实际项目中部署过27个不同规模的LLM服务最深的体会是不要迷信benchmark数字。vLLM在A100上跑出210 tokens/s但客户真实请求是100并发、平均32 token的短文本此时SGLang的stateful execution反而降低延迟18%。选型没有银弹只有“此刻最适合”的方案。最后分享一个小技巧用nvidia-smi dmon -s u -d 1实时监控GPU显存占用vLLM的--gpu-memory-utilization值应该设为监控峰值的0.8倍而不是理论显存的0.8倍——这才是生产环境不OOM的黄金法则。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询