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 包进行转换。

    ini 复制代码
    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 复制代码
    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()

scss 复制代码
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 大模型有更多的认识。

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

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

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

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

相关推荐
花追雨1 分钟前
Android -- 双屏异显之方法一
android·双屏异显
小趴菜82273 分钟前
安卓 自定义矢量图片控件 - 支持属性修改矢量图路径颜色
android
氤氲息6 分钟前
Android v4和v7冲突
android
KdanMin7 分钟前
高通Android 12 Launcher应用名称太长显示完整
android
chenjk48 分钟前
Android不可擦除分区写文件恢复出厂设置,无法读写问题
android
袁震9 分钟前
Android-Glide缓存机制
android·缓存·移动开发·glide
工程师老罗12 分钟前
Android笔试面试题AI答之SQLite(2)
android·jvm·sqlite
凡人的AI工具箱12 分钟前
每天40分玩转Django:Django测试
数据库·人工智能·后端·python·django·sqlite
大多_C22 分钟前
BERT outputs
人工智能·深度学习·bert
Debroon1 小时前
乳腺癌多模态诊断解释框架:CNN + 可解释 AI 可视化
人工智能·神经网络·cnn