באמצעות LLM Inference API אפשר להריץ מודלים גדולים של שפה (LLM) באופן מלא במכשיר לאפליקציות ל-iOS. אפשר להשתמש במודלים האלה לביצוע מגוון רחב של משימות, כמו יצירת טקסט, אחזור מידע בצורת שפה טבעית וסיכום מסמכים. המשימה מספקת תמיכה מובנית במספר מודלים גדולים של שפה (LLM) מסוג טקסט לטקסט, כך שתוכלו להחיל את המודלים העדכניים ביותר של AI גנרטיבי במכשיר על האפליקציות שלכם ל-iOS.
כדי להוסיף במהירות את LLM Inference API לאפליקציה ל-iOS, תוכלו להיעזר במדריך למתחילים. דוגמה בסיסית לאפליקציית iOS שפועלת עם LLM Inference API מופיעה באפליקציה לדוגמה. למידע מעמיק יותר על אופן הפעולה של LLM Inference API, אפשר לעיין בקטעים אפשרויות ההגדרה, המרת מודל וכוונון 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)
הרצת המשימה
משתמשים ב-method generateResponse(inputText:)
כדי ליצור תשובת טקסט. כך נוצרת תשובה אחת.
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 |
הנתיב שבו המודל מאוחסן בתוך ספריית הפרויקט. | PATH | לא רלוונטי |
maxTokens |
המספר המקסימלי של אסימונים (אסימוני קלט + אסימוני פלט) שהמודל מטפל בהם. | מספר שלם | 512 |
topk |
מספר האסימונים שהמודל מתייחס אליהם בכל שלב של היצירה. הגבלת התחזיות ל-k האסימונים האפשריים הטובים ביותר. | מספר שלם | 40 |
temperature |
מידת האקראיות שנוספה במהלך היצירה. טמפרטורה גבוהה יותר מובילה ליצירת טקסט יצירתי יותר, ואילו טמפרטורה נמוכה יותר מובילה ליצירת טקסט צפוי יותר. | מספר ממשי (float) | 0.8 |
randomSeed |
המקור האקראי שמשמש ליצירת הטקסט. | מספר שלם | 0 |
loraPath |
הנתיב המוחלט למודל LoRA באופן מקומי במכשיר. הערה: האפשרות הזו תואמת רק לדגמי GPU. | PATH | לא רלוונטי |
המרה לפי מודל
ה-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
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()
כמו במודל הבסיס.