Skip to content

Ollama 性能瓶颈大揭秘:vLLM、llama.cpp 等主流推理引擎横评

来源:微信公众号 原文链接:https://mp.weixin.qq.com/s/Egf8ORQ1anVPgFP9VLLVEg 版权声明:本文为原创文章转载整理,版权归原作者所有

背景

Ollama 确实好上手——一条命令就能把模型跑起来,API 调起来跟 OpenAI 一个样,小打小闹搞个 demo 简直爽到飞起。

但是,当你真正把它推到生产环境,或者想在一张 4090 上跑出真正能用的吞吐量的时候,你会发现 Ollama 开始拉胯了:

  • 显存占用感人
  • GPU 利用率上不去
  • 高并发直接跪了
  • 批量推理慢得像蜗牛

结论:Ollama 适合快速实验,不适合生产部署。

性能对比

Ollama 的性能瓶颈

1️⃣ 显存占用高得离谱

同样的 DeepSeek-R1 7B 模型,Ollama 跑起来显存占用能比 vLLM 高出 30%~50%。

原因: Ollama 的 KV Cache 管理策略相当原始,没有做精细化的显存优化。

2️⃣ GPU 利用率像过山车

单请求延迟 Ollama 确实不差,但一旦并发请求多了,GPU 利用率就开始剧烈波动,大量时间浪费在等待上。

  • vLLM: PagedAttention 能把 GPU 利用率稳定在 85%+
  • Ollama: 能稳住 60% 就谢天谢地了

3️⃣ 批量推理几乎是残血

批量文本处理、批量代码生成这类场景,Ollama 的吞吐量跟 vLLM 比起来简直是 5 倍起步的差距。

批量推理对比

主流推理引擎横评

推理引擎吞吐量显存占用GPU利用率API兼容性上手难度
Ollama⭐⭐(基准)⭐⭐(偏高)⭐⭐⭐(60%)⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
vLLM⭐⭐⭐⭐⭐(5x+)⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐(85%+)⭐⭐⭐⭐⭐⭐⭐⭐
llama.cpp⭐⭐⭐⭐(2-3x)⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
LM Studio⭐⭐⭐⭐(2x)⭐⭐⭐⭐⭐⭐⭐(60-70%)⭐⭐⭐⭐⭐⭐⭐⭐⭐
HuggingFace TGI⭐⭐⭐⭐⭐(5x+)⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐

各引擎适用场景

👉 vLLM:生产环境首选

优势: PagedAttention + Continuous Batching 组合拳,显存利用率和吞吐量直接拉满

适用: 高并发 API 服务、批量推理任务、GPU 性能压榨

缺点: 配置比 Ollama 复杂一点

👉 llama.cpp:低配党和量化党的心头好

优势: 支持纯 CPU 推理,GGUF 量化格式能把模型体积压缩到原来的 1/4

适用: 无 NVIDIA 显卡、Mac 用户、老机器跑 7B 模型

数据: Q4_K_M 量化版本 7B 模型只需要 4GB 内存就能跑

👉 LM Studio:不想写命令行的懒人神器

优势: 图形界面一键安装模型、支持 LoRA 微调、本地 Chat 界面

适用: 不想折腾命令行的 Windows/Mac 用户

特点: 虽然性能不一定比 vLLM 强,但胜在直观

👉 HuggingFace TGI:大模型部署的行业标准

优势: Flash Attention 2、DeepSeek-V2 优化、量化支持都安排好了

适用: HuggingFace 生态、大厂生产环境

缺点: 资源占用比 vLLM 高那么一丢丢

引擎对比

vLLM 零基础部署教程

前置条件

  • NVIDIA 显卡(至少 8GB 显存,建议 12GB+)
  • CUDA 12.1+
  • Python 3.10+ pip 环境

方法一:Docker 一键部署(推荐懒人)

bash
# 拉取 vLLM 镜像(自动包含 CUDA 环境)
docker pull vllm/vllm-openai:latest

