במסמך הזה נסביר איך ליצור בעצמכם ספריית 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
תמיכה.
פיתוח מסגרת דינמית של TensorFlowLiteC (מומלץ)
אחרי ש-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, יש לבצע את השלבים המפורטים כאן.
מבצעים שינויים בממשקי ה-API של Swift או Objective-C בקופה של
tensorflow
.פותחים את הקובץ
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 מקומי) בסיסי שבהמשך).ב-
Podfile
של פרויקט iOS, משנים את התלות באופן הבא: להצביע על הנתיב המקומי לתיקיית השורשtensorflow
.
ל-Swift:
pod 'TensorFlowLiteSwift', :path => '<your_tensorflow_root_dir>'
עבור יעד ג':
pod 'TensorFlowLiteObjC', :path => '<your_tensorflow_root_dir>'
מעדכנים את התקנת ה-Pod מספריית השורש של פרויקט iOS.
$ pod update
פותחים מחדש את סביבת העבודה שנוצרה (
<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
.