用途
llama.cpp 是一个纯 C/C++ 实现的大语言模型推理工具,依赖极少,针对 CPU 和非 NVIDIA 硬件进行了优化。根据资料,它适用于以下场景:在纯 CPU 机器上运行、部署在 Apple Silicon(M1/M2/M3/M4)上、使用 AMD 或 Intel GPU(无 CUDA)、边缘部署(树莓派、嵌入式系统),以及需要无需 Docker/Python 的简单部署。
资料同时给出了替代方案的建议:当拥有 NVIDIA GPU(A100/H100)、需要最大吞吐量(100K+ tok/s)、在带 CUDA 的数据中心运行时,建议改用 TensorRT-LLM;当拥有 NVIDIA GPU、需要 Python 优先的 API、想要 PagedAttention 时,建议改用 vLLM。
主要能力
- 纯 C/C++ 推理,依赖极少,面向 CPU 与非 NVIDIA 硬件优化。
- 支持 GGUF 量化格式,提供多种量化等级(Q2_K、Q3_K_M、Q4_K_S、Q4_K_M、Q5_K_M、Q6_K、Q8_0 等)。
- 支持硬件加速:Apple Silicon 的 Metal、NVIDIA 的 CUDA、AMD 的 ROCm(HIP)。
- 提供命令行推理(llama-cli)、交互式聊天、以及 OpenAI 兼容的服务器模式(llama-server)。
- 支持批量处理、约束生成(语法文件,如 JSON 输出)、上下文大小调整。
- 支持的模型包括 LLaMA 系列(Llama 2、Llama 3、Code Llama)、Mistral 系列(Mistral 7B、Mixtral 8x7B/8x22B),以及 Falcon、BLOOM、GPT-J、Phi-3、Gemma、Qwen、LLaVA(视觉)、Whisper(音频)等。
使用方式
安装:
# macOS/Linux
brew install llama.cpp
# Or build from source
git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp
make
# With Metal (Apple Silicon)
make LLAMA_METAL=1
# With CUDA (NVIDIA)
make LLAMA_CUDA=1
# With ROCm (AMD)
make LLAMA_HIP=1
下载模型(GGUF 格式):
huggingface-cli download \
TheBloke/Llama-2-7B-Chat-GGUF \
llama-2-7b-chat.Q4_K_M.gguf \
--local-dir models/
# Or convert from HuggingFace
python convert_hf_to_gguf.py models/llama-2-7b-chat/
运行推理:
# Simple chat
./llama-cli \
-m models/llama-2-7b-chat.Q4_K_M.gguf \
-p "Explain quantum computing" \
-n 256 # Max tokens
# Interactive chat
./llama-cli \
-m models/llama-2-7b-chat.Q4_K_M.gguf \
--interactive
服务器模式:
# Start OpenAI-compatible server
./llama-server \
-m models/llama-2-7b-chat.Q4_K_M.gguf \
--host 0.0.0.0 \
--port 8080 \
-ngl 32 # Offload 32 layers to GPU
# Client request
curl http://localhost:8080/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "llama-2-7b-chat",
"messages": [{"role": "user", "content": "Hello!"}],
"temperature": 0.7,
"max_tokens": 100
}'
硬件加速:
# Apple Silicon (Metal)
make LLAMA_METAL=1
./llama-cli -m model.gguf -ngl 999 # Offload all layers
# NVIDIA GPUs (CUDA)
make LLAMA_CUDA=1
./llama-cli -m model.gguf -ngl 35 # Offload 35/40 layers
./llama-cli -m llama-70b.Q4_K_M.gguf -ngl 20 # Hybrid CPU+GPU
# AMD GPUs (ROCm)
make LLAMA_HIP=1
./llama-cli -m model.gguf -ngl 999
常见模式:
# Batch processing
cat prompts.txt | ./llama-cli \
-m model.gguf \
--batch-size 512 \
-n 100
# Constrained generation (JSON output with grammar)
./llama-cli \
-m model.gguf \
-p "Generate a person: " \
--grammar-file grammars/json.gbnf
# Context size
./llama-cli \
-m model.gguf \
-c 4096 # 4K context window
./llama-cli -m model.gguf -c 32768 # 32K context
量化格式
GGUF 格式概览(以 7B 模型为例):
| 格式 | 位数 | 大小 (7B) | 速度 | 质量 | 使用场景 |
|---|---|---|---|---|---|
| Q4_K_M | 4.5 | 4.1 GB | 快 | 好 | 推荐默认 |
| Q4_K_S | 4.3 | 3.9 GB | 更快 | 较低 | 速度关键 |
| Q5_K_M | 5.5 | 4.8 GB | 中 | 更好 | 质量关键 |
| Q6_K | 6.5 | 5.5 GB | 较慢 | 最佳 | 最高质量 |
| Q8_0 | 8.0 | 7.0 GB | 慢 | 优秀 | 最小退化 |
| Q2_K | 2.5 | 2.7 GB | 最快 | 差 | 仅测试 |
选择建议:通用场景用 Q4_K_M;追求最大速度用 Q2_K 或 Q3_K_M(退化更多);追求最大质量用 Q6_K 或 Q8_0(更慢);超大模型(70B、405B)用 Q3_K_M 或 Q4_K_S 以适配内存。
性能基准
CPU 性能(Llama 2-7B Q4_K_M):
| CPU | 线程 | 速度 | 成本 |
|---|---|---|---|
| Apple M3 Max | 16 | 50 tok/s | $0(本地) |
| AMD Ryzen 9 7950X | 32 | 35 tok/s | $0.50/小时 |
| Intel i9-13900K | 32 | 30 tok/s | $0.40/小时 |
| AWS c7i.16xlarge | 64 | 40 tok/s | $2.88/小时 |
GPU 加速(Llama 2-7B Q4_K_M):
| GPU | 速度 | 对比 CPU | 成本 |
|---|---|---|---|
| NVIDIA RTX 4090 | 120 tok/s | 3-4× | $0(本地) |
| NVIDIA A10 | 80 tok/s | 2-3× | $1.00/小时 |
| AMD MI250 | 70 tok/s | 2× | $2.00/小时 |
| Apple M3 Max (Metal) | 50 tok/s | 约相同 | $0(本地) |
适用场景与限制
适用场景:纯 CPU 环境、Apple Silicon、AMD/Intel GPU、边缘设备、需要简单部署(无需 Docker/Python)的场合。
限制与替代建议:若拥有 NVIDIA GPU(A100/H100)、需要最大吞吐量(100K+ tok/s)或在带 CUDA 的数据中心运行,资料建议改用 TensorRT-LLM;若拥有 NVIDIA GPU、需要 Python 优先 API 或 PagedAttention,建议改用 vLLM。
参考资源
- 量化指南:GGUF 格式、转换、质量对比
- 服务器部署:API 端点、Docker、监控
- 优化:性能调优、CPU+GPU 混合
- GitHub:https://github.com/ggerganov/llama.cpp
- 模型:https://huggingface.co/models?library=gguf
- Discord:https://discord.gg/llama-cpp