LLM Inference API מאפשר להריץ מודלים גדולים של שפה (LLM) באופן מלא במכשיר עבור אפליקציות ל-iOS. אפשר להשתמש בו כדי לבצע מגוון רחב של משימות, כמו יצירת טקסט, אחזור מידע בצורה של שפה טבעית וסיכום מסמכים. המשימה מספקת תמיכה מובנית במודלים גדולים של שפה (LLM) להמרת טקסט לטקסט, כך שתוכלו להחיל את המודלים העדכניים ביותר של AI גנרטיבי במכשיר על אפליקציות iOS.
כדי להוסיף במהירות את LLM Inference API לאפליקציית iOS, פועלים לפי המדריך למתחילים. דוגמה בסיסית לאפליקציית iOS שמופעלת באמצעות LLM Inference API זמינה באפליקציה לדוגמה. כדי להבין יותר לעומק איך פועל ה-API של LLM Inference, אפשר לעיין בקטעים אפשרויות ההגדרה, המרת מודלים וכוונון LoRA.
אפשר לראות את המשימה הזו בפעולה בהדמו של MediaPipe Studio. מידע נוסף על היכולות, המודלים ואפשרויות ההגדרה של המשימה הזו זמין במאמר סקירה כללית.
מדריך למתחילים
כדי להוסיף את LLM Inference API לאפליקציית iOS:
LLM Inference API משתמש בספריית MediaPipeTasksGenai, שצריך להתקין באמצעות CocoaPods. הספרייה תואמת לאפליקציות Swift ולאפליקציות Objective-C, ולא נדרשת הגדרה נוספת ספציפית לשפה.
הוראות להתקנת CocoaPods ב-macOS מופיעות במדריך להתקנת CocoaPods.
הוראות ליצירת Podfile עם ה-pods הדרושים לאפליקציה שלכם זמינות במאמר בנושא שימוש ב-CocoaPods.
הוספת יחסי תלות
מוסיפים את ה-pod MediaPipeTasksGenai ב-Podfile באמצעות הקוד הבא:
target 'MyLlmInferenceApp' do
use_frameworks!
pod 'MediaPipeTasksGenAI'
pod 'MediaPipeTasksGenAIC'
end
אם האפליקציה כוללת יעדים של בדיקות יחידה, אפשר לעיין במדריך ההגדרה ל-iOS לקבלת מידע נוסף על הגדרת Podfile.
הורדת מודל
מורידים את Gemma-2 2B בפורמט קוונטיזציה של 8 ביט מ-Kaggle Models. מידע נוסף על המודלים הזמינים מופיע במסמכי התיעוד בנושא מודלים.
מוסיפים את המודל לספריית הפרויקט באמצעות Xcode. הוראות להוספת קבצים לפרויקט Xcode מופיעות במאמר ניהול קבצים ותיקיות בפרויקט Xcode.
הפעלת המשימה
מאחלים את המשימה באמצעות אפשרויות בסיסיות להגדרת התצורה:
import MediaPipeTasksGenai
let modelPath = Bundle.main.path(forResource: "model",
ofType: "bin")
let options = LlmInferenceOptions()
options.baseOptions.modelPath = modelPath
options.maxTokens = 1000
options.topk = 40
options.temperature = 0.8
options.randomSeed = 101
let llmInference = try LlmInference(options: options)
הרצת המשימה
משתמשים ב-generateResponse(inputText:) method כדי ליצור תשובת טקסט. כך נוצרת תשובה אחת.
let result = try LlmInference.generateResponse(inputText: inputPrompt)
כדי להזרים את התשובה, משתמשים בשיטה generateResponseAsync(inputText:).
let resultStream = LlmInference.generateResponseAsync(inputText: inputPrompt)
do {
for try await partialResult in resultStream {
print("\(partialResult)")
}
print("Done")
}
catch {
print("Response error: '\(error)")
}
אפליקציה לדוגמה
אפליקציית הדוגמה היא אפליקציה בסיסית ליצירת טקסט ל-iOS, שמשתמשת בממשק LLM Inference API. אתם יכולים להשתמש באפליקציה כנקודת התחלה לאפליקציית iOS משלכם, או להיעזר בה כשאתם משנים אפליקציה קיימת. קוד הדוגמה מתארח ב-GitHub.
משכפלים את מאגר ה-Git באמצעות הפקודה הבאה:
git clone https://github.com/google-ai-edge/mediapipe-samples
אחרי שיוצרים גרסה מקומית של קוד הדוגמה, אפשר לייבא את הפרויקט ל-iOS Studio ולהריץ את האפליקציה. מידע נוסף זמין במדריך ההגדרה ל-iOS.
אפשרויות הגדרה
משתמשים באפשרויות ההגדרה הבאות כדי להגדיר אפליקציה ל-iOS:
| שם האפשרות | תיאור | טווח ערכים | ערך ברירת מחדל |
|---|---|---|---|
modelPath |
הנתיב למיקום שבו המודל מאוחסן בספריית הפרויקט. | נתיב | לא רלוונטי |
maxTokens |
המספר המקסימלי של טוקנים (טוקנים של קלט + טוקנים של פלט) שהמודל יכול לטפל בהם. | מספר שלם | 512 |
topk |
מספר הטוקנים שהמודל לוקח בחשבון בכל שלב של יצירת התוכן. מגביל את התחזיות ל-k האסימונים בעלי ההסתברות הגבוהה ביותר. | מספר שלם | 40 |
temperature |
רמת הרנדומיזציה שמוצגת במהלך היצירה. טמפרטורה גבוהה יותר מובילה ליצירתיות רבה יותר בטקסט שנוצר, ואילו טמפרטורה נמוכה יותר מובילה ליצירה צפויה יותר. | Float | 0.8 |
randomSeed |
הערך האקראי הראשוני שמשמש במהלך יצירת הטקסט. | מספר שלם | 0 |
loraPath |
הנתיב המוחלט למודל LoRA באופן מקומי במכשיר. הערה: האפשרות הזו תואמת רק למודלים של GPU. | נתיב | לא רלוונטי |
המרת מודל
LLM Inference API תואם לסוגי המודלים הבאים, שחלקם דורשים המרת מודל. משתמשים בטבלה כדי לזהות את השלבים הנדרשים או את השיטה שמתאימים למודל שלכם.
| מודלים | שיטת המרה | פלטפורמות תואמות | סוג הקובץ |
|---|---|---|---|
| Gemma-3 1B | לא נדרשת המרה | Android, אינטרנט | .task |
| Gemma 2B, Gemma 7B, Gemma-2 2B | לא נדרשת המרה | Android, iOS, אינטרנט | .bin |
| Phi-2, StableLM, Falcon | סקריפט המרה של MediaPipe | Android, iOS, אינטרנט | .bin |
| כל מודלי ה-LLM של PyTorch | ספריית LiteRT Torch Generative | Android, iOS | .task |
בקטע המרת מודלים מוסבר איך להמיר מודלים אחרים.
התאמה אישית של LoRA
LLM Inference API תומך בשיפור דיוק של מודלים באמצעות LoRA (Low-Rank Adaptation) באמצעות ספריית PEFT (Parameter-Efficient Fine-Tuning). התאמה באמצעות LoRA מאפשרת להתאים אישית את ההתנהגות של מודלים מסוג LLM בתהליך אימון חסכוני. התהליך הזה יוצר קבוצה קטנה של משקלים שאפשר לאמן על סמך נתוני אימון חדשים, במקום לאמן מחדש את כל המודל.
LLM Inference API תומך בהוספת משקלים של LoRA לשכבות של מנגנון תשומת הלב במודלים Gemma-2 2B, Gemma 2B ו-Phi-2. מורידים את המודל בפורמט safetensors.
מודל הבסיס צריך להיות בפורמט safetensors כדי ליצור משקלים של LoRA. אחרי אימון LoRA, אפשר להמיר את המודלים לפורמט FlatBuffers כדי להריץ אותם ב-MediaPipe.
הכנת משקלים של LoRA
אפשר להשתמש במדריך LoRA Methods מ-PEFT כדי לאמן מודל LoRA מכוונן על מערך נתונים משלכם.
ה-API של LLM Inference תומך רק ב-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 שמשמשת במהלך המרת המודל.
המרת מודל
משתמשים בחבילת MediaPipe Python כדי להמיר את משקלי המודל לפורמט 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
iOS תומך ב-LoRA סטטי במהלך האתחול. כדי לטעון מודל LoRA, צריך לציין את הנתיב של מודל LoRA ואת מודל הבסיס של ה-LLM.
import MediaPipeTasksGenai
let modelPath = Bundle.main.path(forResource: "model",
ofType: "bin")
let loraPath= Bundle.main.path(forResource: "lora_model",
ofType: "bin")
let options = LlmInferenceOptions()
options.modelPath = modelPath
options.maxTokens = 1000
options.topk = 40
options.temperature = 0.8
options.randomSeed = 101
options.loraPath = loraPath
let llmInference = try LlmInference(options: options)
כדי להריץ הסקה של LLM עם LoRA, משתמשים באותן שיטות generateResponse() או generateResponseAsync() כמו במודל הבסיסי.