באמצעות LLM Inference API אפשר להריץ מודלים גדולים של שפה (LLM) באופן מלא במכשיר לאפליקציות ל-Android. אפשר להשתמש במודלים האלה לביצוע מגוון רחב של משימות, כמו יצירת טקסט, אחזור מידע בצורת שפה טבעית וסיכום מסמכים. המשימה מספקת תמיכה מובנית במספר מודלים גדולים של שפה (LLM) מסוג טקסט לטקסט, כך שתוכלו להחיל את המודלים העדכניים ביותר של AI גנרטיבי במכשיר על האפליקציות שלכם ל-Android.
כדי להוסיף במהירות את LLM Inference API לאפליקציה ל-Android, תוכלו להיעזר במדריך למתחילים. דוגמה בסיסית לאפליקציה ל-Android שפועל בה LLM Inference API מופיעה באפליקציה לדוגמה. למידע מעמיק יותר על אופן הפעולה של LLM Inference API, אפשר לעיין בקטעים אפשרויות ההגדרה, המרת מודל וכוונון LoRA.
אתם יכולים לראות את המשימה הזו בפעולה בהדגמה של MediaPipe Studio. מידע נוסף על היכולות, המודלים והאפשרויות להגדרה של המשימה הזו זמין בסקירה הכללית.
מדריך למתחילים
כדי להוסיף את LLM Inference API לאפליקציה ל-Android, פועלים לפי השלבים הבאים. LLM Inference API מותאם למכשירי Android מתקדמים, כמו Pixel 8 ו-Samsung S23 ואילך, ואין לו תמיכה מהימנה במהירי מכשירי Android.
הוספת יחסי תלות
ב-LLM Inference API נעשה שימוש בספרייה com.google.mediapipe:tasks-genai
. מוסיפים את התלות הזו לקובץ build.gradle
של אפליקציית Android:
dependencies {
implementation 'com.google.mediapipe:tasks-genai:0.10.24'
}
הורדת מודל
מורידים את Gemma-3 1B בפורמט 4-bit quantized מ-Hugging Face. מידע נוסף על המודלים הזמינים זמין במסמכי התיעוד בנושא מודלים.
מעבירים את התוכן של התיקייה output_path למכשיר Android.
$ adb shell rm -r /data/local/tmp/llm/ # Remove any previously loaded models
$ adb shell mkdir -p /data/local/tmp/llm/
$ adb push output_path /data/local/tmp/llm/model_version.task
איך מפעילים את המשימה
מאתחלים את המשימה עם אפשרויות תצורה בסיסיות:
// Set the configuration options for the LLM Inference task
val taskOptions = LlmInferenceOptions.builder()
.setModelPath('/data/local/tmp/llm/model_version.task')
.setMaxTopK(64)
.build()
// Create an instance of the LLM Inference task
llmInference = LlmInference.createFromOptions(context, taskOptions)
הרצת המשימה
משתמשים ב-method generateResponse()
כדי ליצור תשובת טקסט. כך נוצרת תשובה אחת.
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)
אפליקציה לדוגמה
כדי לראות את ממשקי ה-API של LLM Inference בפעולה ולעיין במגוון רחב של יכולות של בינה מלאכותית גנרטיבית במכשיר, כדאי להוריד את אפליקציית Google AI Edge Gallery.
Google AI Edge Gallery היא אפליקציה ל-Android בקוד פתוח שמשמשת כמגרש משחקים אינטראקטיבי למפתחים. מוצגים בה:
- דוגמאות מעשיות לשימוש ב-LLM Inference API למשימות שונות, כולל:
- שאלה על תמונה: מעלים תמונה ושואלים שאלות לגביה. לקבלת תיאורים, לפתרון בעיות או לזיהוי אובייקטים.
- Prompt Lab: סיכום, כתיבה מחדש, יצירת קוד או שימוש בהנחיות בפורמט חופשי כדי לבחון תרחישים לדוגמה של LLM עם תור אחד.
- צ'אט עם AI: התכתבות בשיחות עם זיכרון.
- היכולת לגלות, להוריד ולנסות מגוון מודלים שעברו אופטימיזציה ל-LiteRT מהקהילה של Hugging Face LiteRT וממהדורות רשמיות של Google (למשל Gemma 3N).
- מדדי ביצועים במכשיר בזמן אמת לדגמים שונים (זמן לקבלת האסימון הראשון, מהירות פענוח וכו').
- איך מייבאים מודלים מותאמים אישית של
.task
ובודקים אותם.
האפליקציה הזו היא מקור מידע שיעזור לכם להבין את היישום המעשי של LLM Inference API ואת הפוטנציאל של AI גנרטיבי במכשיר. אפשר לעיין בקוד המקור ולהוריד את האפליקציה מ מאגר GitHub של Google AI Edge Gallery.
אפשרויות הגדרה
אפשר להשתמש באפשרויות ההגדרה הבאות כדי להגדיר אפליקציה ל-Android:
שם האפשרות | תיאור | טווח ערכים | ערך ברירת מחדל |
---|---|---|---|
modelPath |
הנתיב שבו המודל מאוחסן בתוך ספריית הפרויקט. | PATH | לא רלוונטי |
maxTokens |
המספר המקסימלי של אסימונים (אסימוני קלט + אסימוני פלט) שהמודל מטפל בהם. | מספר שלם | 512 |
topK |
מספר האסימונים שהמודל מתייחס אליהם בכל שלב של היצירה. הגבלת התחזיות ל-k האסימונים האפשריים הטובים ביותר. | מספר שלם | 40 |
temperature |
מידת האקראיות שנוספה במהלך היצירה. טמפרטורה גבוהה יותר מובילה ליצירת טקסט יצירתי יותר, ואילו טמפרטורה נמוכה יותר מובילה ליצירת טקסט צפוי יותר. | מספר ממשי (float) | 0.8 |
randomSeed |
המקור האקראי שמשמש ליצירת הטקסט. | מספר שלם | 0 |
loraPath |
הנתיב המוחלט למודל LoRA באופן מקומי במכשיר. הערה: האפשרות הזו תואמת רק לדגמי GPU. | PATH | לא רלוונטי |
resultListener |
הגדרת מאזין התוצאות לקבלת התוצאות באופן אסינכרוני. רלוונטי רק כשמשתמשים בשיטת היצירה האסינכרונית. | לא רלוונטי | לא רלוונטי |
errorListener |
הגדרת מאזין אופציונלי לשגיאות. | לא רלוונטי | לא רלוונטי |
הנחיות במגוון מצבים
ממשקי ה-API של LLM Inference API ל-Android תומכים בהנחיות מולטי-מודאליות באמצעות מודלים שמקבלים קלט של טקסט ותמונות. כשהתכונה 'מולטי-מודאליות' מופעלת, המשתמשים יכולים לכלול בהנחיות שלהם שילוב של תמונות וטקסט, וה-LLM מספק תשובה בטקסט.
כדי להתחיל, משתמשים בגרסה תואמת של Gemma 3n ל-MediaPipe:
- Gemma-3n E2B: מודל 2B של משפחת Gemma-3n.
- Gemma-3n E4B: מודל 4B ממשפחת Gemma-3n.
מידע נוסף זמין במסמכי התיעוד של Gemma-3n.
כדי לספק תמונות בהנחיה, צריך להמיר את התמונות או המסגרות של הקלט לאובייקט com.google.mediapipe.framework.image.MPImage
לפני שמעבירים אותו ל-LLM Inference API:
import com.google.mediapipe.framework.image.BitmapImageBuilder
import com.google.mediapipe.framework.image.MPImage
// Convert the input Bitmap object to an MPImage object to run inference
val mpImage = BitmapImageBuilder(image).build()
כדי להפעיל תמיכה בראייה ל-LLM Inference API, מגדירים את אפשרות ההגדרה EnableVisionModality
לערך true
באפשרויות הגרף:
LlmInferenceSession.LlmInferenceSessionOptions sessionOptions =
LlmInferenceSession.LlmInferenceSessionOptions.builder()
...
.setGraphOptions(GraphOptions.builder().setEnableVisionModality(true).build())
.build();
Gemma-3n מקבלת עד תמונה אחת בכל סשן, לכן צריך להגדיר את MaxNumImages
כ-1.
LlmInferenceOptions options = LlmInferenceOptions.builder()
...
.setMaxNumImages(1)
.build();
לפניכם דוגמה להטמעה של LLM Inference API שמוגדר לטפל בקלט של תמונות וטקסט:
MPImage image = getImageFromAsset(BURGER_IMAGE);
LlmInferenceSession.LlmInferenceSessionOptions sessionOptions =
LlmInferenceSession.LlmInferenceSessionOptions.builder()
.setTopK(10)
.setTemperature(0.4f)
.setGraphOptions(GraphOptions.builder().setEnableVisionModality(true).build())
.build();
try (LlmInference llmInference =
LlmInference.createFromOptions(ApplicationProvider.getApplicationContext(), options);
LlmInferenceSession session =
LlmInferenceSession.createFromOptions(llmInference, sessionOptions)) {
session.addQueryChunk("Describe the objects in the image.");
session.addImage(image);
String result = session.generateResponse();
}
התאמה אישית של LoRA
LLM Inference API תומך בהתאמה של LoRA (Low-Rank Adaptation) באמצעות הספרייה PEFT (Parameter-Efficient Fine-Tuning). התאמת LoRA מאפשרת להתאים אישית את ההתנהגות של מודלים גדולים של שפה (LLMs) באמצעות תהליך אימון חסכוני, שבו נוצרת קבוצה קטנה של משקלים שניתן לאמן על סמך נתוני אימון חדשים, במקום לאמן מחדש את המודל כולו.
LLM Inference API תומך בהוספת משקלים של LoRA לשכבות תשומת הלב של המודלים Gemma-2 2B, Gemma 2B ו-Phi-2. מורידים את המודל בפורמט safetensors
.
כדי ליצור משקלים של LoRA, מודל הבסיס צריך להיות בפורמט safetensors
. אחרי אימון LoRA, אפשר להמיר את המודלים לפורמט FlatBuffers כדי להריץ אותם ב-MediaPipe.
הכנת משקלים של LoRA
תוכלו להיעזר במדריך LoRA Methods של PEFT כדי לאמן מודל LoRA מותאם אישית במערך הנתונים שלכם.
ה-LLM Inference API תומך ב-LoRA רק בשכבות תשומת הלב, לכן צריך לציין רק את שכבות תשומת הלב ב-LoraConfig
:
# For Gemma
from peft import LoraConfig
config = LoraConfig(
r=LORA_RANK,
target_modules=["q_proj", "v_proj", "k_proj", "o_proj"],
)
# For Phi-2
config = LoraConfig(
r=LORA_RANK,
target_modules=["q_proj", "v_proj", "k_proj", "dense"],
)
אחרי האימון במערך הנתונים שהוכנו ושמירת המודל, משקלי המודל של LoRA שמותאמים אישית זמינים ב-adapter_model.safetensors
. הקובץ safetensors
הוא נקודת הבדיקה של LoRA שנעשה בה שימוש במהלך המרת המודל.
המרה לפי מודל
משתמשים בחבילת Python של MediaPipe כדי להמיר את משקלי המודל לפורמט Flatbuffer. השדה ConversionConfig
מציין את אפשרויות המודל הבסיסי יחד עם האפשרויות הנוספות של LoRA.
import mediapipe as mp
from mediapipe.tasks.python.genai import converter
config = converter.ConversionConfig(
# Other params related to base model
...
# Must use gpu backend for LoRA conversion
backend='gpu',
# LoRA related params
lora_ckpt=LORA_CKPT,
lora_rank=LORA_RANK,
lora_output_tflite_file=LORA_OUTPUT_FILE,
)
converter.convert_checkpoint(config)
הממיר ייצור שני קובצי Flatbuffer, אחד למודל הבסיס ועוד אחד למודל LoRA.
היקש של מודל LoRA
Android תומך ב-LoRa סטטי במהלך האתחול. כדי לטעון מודל LoRA, צריך לציין את הנתיב של מודל LoRA ואת ה-LLM הבסיסי.
// Set the configuration options for the LLM Inference task
val options = LlmInferenceOptions.builder()
.setModelPath(BASE_MODEL_PATH)
.setMaxTokens(1000)
.setTopK(40)
.setTemperature(0.8)
.setRandomSeed(101)
.setLoraPath(LORA_MODEL_PATH)
.build()
// Create an instance of the LLM Inference task
llmInference = LlmInference.createFromOptions(context, options)
כדי להריץ את ההסקה של LLM עם LoRA, משתמשים באותן שיטות generateResponse()
או generateResponseAsync()
כמו במודל הבסיס.