הפעלת מודלים גדולים של שפה (LLM) באמצעות LiteRT-LM

LiteRT-LM היא ספרייה חוצת פלטפורמות שנועדה להפעיל ביעילות צינורות של מודלים של שפה במגוון רחב של מכשירים, מטלפונים ניידים ועד מערכות מוטמעות. הכלי מספק למפתחים את האמצעים ליצור ולפרוס תהליכי עבודה מתוחכמים של מודלים לשוניים, ועכשיו הוא כולל שילוב חלק של NPU.

הפעלת מודלים גדולים של שפה (LLM) במעבד (CPU) ובמעבד גרפי (GPU)

הוראות מפורטות על פיתוח חוצה פלטפורמות והאצת חומרה של CPU/GPU זמינות במאגר LiteRT-LM ב-GitHub.

הפעלת מודלים גדולים של שפה (LLM) ב-NPU

יחידות לעיבוד עצבי (NPU) מציעות בלוקים מיוחדים של חומרה שעברו אופטימיזציה לעומסי עבודה של למידה עמוקה. הן זמינות יותר ויותר במערכות מודרניות על שבב (SoC), במיוחד בניידים. הביצועים הגבוהים שלהם הופכים אותם למתאימים מאוד להסקת מסקנות של LLM.

ספקי NPU

‫LiteRT-LM תומך בהרצת מודלים גדולים של שפה (LLM) באמצעות האצת NPU עם הספקים הבאים. בוחרים את ההוראות בהתאם לספק שרוצים לנסות:

התחלה מהירה

כדי להתחיל, קודם פועלים לפי ההוראות שבקטע דרישות מוקדמות כדי להגדיר את הסביבה ואת המאגר.

בנוסף, כדי שתוכלו ליצור אינטראקציה עם מכשיר Android, ודאו שהתקנתם כמו שצריך את ממשק הגישור של Android‏ (ADB) ושיש לכם מכשיר מחובר שאפשר לגשת אליו באמצעות adb.

הוראות מפורטות מופיעות בקטע Quick Start במאגר LiteRT-LM. אפשר גם לקרוא מידע נוסף על litert_lm_main הדגמה של שורת הפקודה.

Qualcomm AI Engine Direct

כדי להריץ מודלים גדולים של שפה (LLM) ב-NPU של Qualcomm:

שלב 1: מורידים את מודל .litertlm זמן הריצה של LiteRT-LM מיועד לעבודה עם מודלים בפורמט .litertlm. בטבלה הבאה אפשר למצוא ולהוריד מודלים תואמים.

דגם SoC קוונטיזציה גודל ההקשר גודל המודל (Mb) קישור להורדה
Gemma3-1B SM8750 ‫4 ביט לכל ערוץ 1280 658 הורדה
Gemma3-1B SM8650 ‫4 ביט לכל ערוץ 1280 658 הורדה
Gemma3-1B SM8550 ‫4 ביט לכל ערוץ 1280 657 הורדה

תצטרכו להוריד את המודל שמתאים ל-SoC שלכם. בהמשך מופיעה דוגמה לפקודה שיכולה לעזור לכם לקבל את הקישור ל-Hugging Face שדרכו אפשר להוריד את המודל הנכון ל-SoC של הטלפון (שימו לב שתצטרכו להתחבר ולאשר את הטופס כדי לקבל הרשאה להוריד את הקובץ). צריך לוודא שיש מכשיר מחובר שאפשר לגשת אליו באמצעות adb.

SOC_MODEL=$(adb shell getprop ro.soc.model | tr '[:upper:]' '[:lower:]')
echo "https://huggingface.co/litert-community/Gemma3-1B-IT/blob/main/Gemma3-1B-IT_q4_ekv1280_${SOC_MODEL}.litertlm"

מוודאים שהמשתנה $SOC_MODEL מופיע בטבלת התמיכה. הקישור שנוצר לא יפעל במודלים שלא נתמכים. אנחנו מוסיפים תמיכה ב-NPU באופן קבוע, לכן כדאי לחזור לכאן מאוחר יותר כדי לבדוק אם המכשיר שלכם נתמך.

