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

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

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

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

המרת מודל

הדוגמה הבאה ממחישה איך ליצור מודל TensorFlow Lite באמצעות פעולות נבחרות של 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 TensorFlow Lite ops.
  tf.lite.OpsSet.SELECT_TF_OPS # enable TensorFlow ops.
]
tflite_model = converter.convert()
open("converted_model.tflite", "wb").write(tflite_model)

הרצת ההסקה

כשמשתמשים במודל TensorFlow Lite שהומר

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

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

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

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

כדי להקטין את הגודל הבינארי או בקשות מתקדמות אחרות, אפשר גם ליצור את הספרייה באופן ידני. בהנחה שסביבת הפיתוח של TensorFlow Lite פועלת, צריך לפתח את ה-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 בשביל הפעולות המובנות והמותאמיות אישית של TensorFlow Lite ותיצור את קובץ ה-AAR bazel-bin/tmp/tensorflow-lite-select-tf-ops.aar לתפעול של TensorFlow. אם אין לכם סביבת build לעבודה, אפשר גם ליצור קבצים מעל באמצעות 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() ומחליפים את התלות הרגילה של TensorFlow Lite בזו שתומכת בפעולות נבחרות של 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

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

הערה: אם אתם צריכים להשתמש בפעולות 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

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

אחרי שמגדירים את סביבת העבודה עם תמיכה ב-iOS מופעלת, אפשר להשתמש בפקודה הבאה כדי ליצור את ה-framework הנבחר של תוסף TF ops, שנוספה מעל TensorFlowLiteC.framework הרגיל. שימו לב שאי אפשר לבנות את ה-framework הנבחר של תפעול TF לארכיטקטורת 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 כדי לפתח את המתרגם של TensorFlow Lite, כדי להפעיל את התכונה 'הענקת גישה גמישה' על ידי קישור ספרייה משותפת עם הרשאות גישה של TensorFlow Lite 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

TensorFlow Lite עם פעולות נבחרות של TensorFlow יותקן באופן אוטומטי באמצעות חבילת PIP של TensorFlow. תוכלו גם להתקין רק את חבילת pip של 'תרגום שיחה פעילה' ב-TensorFlow Lite.

מדדים

ביצועים

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

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

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

גודל בינארי

בטבלה הבאה מתואר הגודל הבינארי של TensorFlow Lite לכל גרסת 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. לפרטים נוספים, ראו צמצום הגודל הבינארי של TensorFlow Lite.

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

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

עדכונים

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