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

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

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

במסמך הזה מוסבר איך להמיר ולהפעיל מודל 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.

‫Android AAR

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

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

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.

אחרי שמוסיפים את התלות, אמור להיות מותקן באופן אוטומטי נציג (delegate) שנדרש לטיפול בפעולות 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. אם אין לכם סביבת בנייה תקינה, אתם יכולים גם לבנות את הקבצים שלמעלה באמצעות Docker.

מכאן, אפשר לייבא את קובצי ה-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 מספקת CocoaPods של TF ops נבחרים שנבנו מראש מדי לילה עבור arm64, שאפשר להסתמך עליהם לצד CocoaPods של TensorFlowLiteSwift או TensorFlowLiteObjC.

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

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

אחרי שמריצים את pod install, צריך לספק דגל נוסף של linker כדי לאלץ את הטעינה של מסגרת הפעולות של 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 לפי ההוראות.
  • מוסיפים את דגל ה-linker הנוסף כמו שמוסבר למעלה.
  • מריצים את האפליקציה לדוגמה ובודקים אם המודל פועל בצורה תקינה.

שימוש ב-Bazel + Xcode

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

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

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

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

אחרי שמוסיפים את ה-framework לפרויקט האפליקציה, צריך לציין דגל linker נוסף בפרויקט האפליקציה כדי לאלץ טעינה של ה-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 יותקן באופן אוטומטי עם חבילת ה-pip של TensorFlow. אפשר גם לבחור להתקין רק את חבילת pip של LiteRT Interpreter.

מדדים

ביצועים

כשמשתמשים בשילוב של פעולות TensorFlow מובנות ופעולות 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
רק פעולות מוכללות ‫796KB ‫561KB
פעולות מובנות + פעולות TF ‫23.0MB ‫8.0MB
פעולות תפעוליות מובנות + פעולות תפעוליות של TensorFlow‏ (1) ‫4.1MB ‫1.8MB

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

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

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

עדכונים

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