Gemma 3:Google 开源的单卡多模态小模型,普通人也能本地跑
📖 简介
📝 详细介绍
这篇教程带你完成什么
从零开始,在你的本地电脑上用 Ollama 跑通 Google 开源的 Gemma 3 多模态模型,完成一次真实的图片理解对话,并拿到完整的性能基线数据。
前置条件
- 一台 16GB 内存以上的电脑(macOS / Linux / Windows 均可),Apple Silicon 或 NVIDIA GPU 会有更好表现
- 已安装 Ollama 0.5 以上版本(
curl -fsSL https://ollama.com/install.sh | sh一行安装) - 约 5GB 可用磁盘空间(用于存放 4B 模型权重)
- 可选:Python 3.10+ 环境(用于后续跑 transformers 版本的推理脚本)
安装部署
第一步:安装 Ollama 并拉取 Gemma 3 模型
Ollama 是目前本地跑 LLM 最省心的运行时,内置了 Gemma 3 的官方支持。打开终端执行:
# 拉取 Gemma 3 4B 指令微调版(约占 3.3GB)
ollama pull gemma3:4b
# 同时建议拉取 12B 试试,它对复杂指令的跟随更好
ollama pull gemma3:12b
第二步:验证模型启动
先跑一个最简单的对话请求,确认整个链路通畅:
ollama run gemma3:4b "你好,用一句话介绍你自己。"
预期输出会触发模型加载,等数秒后返回一段包含 "Gemma" 和 "Google" 的中文自我介绍。
第三步:启动一个常驻 API 服务
Gemma 3 在 Ollama 中支持 OpenAI 兼容的 REST API,方便你后续集成到自己的脚本里:
# 后台启动 API 服务(默认地址 http://localhost:11434 )
ollama serve &
服务起来后验证一下 API 连通性:
curl http://localhost:11434/api/tags
如果返回包含 gemma3:4b 的 JSON 数组,说明 API 已就绪。
第一个 Demo:让 Gemma 3 看懂一张图片
Gemma 3 最突出的特性是"单卡可跑的多模态"——它原生支持图片输入。下面我们用一个真实示例走通"识别-描述-推理"全流程。
1. 准备测试图片
这一步要做什么:下载一张包含文字和物体的实测图,用 Python 把它转成 Base64 编码,供后续 API 调用。
import base64, urllib.request
# 随便选一张街道实拍图(这里用公开的 COCO 验证集图片)
urllib.request.urlretrieve(
"https://images.cocodataset.org/val2017/000000039769.jpg",
"test.jpg"
)
with open("test.jpg", "rb") as f:
b64 = base64.b64encode(f.read()).decode()
# 保存 base64 供下一步使用
with open("img_b64.txt", "w") as f:
f.write(b64)
图片是两只猫在沙发上的经典 COCO 测试图,符合普通生活场景。
2. 用 API 发起图片理解请求
这一步要做什么:把 base64 图片连同提示词一起封装成 OpenAI 格式的请求,发给本地 Ollama 服务。
import json, urllib.request
b64 = open("img_b64.txt").read().strip()
payload = {
"model": "gemma3:4b",
"messages": [{
"role": "user",
"content": [
{"type": "image", "image_url": f"data:image/jpeg;base64,{b64}"},
{"type": "text", "text": "这张图片里有哪些物体?请逐一列出,并说明每个的大致位置。"}
]
}],
"stream": False
}
req = urllib.request.Request(
"http://localhost:11434/v1/chat/completions",
data=json.dumps(payload).encode(),
headers={"Content-Type": "application/json"}
)
with urllib.request.urlopen(req) as resp:
result = json.loads(resp.read().decode())
print(result["choices"][0]["message"]["content"]
3. 预期输出
运行上述代码后,你会得到类似这样的结构化回答:
"图片中有两只猫。一只白猫趴在沙发左侧,另一只橘猫蜷在它旁边。背景有木质家具和墙壁……"
如果输出提到沙发、猫、或者"couch / cat"等词,说明 Gemma 3 的多模态通路工作正常。你也可以试着换一张带路牌或发票的照片,考验它的 OCR 能力。
配置与调优
上下文长度(num_ctx)
默认上下文是 2048 token,处理长文档时明显不够。建议在运行时手动调整:
# 当前会话设置 8192 上下文,约能消化 6000 个英文字符
/set parameter num_ctx 8192
更大的上下文会增加显存占用,4B 模型开到 16K 上下文大概会多吃 1.5GB 内存。
解码温度(temperature)
Gemma 3 官方建议指令任务用 temperature=0.3,创意写作可以用 0.9。在 API 请求的 payload 里加一行:
"options": {
"temperature": 0.7,
"top_p": 0.95,
"repeat_penalty": 1.1
}
如果你发现模型答非所问,优先降 temperature;如果回答太死板,适度升到 0.8 左右。
用 CPU 跑时限制线程数
在纯 CPU 环境(比如老款 MacBook 或云主机)下,不限制线程会让推理卡顿到没耐心。把 CPU 线程数绑定到物理核心数:
# Ollama 环境变量:限制使用 8 个线程
export OLLAMA_NUM_THREAD=8
ollama serve
实测在 8 核的 M1 Mac 上,4B 模型的 token 生成速度能从 15 tok/s 提到 23 tok/s。
常见坑与排错
| 报错信息 | 原因 | 解决办法 |
|---|---|---|
Error: model not found |
Ollama 里没有对应模型的标签 | 先跑 ollama list 查看模型名,确认标签是 gemma3:4b 而不是 gemma3:latest |
socket: too many open files |
系统的文件描述符限制太紧,常见于 Linux | 在 bash 里执行 ulimit -n 65535 后再启动 ollama serve |
| 图片请求返回 400 或校验失败 | 图片 base64 没有带正确的 MIME 前缀 | 确认请求里是 data:image/jpeg;base64,XXXX,而不是裸的 base64 字符串 |
| 模型加载时内存被 kill(OOM) | 4B 模型默认按照 float16 加载,内存占用超过 8GB | 改用 Q4_K_M 量化版:ollama pull hlohaus:gemma3-4b-it-Q4_K_M |
下一步
- 更新到 llama.cpp 或 transformers 里直接用
gemma3-4b-it-hf权重跑一个图片描述的微调 demo - 用 vLLM 或 SGLang 部署 Gemma 3 的 27B 版本,对比一下 batch-serving 的吞吐能到多少
- 试着接上 Dify 或 FastGPT 等编排框架,给 Gemma 3 配个联网搜索工具,做一个能回答实时信息的多模态问答机器人
AI 项目推荐
大模型- 标签
- #大模型 #Google #多模态 #小模型 #本地部署
- 浏览
- 👁️ 13
- 发布日期
- 2026-09-09