Google 提供的 Android 端上大模型组件:MediaPipe LLM 介绍

概述

大家好,最近被 Gemini 2.0 "狙击 OpenAI" 的消息刷屏,让我对 Google 的大模型技术有了新的认识,同时也好奇,作为 Google 的亲儿子,Android 上有没有什么比较好用的端上大模型库呢?经过一番学习,最后发现了适用范围最广的 MediaPipe LLM!

很多人可能听说过 MediaPipe,但不清楚这个 MediaPipe LLM 和 MediaPipe 什么关系。

简单的讲,MediaPipe 是 Google 开发的一个开源框架,用于构建跨平台的计算机视觉和机器学习解决方案。它支持完整的机器学习管道,并允许在设备端运行大型模型,从而减少对网络的依赖并提高响应速度。

而 MediaPipe LLM 是 MediaPipe 中专门用于集成和使用大语言模型 (LLM) 的一个模块或组件。它旨在将 LLM 的强大能力引入到多媒体处理流水线中。它特别优化了在设备端运行大型模型的能力,使得在 Android 设备上运行大型语言模型(LLMs)成为可能(与传统的小型设备模型相比,大语言模型通常拥有超过百倍的参数量,对内存和计算能力有更高的要求)。

重点来了!MediaPipe LLM 可以 使用 Google 的 Gemini 模型!包括最新的 Gemini 2.0!

在 Android 上使用 MediaPipe LLM

在 Android 上使用 MediaPipe LLM,主要包括这么几步:

环境和依赖设置

在你的 Android 项目的 build.gradle 文件中添加以下依赖:

gradle 复制代码
dependencies {
    // 使用最新版本的 MediaPipe LLM Inference API 库
    implementation 'com.google.mediapipe:tasks-genai:0.10.14'
}

对于 Android 12 (API 31) 或更高版本的设备,添加原生 OpenCL 库依赖,并在 AndroidManifest.xml 中添加以下标签:

xml 复制代码
<uses-native-library android:name="libOpenCL.so" android:required="false"/>
<uses-native-library android:name="libOpenCL-car.so" android:required="false"/>
<uses-native-library android:name="libOpenCL-pixel.so" android:required="false"/>

模型准备

模型下载

MediaPipe LLM Inference API 支持多种预训练的文本到文本语言模型。以下是如何下载和使用这些模型的步骤:

  1. 选择模型:确定你需要的模型类型,比如 Gemma、Phi 2、Falcon 或 Stable LM。

  2. 下载模型:从官方或第三方资源下载模型。对于 Gemma 模型,你可以在 Kaggle Models 上找到最新的版本。

  3. 模型转换:如果你使用的是非 Gemma 模型,可能需要将模型转换为 MediaPipe 兼容的格式。使用 MediaPipe 提供的 Python 包进行转换。

    复制代码
    python
    from mediapipe.tasks.python.genai import converter
    
    config = converter.ConversionConfig(
        # 基础模型参数
        ...
        # LoRA 相关参数
        lora_ckpt=LORA_CKPT,
        lora_rank=LORA_RANK,
        lora_output_tflite_file=LORA_OUTPUT_TFLITE_FILE,
    )
    
    converter.convert_checkpoint(config)
  4. 推送模型到设备 :使用 adb 将模型文件推送到 Android 设备上。

    复制代码
    bash
    adb shell rm -r /data/local/tmp/llm/
    adb shell mkdir -p /data/local/tmp/llm/
    adb push /path/to/model_version.bin /data/local/tmp/llm/
模型特点
  • Gemma 系列

    • Gemma-2 2B:Gemma 系列的最新版本,适用于多种文本生成任务,如问答、摘要和推理。
    • Gemma 2B:适用于各种文本生成任务,包括问答、摘要和推理。
    • Gemma 7B:具有更大的参数量,能够处理更复杂的语言任务,但需要更多的计算资源。
  • Phi-2

    • Phi-2:一个具有 2.7 亿参数的 Transformer 模型,最适合问答、聊天和代码格式任务。
  • Falcon-RW-1B

    • Falcon-RW-1B:一个 10 亿参数的因果解码器模型,训练于 3500 亿个 RefinedWeb 令牌。
  • StableLM-3B

    • StableLM-3B:一个 30 亿参数的解码器模型,预训练于 1 万亿个多样化的英文和代码数据集。

