באמצעות 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.22'
}
במכשירים עם Android 12 (API 31) ואילך, מוסיפים את התלות בספרייה המקורית של OpenCL. מידע נוסף זמין במסמכי העזרה בנושא התג uses-native-library
.
מוסיפים לקובץ AndroidManifest.xml
את תגי ה-uses-native-library
הבאים:
<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"/>
הורדת מודל
מורידים את 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)
אפליקציה לדוגמה
האפליקציה לדוגמה היא דוגמה לאפליקציה בסיסית ליצירת טקסט ל-Android, שמשתמשת ב-LLM Inference API. אפשר להשתמש באפליקציה כנקודת התחלה לאפליקציית Android משלכם, או להיעזר בה כשמשנים אפליקציה קיימת. הקוד לדוגמה מתארח ב-GitHub.
משכפלים את מאגר git באמצעות הפקודה הבאה:
git clone https://github.com/google-ai-edge/mediapipe-samples
אחרי שיוצרים גרסה מקומית של קוד הדוגמה, אפשר לייבא את הפרויקט ל-Android Studio ולהריץ את האפליקציה. מידע נוסף זמין במדריך ההתקנה ל-Android.
אפשרויות הגדרה
אפשר להשתמש באפשרויות ההגדרה הבאות כדי להגדיר אפליקציה ל-Android:
שם האפשרות | תיאור | טווח ערכים | ערך ברירת מחדל |
---|---|---|---|
modelPath |
הנתיב שבו המודל מאוחסן בתוך ספריית הפרויקט. | PATH | לא רלוונטי |
maxTokens |
המספר המקסימלי של אסימונים (אסימוני קלט + אסימוני פלט) שהמודל מטפל בהם. | מספר שלם | 512 |
topK |
מספר האסימונים שהמודל מתייחס אליהם בכל שלב של היצירה. הגבלת התחזיות ל-k האסימונים האפשריים הטובים ביותר. | מספר שלם | 40 |
temperature |
מידת האקראיות שנוספה במהלך היצירה. טמפרטורה גבוהה יותר מובילה ליצירת טקסט יצירתי יותר, ואילו טמפרטורה נמוכה יותר מובילה ליצירת טקסט צפוי יותר. | מספר ממשי (float) | 0.8 |
randomSeed |
הזרע האקראי שמשמש ליצירת הטקסט. | מספר שלם | 0 |
loraPath |
הנתיב המוחלט למודל LoRA באופן מקומי במכשיר. הערה: האפשרות הזו תואמת רק לדגמי GPU. | PATH | לא רלוונטי |
resultListener |
הגדרת מאזין התוצאות לקבלת התוצאות באופן אסינכרוני. רלוונטי רק כשמשתמשים בשיטת היצירה האסינכרונית. | לא רלוונטי | לא רלוונטי |
errorListener |
הגדרת מאזין אופציונלי לשגיאות. | לא רלוונטי | לא רלוונטי |
המרה לפי מודל
ה-API של LLM Inference תואם לסוגי המודלים הבאים, חלקם דורשים המרה של מודל. בטבלה הבאה מפורטות השיטות הנדרשות לכל מודל.
דגמים | שיטת ההמרה | פלטפורמות תואמות | סוג הקובץ |
---|---|---|---|
Gemma-3 1B | לא נדרשת המרה | Android, אינטרנט | .task |
Gemma 2B, Gemma 7B, Gemma-2 2B | לא נדרשת המרה | Android, iOS, אינטרנט | .bin |
Phi-2, StableLM, Falcon | סקריפט המרה של MediaPipe | Android, iOS, אינטרנט | .bin |
כל המודלים של PyTorch LLM | ספריית AI Edge Torch Generative | Android, iOS | .task |
בקטע המרת מודלים מוסבר איך ממירים מודלים אחרים.
התאמה אישית של 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()
כמו במודל הבסיס.