בחירת אופרטורים של TensorFlow

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

כדי לאפשר המרה, המשתמשים יכולים להפעיל שימוש ב-TensorFlow מסוים במודל LiteRT שלהם. אבל בהרצה מודלים של LiteRT עם פעולות TensorFlow מחייבים משיכה לתוך הליבה זמן הריצה של TensorFlow, מה שמגדיל את הגודל הבינארי של רכיב התרגום של LiteRT. ב-Android אפשר למנוע את זה על ידי פיתוח סלקטיבי של TensorFlow פעולות לפרטים, אפשר לעיין במאמר צמצום קבצים בינאריים size.

במסמך הזה מוסבר איך להמיר להריץ מודל LiteRT שמכיל פעולות TensorFlow פלטפורמה לבחירתך. נסביר גם על ביצועים וגודל מדדים ומגבלות ידועות.

המרת מודל

הדוגמה הבאה מראה איך ליצור מודל LiteRT באמצעות פעולות TensorFlow

import tensorflow as tf

converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)
converter.target_spec.supported_ops = [
  tf.lite.OpsSet.TFLITE_BUILTINS, # enable LiteRT ops.
  tf.lite.OpsSet.SELECT_TF_OPS # enable TensorFlow ops.
]
tflite_model = converter.convert()
open("converted_model.tflite", "wb").write(tflite_model)

הרצת ההסקה

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

המלצות שמיושמות באופן אוטומטי (AAR) ב-Android

כדי להקטין את הגודל הבינארי, יש ליצור קובצי AAR מותאמים אישית לפי ההנחיות המפורטות בקטע הבא. אם הגודל הבינארי אינו חשש משמעותי, אנחנו ממליצים להשתמש ב-AAR המוכנה מראש עם פעולות TensorFlow מתארח ב- MavenCentral.

אפשר לציין זאת ביחסי התלות של build.gradle על ידי הוספתה לצד ה-AAR הסטנדרטי של LiteRT AAR:

dependencies {
    implementation 'org.tensorflow:tensorflow-lite:0.0.0-nightly-SNAPSHOT'
    // This dependency adds the necessary TF op support.
    implementation 'org.tensorflow:tensorflow-lite-select-tf-ops:0.0.0-nightly-SNAPSHOT'
}

כדי להשתמש בתמונות מצב מדי לילה, צריך להוסיף תמונת מצב של Sonatype מאגר הנתונים.

לאחר הוספת התלות, נציג מורשה לטיפול את פעולות TensorFlow של הגרף צריכות להיות מתקינים באופן אוטומטי עבור גרפים המחייבים אותם.

הערה: התלות בתפעול של TensorFlow גדולה יחסית, כך שסביר להניח ברצונך לסנן ממשקי ABI x86 מיותרים בקובץ .gradle על ידי הגדרה את abiFilters.

android {
    defaultConfig {
        ndk {
            abiFilters 'armeabi-v7a', 'arm64-v8a'
        }
    }
}

פיתוח AAR של Android

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

sh tensorflow/lite/tools/build_aar.sh \
  --input_models=/a/b/model_one.tflite,/c/d/model_two.tflite \
  --target_archs=x86,x86_64,arm64-v8a,armeabi-v7a

הפעולה הזו תיצור את קובץ ה-AAR bazel-bin/tmp/tensorflow-lite.aar עבור פעולות מובנות ומותאמות אישית של LiteRT; וליצור את קובץ ה-AAR bazel-bin/tmp/tensorflow-lite-select-tf-ops.aar לפעולות של TensorFlow. אם אין סביבת build פעילה, אפשר גם ליצור קבצים למעלה עם Docer.

משם תוכלו לייבא את קובצי ה-AAR ישירות לפרויקט, או לפרסם את קובצי ה-AAR המותאמים אישית למאגר Maven המקומי:

mvn install:install-file \
  -Dfile=bazel-bin/tmp/tensorflow-lite.aar \
  -DgroupId=org.tensorflow \
  -DartifactId=tensorflow-lite -Dversion=0.1.100 -Dpackaging=aar
