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

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

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

מסמך זה מתאר כיצד להמיר ולהפעיל מודל 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 שהומר עם תמיכה בפעולות TensorFlow נבחרות, על הלקוח להשתמש גם בזמן ריצה של TensorFlow Lite הכולל את הספרייה הדרושה של TensorFlow ops.

אנדרואיד AAR

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

אתה יכול לציין זאת בתלות build.gradle שלך ​​על ידי הוספתו לצד התקן TensorFlow Lite 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 ops של הגרף אמור להיות מותקן אוטומטית עבור גרפים הדורשים אותם.

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

בניית AAR של אנדרואיד

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

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

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

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

באמצעות Bazel + Xcode

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

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

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

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

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

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

C/C++

אם אתה משתמש ב-Bazel או ב-CMake כדי לבנות מתורגמן של TensorFlow Lite, אתה יכול להפעיל את Flex delegate על ידי קישור ספריה משותפת של TensorFlow Lite Flex delegate. אתה יכול לבנות אותו עם Bazel בתור הפקודה הבאה.

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

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

פּלַטפוֹרמָה שם הספרייה
לינוקס libtensorflowlite_flex.so
macOS libtensorflowlite_flex.dylib
חלונות tensorflowlite_flex.dll

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

פִּיתוֹן

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

מדדים

ביצועים

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

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

לִבנוֹת זמן (מילישניות)
רק פעולות מובנות ( TFLITE_BUILTIN ) 260.7
שימוש רק ב-TF ops ( SELECT_TF_OPS ) 264.5

גודל בינארי

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

לִבנוֹת C++ גודל בינארי גודל APK של אנדרואיד
רק פעולות מובנות 796 KB 561 KB
אופציות מובנות + TF אופציות 23.0 מגה-בייט 8.0 מגה-בייט
פעולות מובנות + אופציות TF (1) 4.1 מגה-בייט 1.8 מגה-בייט

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

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

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

עדכונים

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