当前位置: 首页 > article >正文

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 文件中添加以下依赖:

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

对于 Android 12 (API 31) 或更高版本的设备,添加原生 OpenCL 库依赖,并在 AndroidManifest.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 上找到最新的版本。

    • Gemma-2 2B on Kaggle
  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 任务:

// 设置 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() 方法生成响应:

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,其中包含生成的响应文本。你可以如下处理和显示结果:

// 假设 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)看!


http://www.kler.cn/a/451075.html

相关文章:

  • 基于kraft部署kafka集群
  • 优化 invite_codes 表的 SQL 创建语句
  • StarRocks一次复杂查询引起的Planner超时异常
  • Verdi -- 打开Consol,创建和执行tcl命令举例
  • 华为浏览器(HuaweiBrowser),简约高效上网更轻松
  • vue3封装而成的APP ,在版本更新后,页面显示空白
  • 单片机 STM32入门
  • windows C#-对象和集合初始值设定项(中)
  • RustDesk远程及自建服务器搭建教程
  • Java/JDK下载、安装及环境配置超详细教程【Windows10、macOS和Linux图文详解】
  • 国标GB28181设备管理软件EasyGBS:P2P远程访问故障排查指南(设备端)
  • 自然语言处理与知识图谱的融合与应用
  • K8s - openeuler2203SP1安装 K8s + flannel
  • 浅谈 前端验证码那些事
  • STM32 与 AS608 指纹模块的调试与应用
  • keepalived踩坑记录
  • 前端:纯前端快速实现html导出word和pdf
  • 【EthIf-13】EthIfGeneral容器配置-01
  • IDEA使用Alt + Enter快捷键自动接受返回值一直有final修饰的问题处理
  • 重温设计模式--中介者模式
  • 微积分复习笔记 Calculus Volume 2 - 5.1 Sequences
  • Golang并发机制以及它所使⽤的CSP并发模型
  • [LeetCode-Python版]相向双指针——18. 四数之和
  • MySQL什么情况下会导致索引失效
  • 关于C语言库的调用
  • 如何编译Opencv +ffmpeg linux 明明安装了ffmpeg但是opencv就是找不到