通过这些步骤和模型特点的介绍,你应该能够更好地理解如何为你的 Android 应用选择合适的模型,并有效地集成 MediaPipe LLM Inference API。这些模型的选择将取决于你的具体需求,包括应用场景、性能要求和资源限制。

创建任务

使用 createFromOptions() 函数初始化 MediaPipe LLM Inference 任务:

kotlin 复制代码
// 设置 LLM Inference 任务的配置选项
val options = LlmInferenceOptions.builder()
        .setModelPath('/data/local/tmp/llm/model_version.bin') // 模型路径
        .setMaxTokens(1000) // 最大令牌数
        .setTopK(40) // 令牌生成时考虑的候选数量
        .setTemperature(0.8) // 生成时引入的随机性程度
        .setRandomSeed(101) // 文本生成时使用的随机种子
        .build()

// 创建 LLM Inference 任务实例
val llmInference = LlmInference.createFromOptions(context, options)

运行任务

准备输入数据(prompt),并使用 generateResponse() 方法生成响应:

kotlin 复制代码
val inputPrompt = "Compose an email to remind Brett of lunch plans at noon on Saturday."
val result = llmInference.generateResponse(inputPrompt)
logger.atInfo().log("result: $result")

如果想要异步流式生成,可以使用 generateResponseAsync()

复制代码
val options = LlmInference.LlmInferenceOptions.builder()
  ...
  .setResultListener { partialResult, done ->
    logger.atInfo().log("partial result: $partialResult")  //这里返回结果
  }
  .build()

llmInference.generateResponseAsync(inputPrompt)

处理和显示结果

LLM Inference API 返回 LlmInferenceResult,其中包含生成的响应文本。你可以如下处理和显示结果:

kotlin 复制代码
// 假设 result 是 LlmInferenceResult 对象
val responseText = result.responseText
// 将响应文本显示在 UI 上
textView.text = responseText

总结

OK,这就是 MediaPipe LLM 的基本介绍,使用起来还是非常方便的!

希望通过这篇文章可以让你对如何在端上使用 Google 大模型有更多的认识。

如果想直接参考代码,可以下载官方提供的案例:

复制代码
git clone https://github.com/google-ai-edge/mediapipe-samples

如果想了解更多 Gemini on Android 的信息,推荐叶老师的这个视频,讲解的很清晰:Gemini on Android:打开移动设备的AI新世界

时代的车轮滚滚向前,我们必须向前(AI)看!

相关推荐
BD_Marathon1 小时前
【MySQL】函数
android·数据库·mysql
西西学代码2 小时前
安卓开发---耳机的按键设置的UI实例
android·ui
maki0776 小时前
虚幻版Pico大空间VR入门教程 05 —— 原点坐标和项目优化技巧整理
android·游戏引擎·vr·虚幻·pico·htc vive·大空间
千里马学框架6 小时前
音频焦点学习之AudioFocusRequest.Builder类剖析
android·面试·智能手机·车载系统·音视频·安卓framework开发·audio
fundroid10 小时前
掌握 Compose 性能优化三步法
android·android jetpack
TeleostNaCl11 小时前
如何在 IDEA 中使用 Proguard 自动混淆 Gradle 编译的Java 项目
android·java·经验分享·kotlin·gradle·intellij-idea
旷野说12 小时前
Android Studio Narwhal 3 特性
android·ide·android studio
maki07718 小时前
VR大空间资料 01 —— 常用VR框架对比
android·ue5·游戏引擎·vr·虚幻·pico
xhBruce1 天前
InputReader与InputDispatcher关系 - android-15.0.0_r23
android·ims
领创工作室1 天前
安卓设备分区作用详解-测试机红米K40
android·java·linux