在 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 场景
  • 原生系统提示:首次原生支持 system role

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 会有质的飞跃。