שלב 2: הורדה ופריסה של ספריות QAIRT כדי להריץ את המודל באמצעות Qualcomm NPU, צריך ספריות זמן ריצה משויכות במכשיר. אפשר להוריד את QAIRT SDK מהקישור ולחלץ את הקובץ. מגדירים את המשתנה QAIRT_ROOT (נשתמש בו בשלבים הבאים) כך שיצביע על התיקייה שלא נפרסה ומכילה את מספר הגרסה, למשל:

unzip <your_file.zip> -d ~/

QAIRT_ROOT=~/qairt/2.42.0.251225

שלב 3: בניית ספריות או זמן ריצה של LiteRT-LM

פיתוח ב-Linux

כדי ליצור את הקובץ הבינארי ל-Android, צריך להתקין את NDK r28b או גרסה חדשה יותר מכתובת https://developer.android.com/ndk/downloads#stable-downloads. השלבים הספציפיים הם:

  • מורידים את הקובץ zip מהכתובת https://developer.android.com/ndk/downloads#stable-downloads.
  • מחלצים את הקובץ zip למיקום הרצוי (למשל /path/to/AndroidNDK/).
  • מגדירים את ANDROID_NDK_HOME כך שיצביע על ספריית ה-NDK. הוא אמור להיראות כך:
export ANDROID_NDK_HOME=/path/to/AndroidNDK/

טיפים: חשוב לוודא שהנתיב ANDROID_NDK_HOME מצביע על הספרייה שכוללת את README.md.

אחרי ההגדרה, מנסים ליצור את הקובץ הבינארי litert_lm_main:

bazel build --config=android_arm64 //runtime/engine:litert_lm_main

בנוסף, צריך ליצור את ספריית ה-API של השליחה כדי שזמן הריצה של LiteRT-LM יוכל ליצור אינטראקציה עם NPU:

bazel build --config=android_arm64 \
    @litert//litert/vendors/qualcomm/dispatch:dispatch_api_so

פיתוח ב-macOS

כלי שורת הפקודה של Xcode כוללים את clang. מריצים את xcode-select --install אם הוא לא מותקן.

כדי ליצור את הקובץ הבינארי ל-Android, צריך להתקין את NDK r28b או גרסה חדשה יותר מכתובת https://developer.android.com/ndk/downloads#stable-downloads. השלבים הספציפיים הם:

  • מורידים את הקובץ .dmg מהכתובת https://developer.android.com/ndk/downloads#stable-downloads.
  • פותחים את הקובץ .dmg ומעבירים את הקובץ AndroidNDK* למיקום הרצוי (למשל /path/to/AndroidNDK/).
  • מגדירים את ANDROID_NDK_HOME כך שיצביע על ספריית ה-NDK. הוא אמור להיראות כך:
export ANDROID_NDK_HOME=/path/to/AndroidNDK/AndroidNDK*.app/Contents/NDK/

טיפים: חשוב לוודא שהנתיב ANDROID_NDK_HOME מצביע על הספרייה שכוללת את README.md.

אחרי ההגדרה, מנסים ליצור את הקובץ הבינארי litert_lm_main:

bazel build --config=android_arm64 //runtime/engine:litert_lm_main

בנוסף, צריך ליצור את ספריית ה-API של השליחה כדי שזמן הריצה של LiteRT-LM יוכל ליצור אינטראקציה עם NPU:

bazel build --config=android_arm64 \
    @litert//litert/vendors/qualcomm/dispatch:dispatch_api_so

שלב 4: הפעלת המודל במכשיר אחרי שהקובץ הבינארי נוצר בהצלחה, אפשר לנסות להפעיל את המודל במכשיר. מוודאים שיש לכם הרשאת כתיבה בקובץ DEVICE_FOLDER:

כדי להריץ את הקובץ הבינארי במכשיר Android, צריך להעביר כמה נכסים או קבצים בינאריים. קודם מגדירים את DEVICE_FOLDER ומוודאים שיש לכם גישת כתיבה אליו (בדרך כלל אפשר להוסיף דברים ל-/data/local/tmp/):

export DEVICE_FOLDER=/data/local/tmp/
adb shell mkdir -p $DEVICE_FOLDER