mvn install:install-file \
  -Dfile=bazel-bin/tmp/tensorflow-lite-select-tf-ops.aar \
  -DgroupId=org.tensorflow \
  -DartifactId=tensorflow-lite-select-tf-ops -Dversion=0.1.100 -Dpackaging=aar

לסיום, בbuild.gradle של האפליקציה, צריך לוודא שmavenLocal() של התלות הזאת ולהחליף את התלות הרגילה של LiteRT בזו יש תמיכה בפעולות נבחרות של TensorFlow:

allprojects {
    repositories {
        mavenCentral()
        maven {  // Only for snapshot artifacts
            name 'ossrh-snapshot'
            url 'https://oss.sonatype.org/content/repositories/snapshots'
        }
        mavenLocal()
    }
}

dependencies {
    implementation 'org.tensorflow:tensorflow-lite:0.1.100'
    implementation 'org.tensorflow:tensorflow-lite-select-tf-ops:0.1.100'
}

iOS

שימוש ב-CocoaPods

LiteRT מספק ל-arm64 תפעול TF נבחרים מראש בלילה, שאפשר להסתמך עליהם לצד TensorFlowLiteSwift או TensorFlowLiteObjC CocoaPods.

הערה: אם אתם צריכים להשתמש בפעולות TF נבחרות בסימולטור של x86_64, אתם יכולים ליצור בחירת מסגרת התפעול בעצמכם. למידע נוסף, כדאי לעיין במאמר שימוש ב-Bazel + Xcode. לקבלת פרטים נוספים.

# In your Podfile target:
  pod 'TensorFlowLiteSwift'   # or 'TensorFlowLiteObjC'
  pod 'TensorFlowLiteSelectTfOps', '~> 0.0.1-nightly'

אחרי הרצת pod install, צריך לספק סימון מקשר נוסף עבור לטעון באופן מאול את מסגרת תפעול TF שנבחרה לפרויקט שלך. בפרויקט Xcode שלכם, עבור אל Build Settings -> Other Linker Flags, ולהוסיף:

לגרסאות >= 2.9.0:

-force_load $(SRCROOT)/Pods/TensorFlowLiteSelectTfOps/Frameworks/TensorFlowLiteSelectTfOps.xcframework/ios-arm64/TensorFlowLiteSelectTfOps.framework/TensorFlowLiteSelectTfOps

לגרסאות < 2.9.0:

-force_load $(SRCROOT)/Pods/TensorFlowLiteSelectTfOps/Frameworks/TensorFlowLiteSelectTfOps.framework/TensorFlowLiteSelectTfOps

לאחר מכן אפשר יהיה להריץ את כל המודלים שהומרו באמצעות SELECT_TF_OPS ב- באפליקציה ל-iOS. לדוגמה, ניתן לשנות את סיווג התמונות ב-iOS אפליקציה כדי לבדוק את התכונה הנבחרת של תפעול TF.

  • מחליפים את קובץ המודל בקובץ שהומר באמצעות SELECT_TF_OPS.
  • מוסיפים תלות של TensorFlowLiteSelectTfOps ל-Podfile לפי ההוראות.
  • מוסיפים את סימון הקישור הנוסף כפי שמתואר למעלה.
  • מריצים את האפליקציה לדוגמה ובודקים אם המודל פועל כמו שצריך.

שימוש ב-Bazel + Xcode

את LiteRT עם פעולות TensorFlow נבחרות ל-iOS אפשר ליצור באמצעות Bazel. קודם כול, פועלים לפי ההוראות לגרסת ה-build של iOS כדי להגדיר סביבת עבודה של Bazel וקובץ .bazelrc בצורה תקינה.

אחרי שמגדירים את סביבת העבודה עם תמיכה ב-iOS מופעלת, אפשר להשתמש את הפקודה הבאה כדי ליצור את ה-framework הנבחר של תוספים לתפעול TF, שניתן להוסיף בנוסף ל-TensorFlowLiteC.framework הרגיל. חשוב לשים לב שפעולות TF נבחרות framework לא ניתן לבנות עבור ארכיטקטורה של i386, לכן צריך להגדיר לספק את הרשימה של ארכיטקטורות היעד מלבד i386.

bazel build -c opt --config=ios --ios_multi_cpus=arm64,x86_64 \
  //tensorflow/lite/ios:TensorFlowLiteSelectTfOps_framework

