באמצעות LLM Inference API אפשר להריץ מודלים גדולים של שפה (LLM) במכשיר לחלוטין, לאפליקציות אינטרנט. אפשר להשתמש במודלים האלה כדי לבצע מגוון רחב של משימות, כמו יצירת טקסט, אחזור מידע בצורת שפה טבעית וסיכום מסמכים. המשימה מספקת תמיכה מובנית במספר מודלים גדולים של שפה (LLM) מסוג טקסט לטקסט, כך שתוכלו להחיל את מודלי ה-AI הגנרטיביים העדכניים ביותר במכשיר על אפליקציות האינטרנט שלכם.
כדי להוסיף במהירות את LLM Inference API לאפליקציית האינטרנט, תוכלו לפעול לפי המדריך למתחילים. דוגמה בסיסית לאפליקציית אינטרנט שפועלת עם LLM Inference API מופיעה באפליקציה לדוגמה. תוכלו לקרוא הסבר מפורט יותר על אופן הפעולה של LLM Inference API בקטעים אפשרויות ההגדרה, המרת מודל וכוונון LoRA.
אתם יכולים לראות את המשימה הזו בפעולה בהדגמה של MediaPipe Studio. מידע נוסף על היכולות, המודלים והאפשרויות להגדרה של המשימה הזו זמין בסקירה הכללית.
מדריך למתחילים
כדי להוסיף את LLM Inference API לאפליקציית האינטרנט, פועלים לפי השלבים הבאים. כדי להשתמש ב-LLM Inference API, נדרש דפדפן אינטרנט עם תאימות ל-WebGPU. רשימה מלאה של הדפדפנים התואמים מופיעה במאמר תאימות דפדפנים ל-GPU.
הוספת יחסי תלות
ב-LLM Inference API נעשה שימוש בחבילה @mediapipe/tasks-genai
.
מתקינים את החבילות הנדרשות ל-staging מקומי:
npm install @mediapipe/tasks-genai
כדי לפרוס בשרת, משתמשים בשירות של רשת להעברת תוכן (CDN) כמו jsDelivr כדי להוסיף קוד ישירות לדף ה-HTML:
<head>
<script src="https://cdn.jsdelivr.net/npm/@mediapipe/tasks-genai/genai_bundle.cjs"
crossorigin="anonymous"></script>
</head>
הורדת מודל
מורידים את Gemma-2 2B בפורמט 8-bit quantized מ-Kaggle Models. מידע נוסף על המודלים הזמינים זמין במסמכי התיעוד בנושא מודלים.
שומרים את המודל בספריית הפרויקט:
<dev-project-root>/assets/gemma-2b-it-gpu-int8.bin
מציינים את הנתיב של המודל באמצעות הפרמטר modelAssetPath
של האובייקט baseOptions
:
baseOptions: { modelAssetPath: `/assets/gemma-2b-it-gpu-int8.bin`}
איך מפעילים את המשימה
מאתחלים את המשימה עם אפשרויות תצורה בסיסיות:
const genai = await FilesetResolver.forGenAiTasks(
// path/to/wasm/root
"https://cdn.jsdelivr.net/npm/@mediapipe/tasks-genai@latest/wasm"
);
llmInference = await LlmInference.createFromOptions(genai, {
baseOptions: {
modelAssetPath: '/assets/gemma-2b-it-gpu-int8.bin'
},
maxTokens: 1000,
topK: 40,
temperature: 0.8,
randomSeed: 101
});
הרצת המשימה
משתמשים בפונקציה generateResponse()
כדי להפעיל מסקנות.
const response = await llmInference.generateResponse(inputPrompt);
document.getElementById('output').textContent = response;
כדי להעביר את התגובה בסטרימינג, משתמשים בקוד הבא:
llmInference.generateResponse(
inputPrompt,
(partialResult, done) => {
document.getElementById('output').textContent += partialResult;
});
אפליקציה לדוגמה
האפליקציה לדוגמה היא דוגמה לאפליקציה בסיסית ליצירת טקסט לאינטרנט, שמשתמשת ב-LLM Inference API. אפשר להשתמש באפליקציה כנקודת התחלה לאפליקציית האינטרנט שלכם, או להיעזר בה כשמשנים אפליקציה קיימת. הקוד לדוגמה מתארח ב-GitHub.
משכפלים את מאגר git באמצעות הפקודה הבאה:
git clone https://github.com/google-ai-edge/mediapipe-samples
מידע נוסף זמין במדריך ההתקנה לאינטרנט.
אפשרויות הגדרה
אפשר להשתמש באפשרויות התצורה הבאות כדי להגדיר אפליקציית אינטרנט:
שם האפשרות | תיאור | טווח ערכים | ערך ברירת מחדל |
---|---|---|---|
modelPath |
הנתיב שבו המודל מאוחסן בתוך ספריית הפרויקט. | PATH | לא רלוונטי |
maxTokens |
המספר המקסימלי של אסימונים (אסימוני קלט + אסימוני פלט) שהמודל מטפל בהם. | מספר שלם | 512 |
topK |
מספר האסימונים שהמודל מתייחס אליהם בכל שלב של היצירה. הגבלת התחזיות ל-k האסימונים האפשריים הטובים ביותר. | מספר שלם | 40 |
temperature |
מידת האקראיות שנוספה במהלך היצירה. טמפרטורה גבוהה יותר מובילה ליצירת טקסט יצירתי יותר, ואילו טמפרטורה נמוכה יותר מובילה ליצירת טקסט צפוי יותר. | מספר ממשי (float) | 0.8 |
randomSeed |
הזרע האקראי שמשמש ליצירת הטקסט. | מספר שלם | 0 |
loraRanks |
דירוגים של LoRA שישמשו את המודלים של LoRA במהלך זמן הריצה. הערה: האפשרות הזו תואמת רק לדגמי GPU. | מערך של מספרים שלמים | לא רלוונטי |
המרה לפי מודל
ה-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)
הממיר ייצור שני קבצים שתואמים ל-MediaPipe, אחד למודל הבסיס והשני למודל LoRA.
הסקת מסקנות ממודל LoRA
באינטרנט יש תמיכה ב-LoRa דינמי במהלך זמן הריצה, כלומר המשתמשים מגדירים את הדירוגים של LoRa במהלך האינטליקציה הראשונית. המשמעות היא שאפשר להחליף מודלים שונים של LoRa במהלך זמן הריצה.
const genai = await FilesetResolver.forGenAiTasks(
// path/to/wasm/root
"https://cdn.jsdelivr.net/npm/@mediapipe/tasks-genai@latest/wasm"
);
const llmInference = await LlmInference.createFromOptions(genai, {
// options for the base model
...
// LoRA ranks to be used by the LoRA models during runtime
loraRanks: [4, 8, 16]
});
אפשר לטעון את המודלים של LoRA במהלך זמן הריצה, אחרי שמפעילים את המודל הבסיסי. כדי להפעיל את מודל LoRA, מעבירים את הפניה למודל בזמן יצירת התשובה של LLM.
// Load several LoRA models. The returned LoRA model reference is used to specify
// which LoRA model to be used for inference.
loraModelRank4 = await llmInference.loadLoraModel(loraModelRank4Url);
loraModelRank8 = await llmInference.loadLoraModel(loraModelRank8Url);
// Specify LoRA model to be used during inference
llmInference.generateResponse(
inputPrompt,
loraModelRank4,
(partialResult, done) => {
document.getElementById('output').textContent += partialResult;
});