export MODEL_PATH=<path to your downloaded .litertlm >

דוחפים את קובץ ה-litertlm. טיפ: צריך להעביר את הנכסים האלה רק פעם אחת.

adb push $MODEL_PATH $DEVICE_FOLDER/model.litertlm

דחיפה של ספריות QAIRT. אפשר למצוא אותם בתיקייה שלא נפרסה בשלב 2 $QAIRT_ROOT/lib/aarch64-android/. שימו לב שהמחרוזת QAIRT_ROOT צריכה לכלול את מספר הגרסה, למשל 2.42.0.251225.

adb push $QAIRT_ROOT/lib/aarch64-android/libQnnHtp*Stub.so $DEVICE_FOLDER
adb push $QAIRT_ROOT/lib/aarch64-android/libQnnHtp.so $DEVICE_FOLDER
adb push $QAIRT_ROOT/lib/aarch64-android/libQnnSystem.so $DEVICE_FOLDER
adb push $QAIRT_ROOT/lib/aarch64-android/libQnnHtpPrepare.so $DEVICE_FOLDER
adb push $QAIRT_ROOT/lib/hexagon-*/unsigned/libQnnHtp*Skel.so $DEVICE_FOLDER

מעבירים את ה-API של השליחה ואת הקובץ הבינארי הראשי שקומפל בשלב 3.

