在 ARM VPS 上用 llama.cpp 部署 Gemma 4 E2B 本地模型
在 ARM VPS 上,使用 llama.cpp 的 Docker 镜像部署本地 LLM,记录从 Gemma 3 到 Gemma 4 的部署过程、性能测试和资源监控。
背景:Gemma 4 发布
2026 年 3 月,Google DeepMind 发布了 Gemma 4 系列开源模型。Gemma 4 带来了多项重大升级:
- 推理能力:全系模型支持可配置的思维链(Chain of Thought)推理模式
- 多模态:支持文本、图像输入,小模型(E2B/E4B)额外支持音频
- MoE + Dense 双架构:提供 Dense 和混合专家(Mixture-of-Experts)两种架构
- 超长上下文:小模型 128K tokens,大模型 256K tokens
- 原生函数调用:支持 function calling,适用于 Agent 场景
- 原生系统提示:首次原生支持
systemrole
Gemma 4 共 4 个规格:
| 模型 | 架构 | 有效参数 | 上下文长度 | 特点 |
|---|---|---|---|---|
| E2B | Dense | 2.3B | 128K | 轻量高效,支持音频,适合手机/边缘设备 |
| E4B | Dense | 4.5B | 128K | 平衡性能,支持音频 |
| 26B A4B | MoE | 3.8B active / 25.2B total | 256K | MoE 架构,推理速度接近 4B 模型 |
| 31B | Dense | 30.7B | 256K | 最强性能 |
E2B 中的 “E” 代表 “effective”(有效参数),模型采用 Per-Layer Embeddings(PLE)技术最大化参数效率,实际推理时只需处理 2.3B 有效参数,非常适合资源受限的环境。
本文选择 Gemma 4 E2B,在 ARM VPS 上用 Q4_K_M 量化部署,验证其推理性能和资源占用。
环境信息
- 机器: ARM VPS (4 OCPU, 24G RAM)
- 推理引擎: llama.cpp (Docker 镜像)
- 容器资源限制: 2 CPU / 6G 内存
第一阶段:部署 Gemma 3 4B
使用 llama.cpp 官方 Docker 镜像,从 HuggingFace 自动下载模型:
docker run -d \
--name gemma-vps \
--memory 6g --memory-swap 6g \
--cpus 2 \
-p 8012:8080 \
-v $HOME/llama-cache:/root/.cache/llama.cpp \
ghcr.io/ggml-org/llama.cpp:server \
--hf-repo lmstudio-community/gemma-3-4b-it-GGUF \
--hf-file gemma-3-4b-it-Q4_K_M.gguf \
--host 0.0.0.0 \
--port 8080 \
-c 1024 \
-np 1 \
-t 2 \
--metrics
参数说明:
| 参数 | 说明 |
|---|---|
--memory 6g |
限制容器最大内存 6G |
--cpus 2 |
限制最多使用 2 个 CPU 核心 |
-p 8012:8080 |
宿主机 8012 端口映射到容器 8080 |
-c 1024 |
上下文窗口大小 1024 token |
-np 1 |
1 个并行 slot(支持 1 个并发请求) |
-t 2 |
使用 2 个线程 |
--metrics |
启用 Prometheus 指标端点 |
模型会在首次启动时自动从 HuggingFace 下载,后续使用本地缓存。
性能监控
启用 Metrics
启动时加上 --metrics 参数后,可以通过 /metrics 端点获取 Prometheus 格式的指标:
curl -s http://localhost:8012/metrics
关键指标:
| 指标 | 说明 |
|---|---|
llamacpp:prompt_tokens_seconds |
Prompt 处理速度 (tokens/s) |
llamacpp:predicted_tokens_seconds |
生成速度 (tokens/s) |
llamacpp:requests_processing |
正在处理的请求数 |
Docker 资源监控
docker stats gemma-vps --no-stream
Gemma 3 4B 资源占用
| 状态 | CPU | 内存 |
|---|---|---|
| 空闲 | 0.64% | 4.84 GiB / 6 GiB (80%) |
| 生成中 | 194% | 4.87 GiB / 6 GiB (81%) |
不同 CPU 配置对比
| 配置 | 生成速度 | 生成中 CPU |
|---|---|---|
| 4C / 无内存限制 | 7.33 tokens/s | 337% |
| 2C / 6G 内存 | 5.04 tokens/s | 194% |
砍掉一半核心,生成速度降了约 31%。
第二阶段:升级到 Gemma 4 E2B
Gemma 4 发布后,切换到更高效的 Gemma 4 E2B (Efficient 2B) 模型。虽然参数标识为 E2B,但实际模型文件(2.88 GiB)比 Gemma 3 4B(2.31 GiB)略大,原因是包含视觉编码器。
docker stop gemma-vps && docker rm gemma-vps
docker run -d \
--name gemma-vps \
--memory 6g --memory-swap 6g \
--cpus 2 \
-p 8012:8080 \
-v $HOME/llama-cache:/root/.cache/llama.cpp \
ghcr.io/ggml-org/llama.cpp:server \
--hf-repo unsloth/gemma-4-E2B-it-GGUF \
--hf-file gemma-4-E2B-it-Q4_K_M.gguf \
--host 0.0.0.0 \
--port 8080 \
-c 4096 \
-np 2 \
-t 2 \
--metrics
相比 Gemma 3 的部署命令,做了两个调整:
-np从 1 改为 2,支持 2 个并发请求。得益于 Gemma 4 E2B 内存占用大幅降低,6G 限制下完全够用-c从 1024 调大到 4096,因为思维链模型需要更多上下文空间
上下文窗口踩坑
初始配置 -c 1024 -np 2 时,每个 slot 只有 512 tokens(1024 / 2 = 512)。由于 Gemma 4 E2B 是思维链模型,推理过程会消耗大量 token,导致 512 tokens 全被思维链占满,实际回复为空:
prompt_tokens: 26 + completion_tokens: 486 = total: 512 (slot 上限)
→ finish_reason: "length",content 为空
将 -c 调大到 4096 后,每个 slot 分配到 2048 tokens(4096 / 2 = 2048),约 1400 字,足够思维链推理 + 实际回复:
| 配置 | 每个 slot | 效果 |
|---|---|---|
-c 1024 -np 2 |
512 tokens | 思维链占满,回复被截断 |
-c 4096 -np 2 |
2048 tokens | 正常输出 |
调整后再次请求 500 字文章,模型正常返回:
{
"finish_reason": "stop",
"usage": {
"completion_tokens": 1201,
"prompt_tokens": 26,
"total_tokens": 1227
},
"timings": {
"prompt_per_second": 15.8,
"predicted_per_second": 6.9
}
}
思维链消耗约 200 tokens 用于规划文章结构和写作策略,剩余 1000 tokens 输出完整的 500 字中文文章,finish_reason 为 "stop" 表示自然结束,不再被截断。
注意事项
Gemma 4 E2B 是带思维链(Chain of Thought)的推理模型,返回结果中包含 reasoning_content 字段:
{
"choices": [{
"message": {
"content": "实际回复内容",
"reasoning_content": "模型的思考过程..."
}
}]
}
因为 token 会先用于思考,建议将 max_tokens 设置大一些(如 300-500),否则实际回复可能为空。
性能对比
| 指标 | Gemma 3 4B | Gemma 4 E2B | 变化 |
|---|---|---|---|
| 模型大小 | 2.31 GiB | 2.88 GiB | +25% |
| 空闲内存 | 4.84 GiB | 1.78 GiB | -63% |
| Prompt 速度 | ~15 tokens/s | ~16.6 tokens/s | +11% |
| 生成速度 | ~5 tokens/s | ~8.3 tokens/s | +66% |
| 并发支持 | 1 slot | 2 slots | +100% |
| 思维链 | 无 | 有 | 新增 |
| 视觉能力 | 有 | 有 | 保持 |
Gemma 4 E2B 采用 Efficient 架构,内存占用降低 63% 的同时推理速度提升了 66%,还额外支持了并发请求和思维链推理。
验证服务
文本对话
curl -s http://localhost:8012/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{"model":"gemma-4","messages":[{"role":"user","content":"你好"}],"max_tokens":300}'
图片识别
Gemma 4 E2B 内置视觉编码器,支持图片输入。使用 base64 编码的图片发送请求:
B64=$(base64 -w0 /path/to/image.jpg)
curl -s http://localhost:8012/v1/chat/completions \
-H "Content-Type: application/json" \
-d "{
\"model\":\"gemma-4\",
\"messages\":[{\"role\":\"user\",\"content\":[
{\"type\":\"image_url\",\"image_url\":{\"url\":\"data:image/jpeg;base64;$B64\"}},
{\"type\":\"text\",\"text\":\"描述这张图片\"}
]}],
\"max_tokens\":500
}"
实测 128x128 的 JPG 图片,模型能正确识别图片内容(动物、环境等细节),推理速度约 7 tokens/s。需要注意 max_tokens 要设大一些(建议 500+),因为思维链会消耗大量 token。
多模态支持情况
| 模态 | 模型支持 | 实际可用 | 备注 |
|---|---|---|---|
| 文本 | 支持 | 正常 | 主要使用场景 |
| 图片 | 支持 | 可用 | 小图片可用,大图片处理较慢 |
| 音频 | 包含 encoder | 暂不可用 | llama.cpp 尚未暴露音频接口 |
总结
在 ARM VPS 上跑本地 LLM 完全可行。Gemma 4 E2B 在 2C/6G 限制下达到 8.3 tokens/s,比 Gemma 3 4B 快了 66%,内存占用降低 63%,还额外获得了思维链推理和图片识别能力。主要瓶颈仍在 CPU,如果有 GPU 会有质的飞跃。