跳至主要内容

Gemma 3n:带演示项目的指南(VLM Android 应用)

学习如何构建一款 Android 应用,在手机本地使用 Google 的 Gemma 3n 对图像进行问答,无需云端连接。
· 12分钟 阅读

使用 AI 探索

Google 刚刚发布了 Gemma 3n,一款用于边缘设备的多模态模型,支持视觉、语言和音频任务,并可模块化执行。在本教程中,我将逐步讲解如何在您的 Android 设备上本地下载并运行 Gemma 3n——无需云端算力。我们将使用一个演示应用,它可以:

  • 用自然语言就图像提出问题
  • 使用 Google 的 ai-edge-litert 运行时完全离线运行模型
  • 在自定义 Android 应用界面中体验并测试

您将了解 .task 文件格式如何实现轻量化部署,应用如何自动下载并初始化 Gemma 3n 以供本地使用,同时保持流畅的性能和较低的内存占用。

什么是 Gemma 3n?

Gemma 3n 是 Google AI 最新推出的多模态开源权重模型家族,旨在在手机、平板和笔记本等日常设备上高效运行。它基于全新的 MatFormer 架构,并支持逐层嵌入(PLE)参数缓存,在降低内存与计算成本的同时实现了出色的端侧性能。

与传统的 视觉-语言模型(VLM)类似,Gemma 3n 支持文本、图像和音频模态。其中“3n”变体专为边缘部署优化,可通过 Google 的 AI Edge SDK 在 CPU、NPU 或移动 GPU 上轻量运行。

以下是 Gemma 3n 的主要特性:

  • 多模态输入: 支持文本与图像输入,用于有依据的视觉推理
  • 端侧推理: 模型下载完成后无需网络
  • 参数高效: 通过选择性激活、PLE 缓存与 MatFormer 嵌套降低内存开销
  • 移动端优化: 通过 MediaPipe 和 Google AI Edge 工具在 Android 上支持 INT4 与 FP16 推理
  • 开放权重: 许可用于负责任的商业用途与微调

重要提示:尽管 Gemma 3n 的完整架构支持音频输入,但公共预览版暂不提供音频能力。

如何获取 Gemma 3n?

您可以通过以下三种方式试用 Gemma 3n:

  1. Google AI Studio:在浏览器中最快上手的方法。前往 Google AI Studio,在模型列表中选择 Gemma 3n。目前仅提供“gemma-3n-e4b-it”变体可用。 
  2. Hugging Face 预览:Gemma 3n 的 .task 文件以 Google 的 ai-edge-litert 格式发布。您可以申请访问 Hugging Face 模型页面,并将模型下载到本地进行推理。.task 文件是一种紧凑、适配运行时的打包格式,内含预编译的模型、元数据与所需配置,专为通过 Google 的 AI Edge SDK 在设备端快速且安全地执行而设计。
  3. 在设备上运行(推荐):使用 Google 提供的 Gemma Gallery App,在您的 Android 手机上直接运行 Gemma 3n。该方式支持通过本地模型进行完整的图像与提示交互。

接下来,我将带您构建一款可用的 Android 应用,利用 Gemma 3n 处理图像与文本提示。我们将以 Google 的官方 Gallery 仓库为基础,并自定义使其直接打开到Ask Image页面,避免干扰。

步骤 1:克隆并设置应用

首先,新建项目并克隆 Google 的原始仓库。

步骤 1.1:创建新的 Android Studio 项目

在您的电脑上,用Android Studio 以新项目方式打开,并选择 Empty Activity。

用于运行 gemma 3n 的 Android Studio 新建项目窗口

步骤 1.2:设置新的空 Activity

接着填写您的 Activity 名称(例如 “Ask_Image_Demo”),其余保持默认。然后点击 Finish。

gemma 3n 的 Android Studio 空 Activity

步骤 1.3:克隆主仓库

现在,在 Android Studio 内打开终端(左下角),执行以下 bash 命令:

git clone https://github.com/google-ai-edge/gallery
cd gallery/android

用于运行 gemma 3n 的 Android Studio 终端

这将打开您的项目。您可以在左侧标签看到所有项目文件。

Android Studio 文件

步骤 2:只保留 Ask Image 任务

接下来,我们修改几个文件,使应用打开后直接进入 Ask Image 页面。前往 Tasks.kt 文件,路径:app/src/main/java/com/google/ai/edge/gallery/data/Tasks.kt。为将应用功能限定为仅“Ask Image”,做如下修改:

修改前:

/** All tasks. */
val TASKS: List<Task> = listOf(
  TASK_LLM_ASK_IMAGE,
  TASK_LLM_PROMPT_LAB,
  TASK_LLM_CHAT,
)

修改后:

/** All tasks. */
val TASKS: List<Task> = listOf(
  TASK_LLM_ASK_IMAGE
)

这将禁用 Prompt Lab 和 Chat 等其他演示,确保只显示 Ask Image。

步骤 3:自动导航至 Ask Image 界面