# 启动容器,映射模型路径和端口
docker run --gpus all \
    -v ~/.cache/huggingface:/root/.cache/huggingface \
    -p 8000:8000 \
    --ipc=host \
    vllm/vllm-openai:latest \
    --model deepseek-ai/DeepSeek-R1-Distill-Qwen-7B \
    --quantization awq \
    --tensor-parallel-size 1

方法二:pip 直接安装(适合有 Python 环境的)

bash
# 安装 vLLM(这步可能需要等几分钟)
pip install vllm
python
# 写个启动脚本 server.py
from vllm import LLM, SamplingParams

# 加载模型(会自动下载到 HuggingFace 缓存目录)
llm = LLM(model="deepseek-ai/DeepSeek-R1-Distill-Qwen-7B")

# 推理
sampling_params = SamplingParams(temperature=1.0, top_p=0.95, top_k=64)
outputs = llm.generate(["请用 Python 写一个快速排序"], sampling_params)

for output in outputs:
    print(output.outputs[0].text)

方法三:OpenAI API 兼容模式启动(最常用)

bash
# 启动 vLLM OpenAI 兼容 API 服务
python -m vllm.entrypoints.openai.api_server \
    --model deepseek-ai/DeepSeek-R1-Distill-Qwen-7B \
    --dtype half \
    --quantization awq \
    --max-model-len 8192 \
    --gpu-memory-utilization 0.9

API 调用示例(完全兼容 OpenAI 格式)

python
import openai

client = openai.OpenAI(
    base_url="http://localhost:8000/v1",
    api_key="EMPTY"  # 本地部署不需要 API Key
)

response = client.chat.completions.create(
    model="deepseek-ai/DeepSeek-R1-Distill-Qwen-7B",
    messages=[{"role": "user", "content": "解释一下什么是 PagedAttention"}]
)

print(response.choices[0].message.content)

vLLM部署

踩坑预警

1. vLLM 量化慎用 CPU Offload

vLLM 默认会把整个模型塞进 GPU,但如果显存不够千万别硬撑。加 --enforce-eager 参数可以避免 CUDA OOM,但性能会下降一大截。

2. llama.cpp 的 GGUF 模型格式不通用

从 HuggingFace 下载的模型不能直接给 llama.cpp 用,必须转换成 GGUF 格式。可以用 llama.cpp/conversion_scripts 目录下的工具进行转换。

3. Ollama 的模型文件位置坑爹

Ollama 默认把模型存在系统盘(C 盘),跑几个大模型之后 C 盘直接爆红。修改 OLLAMA_MODELS 环境变量可以指定到其他盘符。

4. TGI 的多卡并行配置有点绕

TGI 需要手动指定 --tensor-parallel-size,而且不支持动态调整,新手容易翻车。vLLM 配置比 TGI 简单得多。

模型选择对照表

硬件配置推荐模型推荐引擎量化方案
Mac M1/M2(无独显)Qwen2.5-3B / Gemma-4Bllama.cpp / LM StudioQ4_K_M
RTX 3060 12GB / RTX 4060 TiDeepSeek-R1 7B / Qwen2.5 14BvLLM / OllamaQ4_K_M / FP16
RTX 4090 24GB / A5000DeepSeek-R1 32B / Gemma-31BvLLM / TGIQ5_K_S / AWQ
多卡 A100 40GB x2Qwen2.5-72B / Llama3.1-70BvLLM / TGIFP16 / AWQ

一句话总结

  • 快速实验 / Demo 搭建 → Ollama,一行命令搞定
  • 生产环境 / 高并发 API → vLLM,吞吐量摆在那儿
  • 低配机器 / 极致量化 → llama.cpp,4GB 内存跑 7B 模型不是梦
  • 不想折腾命令行 → LM Studio,图形界面一键搞定
  • 企业级 / HuggingFace 生态 → TGI,官方背书,稳定压倒一切

总结


整理自微信公众号,版权归原作者所有

Released under the MIT License.