בנה את TensorFlow Lite עבור iOS

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

בנייה מקומית

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

התקן Xcode

אם עדיין לא עשית זאת, תצטרך להתקין את Xcode 8 ואילך ואת הכלים באמצעות xcode-select :

xcode-select --install

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

sudo xcodebuild -license accept

התקן את Bazel

Bazel היא מערכת הבנייה העיקרית עבור TensorFlow. התקן את Bazel לפי ההוראות באתר Bazel . הקפד לבחור גרסה בין _TF_MIN_BAZEL_VERSION ל- _TF_MAX_BAZEL_VERSION בקובץ configure.py בשורש מאגר tensorflow .

הגדר את WORKSPACE ואת .bazelrc

הפעל את הסקריפט ./configure בספריית התשלום של TensorFlow בשורש, וענה "כן" כאשר הסקריפט שואל אם ברצונך לבנות את TensorFlow עם תמיכה ב-iOS.

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

bazel build --config=ios_fat -c opt --cxxopt=--std=c++17 \
  //tensorflow/lite/ios:TensorFlowLiteC_framework

פקודה זו תיצור את הקובץ TensorFlowLiteC_framework.zip תחת ספריית bazel-bin/tensorflow/lite/ios/ תחת ספריית השורש TensorFlow שלך. כברירת מחדל, המסגרת שנוצרה מכילה קובץ בינארי "שמן", המכיל armv7, arm64 ו-x86_64 (אבל אין i386). כדי לראות את הרשימה המלאה של דגלי ה-build המשמשים כאשר אתה מציין --config=ios_fat , עיין בסעיף תצורות iOS בקובץ .bazelrc .

בנה מסגרת סטטית של TensorFlowLiteC

כברירת מחדל, אנו מפיצים את המסגרת הדינמית רק באמצעות Cocoapods. אם אתה רוצה להשתמש במסגרת הסטטית במקום זאת, אתה יכול לבנות את המסגרת הסטטית TensorFlowLiteC עם הפקודה הבאה:

bazel build --config=ios_fat -c opt --cxxopt=--std=c++17 \
  //tensorflow/lite/ios:TensorFlowLiteC_static_framework

הפקודה תיצור קובץ בשם TensorFlowLiteC_static_framework.zip תחת ספריית bazel-bin/tensorflow/lite/ios/ תחת ספריית השורש של TensorFlow. ניתן להשתמש במסגרת הסטטית הזו באותו אופן בדיוק כמו המסגרת הדינמית.

בניית מסגרות TFLite באופן סלקטיבי

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

bash tensorflow/lite/ios/build_frameworks.sh \
  --input_models=model1.tflite,model2.tflite \
  --target_archs=x86_64,armv7,arm64

הפקודה לעיל תייצר את המסגרת הסטטית bazel-bin/tensorflow/lite/ios/tmp/TensorFlowLiteC_framework.zip עבור TensorFlow Lite פעולות מובנות ומותאמות אישית; ובאופן אופציונלי, יוצר את המסגרת הסטטית bazel-bin/tensorflow/lite/ios/tmp/TensorFlowLiteSelectTfOps_framework.zip אם המודלים שלך מכילים Select TensorFlow ops. שים לב שניתן להשתמש בדגל --target_archs כדי לציין את ארכיטקטורות הפריסה שלך.

השתמש באפליקציה שלך

מפתחי CocoaPods

ישנם שלושה CocoaPods עבור TensorFlow Lite:

  • TensorFlowLiteSwift : מספק את ממשקי ה-API של Swift עבור TensorFlow Lite.
  • TensorFlowLiteObjC : מספק את ממשקי ה-API של Objective-C עבור TensorFlow Lite.
  • TensorFlowLiteC : תרמיל בסיס משותף, המטמיע את זמן הריצה הליבה של TensorFlow Lite וחושף את ממשקי ה-API של הבסיס C המשמשים את שני הפודים לעיל. לא נועד לשמש ישירות את המשתמשים.

כמפתחים, עליך לבחור TensorFlowLiteSwift או TensorFlowLiteObjC pod על סמך השפה שבה האפליקציה שלך כתובה, אך לא בשניהם. השלבים המדויקים לשימוש בבנייה מקומית של TensorFlow Lite שונים, תלוי באיזה חלק בדיוק תרצה לבנות.

שימוש בממשקי API מקומיים של Swift או Objective-C