הפעולה הזו תיצור את ה-framework במסגרת bazel-bin/tensorflow/lite/ios/ כדי להוסיף את ה-framework החדש הזה לפרויקט Xcode שלכם, צריך לפעול לפי השלבים הבאים: שלבים דומים שמתוארים בקטע פרויקט Xcode בקטע ההגדרות מדריך build ל-iOS.

אחרי שמוסיפים את ה-framework לפרויקט האפליקציה, מופיע סימון מקשר נוסף צריך לציין בפרויקט האפליקציה כדי לאלץ את הטעינה של פעולות TF שנבחרו . בפרויקט Xcode, עוברים אל Build Settings -> Other Linker Flags, ולהוסיף:

-force_load <path/to/your/TensorFlowLiteSelectTfOps.framework/TensorFlowLiteSelectTfOps>

C/C++‎

אם משתמשים ב-Bazel או ב-CMake כדי ליצור את LiteRT בתרגום שיחה פעילה, אפשר להפעיל משתמש עם הרשאה לשימוש ב-Flex על ידי קישור של LiteRT Flex להעניק גישה לספרייה משותפת. אפשר לפתח אותו באמצעות Bazel בתור הפקודה הבאה.

bazel build -c opt --config=monolithic tensorflow/lite/delegates/flex:tensorflowlite_flex

הפקודה הזו יוצרת את הספרייה המשותפת הבאה ב- bazel-bin/tensorflow/lite/delegates/flex

פלטפורמה שם הספרייה
Linux libtensorflowlite_flex.so
macOS libtensorflowlite_flex.dylib
Windows tensorflowlite_flex.dll

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

הערה: התכונה הזו זמינה מגרסה 2.7.

Python

LiteRT עם פעולות TensorFlow נבחרות יותקן באופן אוטומטי עם חבילת PensorFlow pip. אפשר לבחור גם להתקין רק את תמונה-בתוך-תמונה של 'תרגום ב-LiteRT' חבילה.

מדדים

ביצועים

כשמשתמשים בשילוב של פעולות מובנות וגם של פעולות TensorFlow נבחרות, אופטימיזציות LiteRT ופעולות מובנות שעברו אופטימיזציה יהיו זמינות שאפשר להשתמש בהן במודל שהומר.

הטבלה הבאה מתארת את הזמן הממוצע שלוקח להפעלת ההסקה MobileNet במכשיר Pixel 2. הזמנים הרשומים הם 100 הפעלות בממוצע. האלה יעדים נוצרו ל-Android באמצעות הדגלים: --config=android_arm64 -c opt.

פיתוח פתרונות זמן (אלפיות שנייה)
רק פעולות מובנות (TFLITE_BUILTIN) 260.7
שימוש בתפעול TF בלבד (SELECT_TF_OPS) 264.5

גודל בינארי

בטבלה הבאה מתואר הגודל הבינארי של LiteRT בכל גרסת build. היעדים האלו נוצרו ל-Android באמצעות --config=android_arm -c opt.

פיתוח פתרונות גודל בינארי של C++ גודל APK של Android
רק פעולות מובנות 796 KB 561 KB
פעולות מובנות + תפעול TF 23.0 MB 8.0 MB
פעולות מובנות + פעולות TF (1) 4.1 MB 1.8 MB

(1) הספריות האלה בנויות באופן סלקטיבי עבור i3d-kinetics-400 מודל עם 8 פעולות מובנות של TFLite ו-3 פעולות Tensorflow. פרטים נוספים זמינים הקטנת הגודל הבינארי של LiteRT.

מגבלות ידועות

  • סוגים לא נתמכים: יכול להיות שפעולות מסוימות של TensorFlow לא תומכות בקבוצה המלאה של סוגי הקלט/פלט שבדרך כלל זמינים ב-TensorFlow.

עדכונים

  • גרסה 2.6
    • תמיכה באופרטורים המבוססים על מאפייני GraphDef ובמשאב HashTable האתחולים השתפרו.
  • גרסה 2.5
  • גרסה 2.4
    • השתפרה התאימות לנציגים עם האצת חומרה