概述
大家好,最近被 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 支持多种预训练的文本到文本语言模型。以下是如何下载和使用这些模型的步骤:
-
选择模型:确定你需要的模型类型,比如 Gemma、Phi 2、Falcon 或 Stable LM。
-
下载模型:从官方或第三方资源下载模型。对于 Gemma 模型,你可以在 Kaggle Models 上找到最新的版本。
-
模型转换:如果你使用的是非 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)
-
推送模型到设备 :使用
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)看!