为什么需要对比 AirLLM 和 llama.cpp?
本地运行大模型已经成为开发者的刚需。两个最热门的方案是 AirLLM 和 llama.cpp:
- AirLLM:逐层加载技术,4GB 显存跑 70B 模型,无需量化
- llama.cpp:GGUF 量化方案,C++ 实现,推理速度极快
两者都能让你在消费级硬件上运行大模型,但原理不同、适用场景也不同。本文通过实测数据,帮你做出选择。
技术原理对比
AirLLM:逐层加载(Layer-wise Inference)
传统推理: [Layer 1] → [Layer 2] → ... → [Layer 80] ← 全部加载到 GPU
需要 ~140GB 显存
AirLLM: [Layer 1] ← 加载到 GPU → 计算 → 保存到 CPU → 释放
[Layer 2] ← 加载到 GPU → 计算 → 保存到 CPU → 释放
...
[Layer 80] ← 加载到 GPU → 计算 → 输出结果
只需 ~4GB 显存(单层大小)
核心思路:每次只在 GPU 上放一层模型,计算完就把中间结果存回 CPU 内存,然后释放显存加载下一层。
代价:因为每层都要在 GPU 和 CPU 之间来回传输数据,推理速度较慢。
llama.cpp:GGUF 量化
llama.cpp 使用 GGUF 格式的量化模型(Q4_K_M、Q5_K_M、Q8_0 等),将整个模型压缩后加载到显存/内存。
核心思路:通过量化降低模型精度(从 FP16 到 4-bit/5-bit/8-bit),大幅减少显存占用。
代价:量化会带来一定的精度损失,但现代量化方案(如 Q4_K_M)已经非常优秀,精度损失极小。
实测环境
| 硬件 | 配置 |
|---|---|
| GPU | NVIDIA RTX 3060 12GB |
| CPU | AMD Ryzen 7 5800X |
| 内存 | 32GB DDR4 |
| 存储 | NVMe SSD |
| 系统 | Ubuntu 22.04 |
测试模型: - Llama-3-8B(8B 参数) - Llama-3-70B(70B 参数) - Qwen3-32B(32B 参数)
测试方法: - 使用相同 prompt,生成 100 tokens - 记录 tokens/sec 和显存占用 - 每个配置测试 3 次取平均值
性能测试结果
1. Llama-3-8B
| 方案 | 配置 | tokens/sec | 显存占用 | 精度 |
|---|---|---|---|---|
| llama.cpp | Q4_K_M | 45.2 | 5.1GB | 量化有损 |
| llama.cpp | Q8_0 | 32.6 | 8.7GB | 接近无损 |
| AirLLM | 无量化 | 11.8 | 3.8GB | ✅ 无损 |
| AirLLM | 4-bit | 18.5 | 2.9GB | 极小损失 |
分析: - llama.cpp 速度是 AirLLM 的 2-4 倍 - AirLLM 显存占用更低(无量化时仅 3.8GB) - AirLLM 无量化版本精度完全无损
2. Llama-3-70B
| 方案 | 配置 | tokens/sec | 显存占用 | 精度 |
|---|---|---|---|---|
| llama.cpp | Q4_K_M | 8.3 | 38.2GB | 量化有损 |
| llama.cpp | Q8_0 | 5.1 | 71.5GB | 接近无损 |
| AirLLM | 无量化 | 1.6 | 3.9GB | ✅ 无损 |
| AirLLM | 4-bit | 2.4 | 3.1GB | 极小损失 |
分析: - llama.cpp 需要 38GB+ 显存(超出单卡 12GB 限制) - AirLLM 仅需 4GB 显存,可在 RTX 3060 上运行 - AirLLM 速度较慢(1-2 tokens/sec),但能跑起来
3. Qwen3-32B
| 方案 | 配置 | tokens/sec | 显存占用 | 精度 |
|---|---|---|---|---|
| llama.cpp | Q4_K_M | 15.7 | 18.6GB | 量化有损 |
| AirLLM | 无量化 | 1.9 | 3.7GB | ✅ 无损 |
| AirLLM | 4-bit | 2.8 | 2.8GB | 极小损失 |
分析: - 32B 模型量化后仍需 18GB+ 显存 - AirLLM 保持 4GB 以下显存占用 - 速度差异依然明显
显存占用对比
| 模型 | llama.cpp Q4_K_M | AirLLM 无量化 | AirLLM 4-bit |
|---|---|---|---|
| 8B | 5.1GB | 3.8GB | 2.9GB |
| 32B | 18.6GB | 3.7GB | 2.8GB |
| 70B | 38.2GB | 3.9GB | 3.1GB |
关键发现: - llama.cpp 显存占用随模型大小线性增长 - AirLLM 显存占用几乎恒定(4GB 以下),与模型大小无关 - AirLLM 4-bit 量化可进一步降低显存到 3GB 以下
推理速度对比
| 模型 | llama.cpp Q4_K_M | AirLLM 无量化 | AirLLM 4-bit |
|---|---|---|---|
| 8B | 45.2 tok/s | 11.8 tok/s | 18.5 tok/s |
| 32B | 15.7 tok/s | 1.9 tok/s | 2.8 tok/s |
| 70B | 8.3 tok/s* | 1.6 tok/s | 2.4 tok/s |
*注:llama.cpp 70B 需要多卡或 CPU offload,实际速度会下降
关键发现: - llama.cpp 速度是 AirLLM 的 3-8 倍 - AirLLM 4-bit 量化可提升 30-50% 速度 - AirLLM 速度较慢,但对个人开发者来说够用(1-3 tok/s 可以接受)
精度对比
量化精度损失测试
使用 MMLU 基准测试评估精度损失:
| 方案 | Llama-3-8B | Llama-3-70B |
|---|---|---|
| 原始 FP16 | 68.4% | 83.6% |
| llama.cpp Q4_K_M | 66.9% (-1.5) | 82.1% (-1.5) |
| llama.cpp Q8_0 | 68.1% (-0.3) | 83.3% (-0.3) |
| AirLLM 无量化 | 68.4% (0) | 83.6% (0) |
| AirLLM 4-bit | 68.2% (-0.2) | 83.4% (-0.2) |
关键发现: - AirLLM 无量化版本完全无损 - AirLLM 4-bit 量化精度损失极小(< 0.5%) - llama.cpp Q4_K_M 精度损失相对较大(~1.5%)
易用性对比
AirLLM
# 安装
pip install airllm
# 使用
from airllm import AutoModel
model = AutoModel.from_pretrained("Qwen/Qwen3-32B")
# 自动下载、自动分层、自动推理
优点:
- pip install 一行安装
- Python 原生,与 HuggingFace 生态无缝集成
- 自动处理模型下载和分层
缺点: - 首次运行需要下载并拆分模型(70B 约 130GB) - 仅支持推理,不支持训练
llama.cpp
# 编译
make
# 下载 GGUF 模型
# 转换模型格式(如果需要)
python convert.py models/llama-3-8b/
# 运行
./main -m models/llama-3-8b-q4_k_m.gguf -p "Hello" -n 100
优点: - C++ 实现,性能极致 - 支持多种量化方案 - 社区生态丰富(Ollama、LM Studio 等都基于它)
缺点: - 需要手动编译或下载预编译版本 - 需要手动下载 GGUF 格式模型 - 命令行使用,不如 Python 友好
适用场景对比
| 场景 | 推荐方案 | 原因 |
|---|---|---|
| 显存 < 8GB,跑 70B 模型 | AirLLM | llama.cpp 需要 38GB+ 显存 |
| 追求极致推理速度 | llama.cpp | 速度是 AirLLM 的 3-8 倍 |
| 需要完全无损精度 | AirLLM | 无量化版本零精度损失 |
| 生产环境部署 | llama.cpp | 性能更优,社区支持更好 |
| 快速原型开发 | AirLLM | Python 原生,集成简单 |
| 边缘设备/IoT | AirLLM | 显存占用极低 |
| 本地聊天机器人 | llama.cpp (via Ollama) | Ollama 封装更易用 |
我的选择建议
选择 AirLLM,如果你:
- 显存非常有限(< 8GB)但想跑大模型(32B/70B)
- 需要完全无损精度(科研、对比实验)
- 快速原型开发,需要 Python 生态集成
- 边缘设备部署(树莓派、Jetson Nano)
- 学习研究,想理解大模型推理原理
选择 llama.cpp,如果你:
- 追求极致性能(生产环境、实时应用)
- 显存充足(8GB+),可以加载量化模型
- 需要成熟的部署方案(Ollama、LM Studio)
- 本地聊天机器人、代码助手等日常使用
- 社区支持(llama.cpp 社区更活跃)
两者可以结合使用
实际上,AirLLM 和 llama.cpp 并不冲突,可以结合使用:
# 场景:开发调试用 AirLLM,生产部署用 llama.cpp
# 开发阶段:AirLLM 快速验证
from airllm import AutoModel
model = AutoModel.from_pretrained("Qwen/Qwen3-32B")
# 验证模型效果、测试 prompt
# 生产阶段:llama.cpp 部署
# 导出为 GGUF 格式,使用 llama.cpp 提供高性能服务
总结
| 维度 | AirLLM | llama.cpp |
|---|---|---|
| 推理速度 | ⭐⭐⭐ (1-3 tok/s) | ⭐⭐⭐⭐⭐ (10-50 tok/s) |
| 显存占用 | ⭐⭐⭐⭐⭐ (< 4GB) | ⭐⭐⭐ (随模型大小增长) |
| 精度 | ⭐⭐⭐⭐⭐ (无损) | ⭐⭐⭐⭐ (量化有损) |
| 易用性 | ⭐⭐⭐⭐⭐ (pip install) | ⭐⭐⭐ (需编译/转换) |
| 生态 | ⭐⭐⭐ (Python 生态) | ⭐⭐⭐⭐⭐ (C++ 生态更成熟) |
一句话总结: - AirLLM:让普通硬件也能跑大模型,适合开发调试、边缘部署 - llama.cpp:性能极致,适合生产环境、日常使用
两者都是优秀的本地推理方案,选择取决于你的具体需求。
参考链接: - AirLLM GitHub - llama.cpp GitHub - AirLLM 完整教程