מדריך להסקת מודלים של LLM ל-iOS

באמצעות 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() כמו במודל הבסיס.