Gemma 3:Google 开源的单卡多模态小模型,普通人也能本地跑

Gemma 3:Google 开源的单卡多模态小模型,普通人也能本地跑

大模型

📖 简介

Gemma 3 是 Google 开源的多模态轻量模型家族,一张消费级显卡就能跑,支持文本、图像与 140+ 语言,把前沿多模态能力带到了个人开发者的桌面。

📝 详细介绍

这篇教程带你完成什么

从零开始,在你的本地电脑上用 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 #多模态 #小模型 #本地部署
浏览
👁️ 14
发布日期
2026-09-09