llama.cppvLLM 代表了两种截然不同的设计哲学,选择取决于你的部署场景是边缘单用户还是云端高并发


核心架构差异

维度llama.cppvLLM
设计语言C/C++(零依赖)Python + CUDA
核心创新GGUF 格式 + 内存映射PagedAttention + 连续批处理
内存管理静态分配,mmap 按需加载动态非连续块分配(类似 OS 虚拟内存)
首要目标单流效率与跨平台便携性多用户吞吐量与 GPU 利用率
模型格式GGUF(专用量化格式)HuggingFace 原生(支持 AWQ/GPTQ)

性能特征对比

1. 吞吐量与并发

vLLM:在高并发下吞吐量呈线性增长。在 H200 上,64 并发时 vLLM 的吞吐量是 llama.cpp 的 35 倍以上。支持迭代级调度,GPU 利用率可达 85-92%。

llama.cpp:吞吐量几乎不随并发增加而增长(平坦曲线),采用队列模型处理请求。

2. 延迟表现

指标llama.cppvLLM
首 token 延迟 (TTFT)随并发指数级增长(排队等待)高并发下稳定在 <100ms
Token 间延迟 (ITL)单请求 ITL 更低(无 Python GIL 开销)为追求吞吐量会略微增加单个请求的 ITL

3. 内存效率

Jetson Orin Nano (8GB) 实测:

框架内存占用并发用户数
llama.cpp4.2 GB4 并发
vLLM6.4 GB(预分配 90% VRAM)17 并发

关键差异:vLLM 的 PagedAttention 通过非连续内存块减少 20-27% 的 KV Cache 浪费,但会预分配大量显存;llama.cpp 使用 mmap 按需加载,静态内存占用更低。


硬件与生态支持

特性llama.cppvLLM
GPU 支持CUDA/Metal/ROCm/Vulkan主要是 CUDA(部分支持 ROCm)
CPU 推理✅ 原生优化(AVX/AVX2/NEON)⚠️ 实验性支持,性能较差
边缘设备✅ 树莓派、手机、Jetson 全系列⚠️ 需 Jetson 专用容器,ARM 支持有限
量化支持极丰富(2-8 bit,多种算法)支持主流量化(AWQ/GPTQ/FP8)
模型加载内存映射,秒级启动传统加载,需预热
API 兼容性OpenAI-like(需配置)原生 OpenAI 兼容

适用场景

选择 llama.cpp 当:

  • 内存受限:边缘设备(Jetson Nano、树莓派)或消费级 GPU
  • 单用户/低并发:个人助手、离线批处理、嵌入式应用
  • 跨平台需求:需要同时在 x86、ARM、macOS 部署
  • 快速启动:GGUF 的 mmap 实现秒级模型切换
  • 稳定性优先:内存占用可预测,不易 OOM

选择 vLLM 当:

  • 高并发服务:多租户 API、聊天机器人服务
  • 吞吐量优先:需要最大化 GPU 利用率(数据中心场景)
  • 长上下文:PagedAttention 对长序列内存管理更高效
  • 生产级特性:需要张量并行、流水线并行、投机解码等企业功能

Nano Super 部署建议

对于 Jetson Orin Nano Super(8GB)跑 GLM-OCR

推荐 llama.cpp 的情况:

  • 作为单用户桌面应用的 OCR 后端
  • 需要同时运行其他 AI 服务(留内存给 YOLO 等)
  • 追求极致稳定性(vLLM 在边缘设备上仍可能出现内存碎片问题)

推荐 vLLM 的情况:

  • 构建多用户文档处理服务(如局域网共享 OCR API)
  • 需要 OpenAI 兼容接口快速集成现有生态
  • 能接受更高的内存占用换取并发能力

实测数据参考(Orin Nano 上 1.2B 模型):

指标llama.cppvLLM
原始生成速度24-40 tok/sec24-40 tok/sec
并发能力4 并发17 并发
内存占用4.2 GB6.4 GB
内存节省基准+34%

结论

GLM-OCR(0.9B)模型很小,在 Nano Super 上两者性能差距不大。

  • llama.cpp 更适合原型开发和单用户场景
  • vLLM 适合构建共享服务,但需仔细调优内存参数(gpu-memory-utilization 0.4 以下)

架构选择的核心:没有银弹,只有适合场景的权衡


延伸阅读