在 GalleryApp.kt(位置:// app/src/main/java/com/google/ai/edge/gallery/GalleryApp.kt)中,更新 LaunchedEffect 以自动导航到图像页面。这样应用会直接打开 Ask Image 界面,跳过默认的任务选择屏幕。

修改前:

@Composable
fun GalleryApp(navController: NavHostController = rememberNavController()) {
  GalleryNavHost(navController = navController)
}

修改后:

package com.google.ai.edge.gallery
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.navigation.NavHostController
import androidx.navigation.compose.rememberNavController
import com.google.ai.edge.gallery.data.TASK_LLM_ASK_IMAGE
import com.google.ai.edge.gallery.ui.llmchat.LlmAskImageDestination
import com.google.ai.edge.gallery.ui.navigation.GalleryNavHost
@Composable
fun GalleryApp(
  navController: NavHostController = rememberNavController()
) {
  // as soon as GalleryApp comes up, navigate to Ask-Image 
  // and drop “home” off the back-stack:
  LaunchedEffect(Unit) {
    TASK_LLM_ASK_IMAGE.models
      .firstOrNull()    // safety: don’t crash if the models list is empty
      ?.name
      ?.let { modelName ->
        navController.navigate("${LlmAskImageDestination.route}/$modelName") {
          popUpTo("home") { inclusive = true }
        }
      }
  }
  GalleryNavHost(navController = navController)
}

下面是更新后的 GalleryApp 函数所做工作的解析:

  • LaunchedEffect:Jetpack Compose 中的副作用 API,组合时触发一次。此处用于在 GalleryApp 渲染后立即执行导航逻辑。
  • 获取首个可用模型: TASK_LLM_ASK_IMAGE.models.firstOrNull() 安全获取首个可用的图文模型名称(如 Gemma 3n)以用于导航,避免在模型列表为空时崩溃。
  • navController.navigate():使用所选模型名称动态跳转到 Ask-Image 界面,替代常规 Home 界面作为入口。
  • 从返回栈移除 Home 界面:通过 popUpTo("home") 清理导航栈,将 Home 从历史中移除,防止用户通过系统返回键回到该界面。

其余代码保持不变。上述改动可使应用在启动时直接进入 Ask-Image 界面并加载有效模型,从而优化演示的使用流程。

步骤 4:在设备上安装并运行应用

完成必要修改后,我们来运行应用。要在本地 Android 设备上运行,使用无线调试将设备与 Android Studio 配对,步骤如下。

步骤 4.1:设置 Android 设备

在 Android 设备上打开设置应用,启用开发者选项,然后打开无线调试。您会看到包含两种配对方式的界面。

在 Android 设备上用于运行 gemma 3n 的无线调试设置

步骤 4.2:在 Android Studio 管理设备

在 Android Studio 中打开Device Manager(图标类似带 Android 标志的手机),点击Pair using QR code。

通过 WiFi 配对新设备

使用您的设备扫描二维码并完成配对。设备连接成功后,您将在 Device Manager 下看到设备名称。请确保电脑与 Android 设备连接到同一 WiFi 网络。

设备管理器

步骤 4.3:运行应用

点击Device Mirroring 图标(显示一台桌面屏与一台手机屏)开始镜像您的 Android 设备。看到设备屏幕镜像后,点击绿色Run 图标,将应用部署到设备上。

步骤 4.4:在设备上下载模型

应用将启动,并打开浏览器窗口,提示您登录 Hugging Face 以安全下载模型文件。

Chrome 窗口  HuggingFace 窗口

登录 HuggingFace 后,选择目标模型并点击开始下载,即可开始。本文示例默认使用 Gemma-3n-E2B-it-int4 模型。

本地下载 gemma 3n

步骤 4.5:开始试验

下载完成后,应用会直接进入“Ask Image”页面。然后,从相册选择一张图片或使用设备相机拍摄新照片,配合提示词一起发送给模型。

Ask Image 首页

下面是我测试的一个示例。

在 CPU 上使用 gemma 3n 的 Ask Image 演示

  gemma 3n 的 Ask Image 演示

模型最初在 CPU 上运行。您可以通过“调优”图标(显示三条横向滑块)切换到 GPU,以获得潜在的更好性能。

Ask Image 演示:配置

   在 GPU 上的 Ask Image 演示

切换到 GPU 可以显著降低整体时延,尤其是在处理更大图像和更复杂查询时。虽然 GPU 通常具备更快的解码速度,从而更快给出响应,但需要注意预填(prefill)速度有时在 CPU 上略占优势。

这是因为数据的初始加载与准备(预填)可能受限于 CPU。不过,GPU 更快的解码与整体更低的时延通常能弥补这一点,带来更顺滑、更灵敏的体验。

如果您想查看完整项目代码,我已准备了这个 GitHub 仓库供您探索。

总结

我们探讨了如何在边缘设备上实现图像问答,无需云端推理。您已经学会如何将 .task 文件集成进轻量级 Android 应用,用自然语言提示模型,并在手机上获得关于任意图像的准确回答。

本实操指南展示了 Gemma 3n 如何让多模态 AI 更加普及,便于开发者与研究者在设备端部署强大的模型。无论是构建离线助理、教育工具、医疗应用等,Gemma 3n 都能支持多种场景。

随着 Google 持续完善 Matformer 架构,我预计会出现更紧凑的多模态模型,具备更高精度与更低时延。想进一步了解 Gemma 3n,请查看官方 AI Edge 发布博文,或前往 GitHub 深入阅读开源仓库。

如果您想探索更多新 AI 工具,推荐阅读以下博文:

Aashi Dutt

作者

Aashi Dutt

我是一名 Google Developers 机器学习(生成式 AI)领域的专家、Kaggle 三项专家,以及 Women Techmakers 大使,拥有 3 年以上的技术从业经验。2020 年我共同创办了一家健康科技初创公司,目前在佐治亚理工学院攻读计算机科学硕士,专攻机器学习。

主题