אם אתה משתמש ב-CocoaPods, וברצונך לבדוק רק כמה שינויים מקומיים ב- Swift APIs או Objective-C APIs של TensorFlow Lite, בצע את השלבים כאן.

  1. בצע שינויים בממשקי ה-API של Swift או Objective-C בקופה שלך tensorflow .

  2. פתח את הקובץ TensorFlowLite(Swift|ObjC).podspec ועדכן את השורה הזו:
    s.dependency 'TensorFlowLiteC', "#{s.version}"
    להיות:
    s.dependency 'TensorFlowLiteC', "~> 0.0.1-nightly"
    זה כדי להבטיח שאתה בונה את ממשקי ה-API של Swift או Objective-C מול הגרסה הלילית העדכנית ביותר הזמינה של ממשקי API של TensorFlowLiteC (שנבנתה כל לילה בין 1-4 לפנות בוקר שעון האוקיינוס ​​השקט) במקום הגרסה היציבה, שעשויה להיות מיושנת בהשוואה tensorflow המקומית שלך. לבדוק. לחלופין, תוכל לבחור לפרסם גרסה משלך של TensorFlowLiteC ולהשתמש בגרסה זו ( ראה סעיף הליבה המקומי של TensorFlow Lite להלן).

  3. ב- Podfile של פרויקט ה-iOS שלך, שנה את התלות באופן הבא כדי להצביע על הנתיב המקומי לספריית השורש של tensorflow .
    עבור Swift:
    pod 'TensorFlowLiteSwift', :path => '<your_tensorflow_root_dir>'
    עבור Objective-C:
    pod 'TensorFlowLiteObjC', :path => '<your_tensorflow_root_dir>'

  4. עדכן את התקנת הפוד שלך מספריית השורש של פרוייקט iOS שלך.
    $ pod update

  5. פתח מחדש את סביבת העבודה שנוצרה ( <project>.xcworkspace ) ובנה מחדש את האפליקציה שלך בתוך Xcode.

שימוש בליבת TensorFlow Lite מקומית

אתה יכול להגדיר מאגר פרטי של מפרט CocoaPods, ולפרסם את המסגרת המותאמת אישית שלך TensorFlowLiteC למאגר הפרטי שלך. אתה יכול להעתיק את קובץ ה-podspec הזה ולשנות כמה ערכים:

  ...
  s.version      = <your_desired_version_tag>
  ...
  # Note the `///`, two from the `file://` and one from the `/path`.
  s.source       = { :http => "file:///path/to/TensorFlowLiteC_framework.zip" }
  ...
  s.vendored_frameworks = 'TensorFlowLiteC.framework'
  ...

לאחר יצירת קובץ TensorFlowLiteC.podspec משלך, תוכל לעקוב אחר ההוראות לשימוש ב-CocoaPods פרטיים כדי להשתמש בו בפרויקט משלך. אתה יכול גם לשנות את TensorFlowLite(Swift|ObjC).podspec כדי להצביע על הפוד המותאם אישית TensorFlowLiteC ולהשתמש בפוד Swift או Objective-C בפרויקט האפליקציה שלך.

מפתחי Bazel

אם אתה משתמש ב-Bazel ככלי הבנייה הראשי, אתה יכול פשוט להוסיף תלות של TensorFlowLite ליעד שלך בקובץ BUILD שלך.

עבור Swift:

swift_library(
  deps = [
      "//tensorflow/lite/swift:TensorFlowLite",
  ],
)

עבור Objective-C:

objc_library(
  deps = [
      "//tensorflow/lite/objc:TensorFlowLite",
  ],
)

כאשר אתה בונה את פרויקט האפליקציה שלך, כל שינוי בספריית TensorFlow Lite ייקלט ויובנה באפליקציה שלך.

שנה את הגדרות פרוייקט Xcode ישירות

מומלץ מאוד להשתמש ב-CocoaPods או ב-Bazel להוספת תלות TensorFlow Lite לפרויקט שלך. אם אתה עדיין רוצה להוסיף את המסגרת TensorFlowLiteC באופן ידני, תצטרך להוסיף את המסגרת TensorFlowLiteC כמסגרת משובצת לפרויקט היישום שלך. פתח את ה- TensorFlowLiteC_framework.zip שנוצר מהמבנה לעיל כדי לקבל את ספריית TensorFlowLiteC.framework . ספרייה זו היא המסגרת בפועל ש-Xcode יכול להבין.

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

  • Xcode 11: עבור לכרטיסייה 'כללי' של עורך הפרויקט עבור יעד האפליקציה שלך, והוסף את TensorFlowLiteC.framework בקטע 'מסגרות, ספריות ותוכן מוטבע'.
  • Xcode 10 ומטה: עבור ללשונית 'כללי' של עורך הפרויקט עבור יעד האפליקציה שלך, והוסף את TensorFlowLiteC.framework תחת 'Binaries Embedded'. יש להוסיף את המסגרת אוטומטית גם בקטע 'מסגרות וספריות מקושרות'.

כאשר אתה מוסיף את המסגרת כקובץ בינארי משובץ, Xcode יעדכן גם את הערך 'נתיבי חיפוש מסגרת' בכרטיסייה 'הגדרות בנייה' כדי לכלול את ספריית האב של המסגרת שלך. במקרה שזה לא קורה אוטומטית, עליך להוסיף ידנית את ספריית האב של ספריית TensorFlowLiteC.framework .

לאחר ביצוע שתי ההגדרות הללו, אתה אמור להיות מסוגל לייבא ולהתקשר ל-C API של TensorFlow Lite, המוגדר על ידי קבצי הכותרות תחת ספריית TensorFlowLiteC.framework/Headers .