adb push bazel-bin/external/litert/litert/vendors/qualcomm/*/*.so \
    $DEVICE_FOLDER
adb push prebuilt/android_arm64/*.so $DEVICE_FOLDER
adb push bazel-bin/runtime/engine/litert_lm_main $DEVICE_FOLDER

עכשיו אפשר להריץ את הקובץ הבינארי.

adb shell LD_LIBRARY_PATH=$DEVICE_FOLDER ADSP_LIBRARY_PATH=$DEVICE_FOLDER \
    $DEVICE_FOLDER/litert_lm_main \
    --backend=npu \
    --model_path=$DEVICE_FOLDER/model.litertlm

MediaTek NeuroPilot

כדי להריץ מודלים של LLM ב-NPU של MediaTek:

שלב 1: מורידים את מודל .litertlm זמן הריצה של LiteRT-LM מיועד לעבודה עם מודלים בפורמט .litertlm. בטבלה הבאה אפשר למצוא ולהוריד מודלים תואמים.

דגם SoC קוונטיזציה גודל ההקשר גודל המודל (Mb) קישור להורדה
Gemma3-1B MT6989 ‫4 ביט לכל ערוץ 1280 985 הורדה
Gemma3-1B MT6991 ‫4 ביט לכל ערוץ 1280 986 הורדה

תצטרכו להוריד את המודל שמתאים ל-SoC שלכם. בהמשך מופיעה דוגמה לפקודה שיכולה לעזור לכם לקבל את הקישור ל-Hugging Face שדרכו אפשר להוריד את המודל הנכון ל-SoC של הטלפון (שימו לב שתצטרכו להתחבר ולאשר את הטופס כדי לקבל הרשאה להוריד את הקובץ). צריך לוודא שיש מכשיר מחובר שאפשר לגשת אליו באמצעות adb.

SOC_MODEL=$(adb shell getprop ro.soc.model | tr '[:upper:]' '[:lower:]')
echo "https://huggingface.co/litert-community/Gemma3-1B-IT/blob/main/Gemma3-1B-IT_q4_ekv1280_${SOC_MODEL}.litertlm"

מוודאים שהמשתנה $SOC_MODEL מופיע בטבלת התמיכה. הקישור שנוצר לא יפעל במודלים שלא נתמכים. אנחנו מוסיפים תמיכה ב-NPU באופן קבוע, לכן כדאי לחזור לכאן מאוחר יותר כדי לבדוק אם המכשיר שלכם נתמך.

שלב 2: בניית זמן הריצה או הספריות של LiteRT-LM

פיתוח ב-Linux

כדי ליצור את הקובץ הבינארי ל-Android, צריך להתקין את NDK r28b או גרסה חדשה יותר מכתובת https://developer.android.com/ndk/downloads#stable-downloads. השלבים הספציפיים הם:

  • מורידים את הקובץ zip מהכתובת https://developer.android.com/ndk/downloads#stable-downloads.
  • מחלצים את הקובץ zip למיקום הרצוי (למשל /path/to/AndroidNDK/).
  • מגדירים את ANDROID_NDK_HOME כך שיצביע על ספריית ה-NDK. הוא אמור להיראות כך:
export ANDROID_NDK_HOME=/path/to/AndroidNDK/

טיפים: חשוב לוודא שהנתיב ANDROID_NDK_HOME מצביע על הספרייה שכוללת את README.md.

אחרי ההגדרה, מנסים ליצור את הקובץ הבינארי litert_lm_main:

bazel build --config=android_arm64 //runtime/engine:litert_lm_main

בנוסף, צריך ליצור את ספריית ה-API של השליחה כדי שזמן הריצה של LiteRT-LM יוכל ליצור אינטראקציה עם NPU:

bazel build --config=android_arm64 \
    @litert//litert/vendors/mediatek/dispatch:dispatch_api_so

פיתוח ב-macOS

כלי שורת הפקודה של Xcode כוללים את clang. מריצים את xcode-select --install אם הוא לא מותקן.

כדי ליצור את הקובץ הבינארי ל-Android, צריך להתקין את NDK r28b או גרסה חדשה יותר מכתובת https://developer.android.com/ndk/downloads#stable-downloads. השלבים הספציפיים הם:

  • מורידים את הקובץ .dmg מהכתובת https://developer.android.com/ndk/downloads#stable-downloads.
  • פותחים את הקובץ .dmg ומעבירים את הקובץ AndroidNDK* למיקום הרצוי (למשל /path/to/AndroidNDK/).
  • מגדירים את ANDROID_NDK_HOME כך שיצביע על ספריית ה-NDK. הוא אמור להיראות כך:
export ANDROID_NDK_HOME=/path/to/AndroidNDK/AndroidNDK*.app/Contents/NDK/

טיפים: חשוב לוודא שהנתיב ANDROID_NDK_HOME מצביע על הספרייה שכוללת את README.md.

אחרי ההגדרה, מנסים ליצור את הקובץ הבינארי litert_lm_main:

bazel build --config=android_arm64 //runtime/engine:litert_lm_main

בנוסף, צריך ליצור את ספריית ה-API של השליחה כדי שזמן הריצה של LiteRT-LM יוכל ליצור אינטראקציה עם NPU:

bazel build --config=android_arm64 \
    @litert//litert/vendors/mediatek/dispatch:dispatch_api_so

שלב 3: הפעלת המודל במכשיר אחרי שהקובץ הבינארי נוצר בהצלחה, אפשר לנסות להפעיל את המודל במכשיר. מוודאים שיש לכם הרשאת כתיבה בקובץ DEVICE_FOLDER:

כדי להריץ את הקובץ הבינארי במכשיר Android, צריך להעביר כמה נכסים או קבצים בינאריים. קודם מגדירים את DEVICE_FOLDER ומוודאים שיש לכם גישת כתיבה אליו (בדרך כלל אפשר להוסיף דברים ל-/data/local/tmp/):

export DEVICE_FOLDER=/data/local/tmp/
adb shell mkdir -p $DEVICE_FOLDER

export MODEL_PATH=<path to your downloaded .litertlm >

דוחפים את קובץ ה-litertlm. טיפ: צריך להעביר את הנכסים האלה רק פעם אחת.

adb push $MODEL_PATH $DEVICE_FOLDER/model.litertlm

דוחפים את ה-API של השליחה ואת הקובץ הבינארי הראשי שקומפל בשלב 2.

adb push bazel-bin/external/litert/litert/vendors/mediatek/*/*.so \
    $DEVICE_FOLDER
adb push prebuilt/android_arm64/*.so $DEVICE_FOLDER
adb push bazel-bin/runtime/engine/litert_lm_main $DEVICE_FOLDER

עכשיו אפשר להריץ את הקובץ הבינארי.

adb shell LD_LIBRARY_PATH=$DEVICE_FOLDER \
    $DEVICE_FOLDER/litert_lm_main \
    --backend=npu \
    --model_path=$DEVICE_FOLDER/model.litertlm