LLM本地部署llama.cppIntel Mac
Intel Mac 上用 llama.cpp 跑 Gemma-2-2B 本地离线推理
旧 Intel Mac 纯 CPU 跑 Gemma-2-2B Q4_K_M,10–25 字/秒,走 llama-server 的 OpenAI 兼容接口接进 Python。编译、下载、线程数和上下文的取舍,以及为什么别碰 Metal。
目标
在旧款 Intel Mac(Core i5 / i7 / i9)上用 llama.cpp 榨干 CPU 性能,不花钱本地跑轻量模型。
定位:本地高安全、断网可用的「意图识别中枢 / 小脑」—— 给 Python 拦截脚本(LangChain 保安)当后端,不出网、不上云、不产生 API 费用。
典型体验:Gemma-2-2B-Instruct 能跑出「打字机速度」,约 10–25 字/秒(视机型与参数)。
为什么 Intel Mac 也能跑
Intel Mac 没有 M 系列的统一内存,也没有 Neural Engine。但 llama.cpp 对 Intel 架构做了很深的 AVX2 / AVX512 指令集优化,2B 级别的模型在纯 CPU 上完全够用。
先确认你的 CPU 支持 AVX2:
sysctl -a | grep machdep.cpu.leaf7_features
输出里有 AVX2 就行。2013 年(Haswell)之后的 Intel Mac 基本都有。
别指望 Metal
Intel Mac 的核显/AMD 独显走 Metal 加速在 llama.cpp 上收益很小,有时反而更慢。 这条路子就是纯 CPU,不要花时间折腾 GPU 后端。
第一步:编译环境
1. 打开终端 — Cmd + Space → 输入 Terminal → 回车
2. 装 Apple 开发工具链(装过会自动跳过)
xcode-select --install
3. 克隆并编译
git clone https://github.com/ggml-org/llama.cpp
cd llama.cpp
cmake -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build --config Release --parallel 4
编译时 CMake 会自动探测 AVX2 / AVX512 并开启对应优化,不用手动指定。
想接 Accelerate 框架(Apple 的 BLAS 实现)再快一点:
cmake -B build -DCMAKE_BUILD_TYPE=Release -DGGML_BLAS=ON -DGGML_BLAS_VENDOR=Apple
嫌麻烦可以直接装二进制:
brew install llama.cpp
装完直接有 llama-server / llama-cli 命令,跳过编译。代价是版本跟着 Homebrew 走,不能自己改编译选项。
第二步:下载模型
Intel Mac 常见内存 8GB / 16GB,选 Gemma-2-2B-Instruct 的 Q4_K_M(GGUF):
| 文件大小 | 约 1.6 GB |
| 运行内存 | 约 2.3 GB(4096 上下文时) |
| 量化 | Q4_K_M —— 2B 模型上质量/体积的平衡点 |
在 llama.cpp 目录下:
curl -L -o gemma-2-2b-it-Q4_K_M.gguf \
https://huggingface.co/bartowski/gemma-2-2b-it-GGUF/resolve/main/gemma-2-2b-it-Q4_K_M.gguf
或者用 HuggingFace CLI:
pip install -U "huggingface_hub[cli]"
hf download bartowski/gemma-2-2b-it-GGUF gemma-2-2b-it-Q4_K_M.gguf --local-dir .
访问 HuggingFace 慢的话,用浏览器走镜像下载,把 .gguf 拖进 llama.cpp 文件夹即可。
第三步:启动本地 API 服务器
./build/bin/llama-server \
-m gemma-2-2b-it-Q4_K_M.gguf \
-c 4096 \
--host 127.0.0.1 \
--port 11434
启动成功的标志:终端出现 HTTP server listening。
端口 11434 是 Ollama 的默认端口
选它是为了让原本指向 Ollama 的代码不用改。 但如果这台机器上装了 Ollama,两者会抢端口。 llama-server 自己的默认端口是
8080,没有冲突顾虑的话用默认即可。
浏览器打开 http://127.0.0.1:11434 会看到 llama.cpp 自带的 Web UI,
可以直接对话测试,不用先写代码。
接进 Python
llama-server 提供 OpenAI 兼容接口,现成的 SDK 直接能用:
from openai import OpenAI
client = OpenAI(
base_url="http://127.0.0.1:11434/v1",
api_key="none", # 本地服务不校验,随便填
)
resp = client.chat.completions.create(
model="gemma-2-2b-it", # 本地服务不校验模型名
messages=[
{"role": "system", "content": "你是智能家居意图识别器,只输出 JSON。"},
{"role": "user", "content": "把客厅的灯调暗一点"},
],
temperature=0.1,
)
print(resp.choices[0].message.content)
LangChain 侧同理,把 base_url 指到 http://127.0.0.1:11434/v1 就行。
不想起服务,只想快速试一下
./build/bin/llama-cli -m gemma-2-2b-it-Q4_K_M.gguf -p "你好" -n 128
避坑指南
1. 发热与风扇狂飙
Intel 芯片全核满载推理功耗很高。脚本调用模型的那一两秒风扇会突然拉满,属于正常现象, 吐完字就安静。长时间高频调用要注意散热。
2. 线程数别设太大
线程开太多会互相争抢,反而更慢。设成物理核心数(不是逻辑核心数)通常最优:
sysctl -n hw.physicalcpu # 查物理核心数
./build/bin/llama-server -m gemma-2-2b-it-Q4_K_M.gguf -c 4096 \
--host 127.0.0.1 --port 11434 -t 4
-t 4 即限制 4 个物理核心,按自己机器调整。
3. 上下文长度吃内存
-c 4096 是折中值。8GB 内存的机器不要往上调太多——
上下文翻倍,KV cache 占用也大致翻倍,容易触发 Swap,比模型本身更拖速度。
4. 首次加载慢是正常的
第一次启动要把 1.6GB 权重读进内存,机械硬盘或老 SSD 上可能要十几秒。之后有系统缓存会快很多。
方案演进(决策脉络)
【云端 32B】太贵,放弃
↓
【树莓派本地】完全可行
↓
【Intel Mac 本地 C++ 裸奔】确定可行 ← 当前
下一步待定
- 选择 A:直接在 Intel Mac 上写代码,跑完整的智能家居控制闭环
- 选择 B:Intel Mac 只当测试机,代码最终迁到树莓派
两条路的取舍
A 省事,但 Intel Mac 功耗高、不适合 7×24 常开。 B 要多一次迁移,但树莓派待机功耗只有几瓦,更适合当家里的常驻服务。 代码用 OpenAI 兼容接口写的话,迁移基本只是改一个 base_url,B 的成本没想象中高。