בניית LiteRT ל-iOS

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

מבנה מקומי

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

התקנת Xcode

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

xcode-select --install

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

sudo xcodebuild -license accept

להתקנת Bazel

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

הגדרת WORKSPACE ו- .bazelrc

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

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

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. כברירת מחדל, ה-framework שנוצר מכיל "fat" קובץ בינארי, שמכיל את Armv7, Arm64 ו-x86_64 (אבל לא i386). כדי לראות את הרשימה המלאה של דגלי ה-build שנעשה בהם שימוש ציינת את --config=ios_fat, יש לעיין בקטע ההגדרות של iOS קובץ אחד (.bazelrc).

פיתוח מסגרת סטטית של TensorFlowLiteC

כברירת מחדל, אנחנו מפיצים את המסגרת הדינמית רק דרך Cocoapods. אם רוצים כדי להשתמש ב-framework הסטטי, אפשר ליצור את הקוד הסטטי 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/ מתחת לרמה הבסיסית (root) של TensorFlow אפשר להשתמש במסגרת הסטטית הזאת באותו אופן כמו דינמי.

פיתוח סלקטיבי של frameworks של TFLite

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

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

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

שימוש באפליקציה שלכם

מפתחי CocoaPods

יש שלושה קובצי CocoaPods של LiteRT:

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

כמפתח, עליך לבחור TensorFlowLiteSwift או TensorFlowLiteObjC מוצגים על סמך השפה שבה האפליקציה נכתבת, אבל לא את שניהם. יש הבדלים בשלבים המדויקים לשימוש בגרסאות build מקומיות של LiteRT: בהתאם לחלק המדויק שרוצים ליצור.

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

אם אתם משתמשים ב-CocoaPods ורוצים לבדוק רק כמה שינויים מקומיים Swift APIs או ממשקי API של Objective-C ב-LiteRT, יש לבצע את השלבים המפורטים כאן.

  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 (פועלת מדי לילה בין 01 ל-4:00 לפי שעון החוף המערבי של ארה"ב) ולא יציבה שעשויה להיות מיושנת בהשוואה לקופה המקומית שלך ב-tensorflow. לחלופין, תוכלו לפרסם גרסה משלכם של TensorFlowLiteC ומשתמשים בגרסה הזו (למידע נוסף, ניתן לעיין במאמר שימוש ב-LiteRT מקומי) בסיסי שבהמשך).

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

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

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

שימוש בליבה מקומית של LiteRT

אפשר להגדיר מאגר מפרטים פרטי של 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 בתור כלי ה-build הראשי, אתם יכולים פשוט להוסיף תלות של TensorFlowLite ביעד בקובץ BUILD.

עבור Swift:

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

עבור יעד ג':

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

כשיוצרים פרויקט באפליקציה, שינויים בספריית LiteRT שצריך לאסוף אותם ולהיות מובנה באפליקציה.

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

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

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

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

כשמוסיפים את ה-framework כבינארי מוטמע, Xcode גם יעדכן את 'Framework Search Paths' בקטע 'הגדרות Build' כדי לכלול את ההורה של ה-framework. אם זה לא יקרה באופן אוטומטי, צריך להוסיף באופן ידני את ספריית ההורה של TensorFlowLiteC.framework

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