قم ببناء 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 8 أو إصدار أحدث والأدوات التي تستخدم xcode-select :

xcode-select --install

إذا كان هذا تثبيتًا جديدًا، فستحتاج إلى قبول اتفاقية الترخيص لجميع المستخدمين باستخدام الأمر التالي:

sudo xcodebuild -license accept

تثبيت بازل

Bazel هو نظام البناء الأساسي لـ TensorFlow. قم بتثبيت Bazel وفقًا للتعليمات الموجودة على موقع Bazel الإلكتروني . تأكد من اختيار إصدار بين _TF_MIN_BAZEL_VERSION و _TF_MAX_BAZEL_VERSION في ملف configure.py في جذر مستودع tensorflow .

قم بتكوين مساحة العمل و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). لرؤية القائمة الكاملة لعلامات البناء المستخدمة عند تحديد --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 : يوفر واجهات برمجة التطبيقات Swift لـ TensorFlow Lite.
  • TensorFlowLiteObjC : يوفر واجهات برمجة التطبيقات Objective-C لـ TensorFlow Lite.
  • TensorFlowLiteC : حجرة أساسية مشتركة، والتي تتضمن وقت التشغيل الأساسي لـ TensorFlow Lite وتكشف عن واجهات برمجة تطبيقات C الأساسية التي تستخدمها البودتان المذكورتان أعلاه. ليس من المفترض أن يتم استخدامها مباشرة من قبل المستخدمين.

كمطور، يجب عليك اختيار إما TensorFlowLiteSwift أو TensorFlowLiteObjC pod بناءً على اللغة التي كتب بها تطبيقك، ولكن ليس كليهما. تختلف الخطوات الدقيقة لاستخدام الإصدارات المحلية من TensorFlow Lite، اعتمادًا على الجزء المحدد الذي ترغب في إنشائه.

استخدام واجهات برمجة تطبيقات Swift أو Objective-C المحلية

إذا كنت تستخدم CocoaPods، وترغب فقط في اختبار بعض التغييرات المحلية على واجهات برمجة تطبيقات Swift أو Objective-C الخاصة بـ TensorFlow Lite، فاتبع الخطوات هنا.

  1. قم بإجراء تغييرات على واجهات برمجة تطبيقات Swift أو Objective-C في عملية الدفع الخاصة بـ tensorflow .

  2. افتح ملف TensorFlowLite(Swift|ObjC).podspec ، وقم بتحديث هذا السطر:
    s.dependency 'TensorFlowLiteC', "#{s.version}"
    يكون:
    s.dependency 'TensorFlowLiteC', "~> 0.0.1-nightly"
    هذا للتأكد من أنك تقوم بإنشاء واجهات برمجة تطبيقات Swift أو Objective-C مقابل أحدث إصدار ليلي متاح من واجهات برمجة تطبيقات TensorFlowLiteC (التي يتم إنشاؤها كل ليلة بين الساعة 1 و4 صباحًا بتوقيت المحيط الهادئ) بدلاً من الإصدار الثابت، الذي قد يكون قديمًا مقارنة بـ tensorflow المحلي الخاص بك الدفع. وبدلاً من ذلك، يمكنك اختيار نشر الإصدار الخاص بك من TensorFlowLiteC واستخدام هذا الإصدار (راجع القسم الأساسي لاستخدام TensorFlow Lite المحلي أدناه).

  3. في Podfile الخاص بمشروع iOS الخاص بك، قم بتغيير التبعية كما يلي للإشارة إلى المسار المحلي إلى الدليل الجذر لـ tensorflow .
    بالنسبة لسويفت:
    pod 'TensorFlowLiteSwift', :path => '<your_tensorflow_root_dir>'
    للهدف-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 كأداة البناء الرئيسية، فيمكنك ببساطة إضافة تبعية TensorFlowLite إلى هدفك في ملف BUILD الخاص بك.

بالنسبة لسويفت:

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

للهدف-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 ضمن قسم "Frameworks، Libraries، and Embedded Content".
  • Xcode 10 والإصدارات الأقدم: انتقل إلى علامة التبويب "عام" في محرر المشروع لهدف تطبيقك، وأضف TensorFlowLiteC.framework ضمن "الثنائيات المضمنة". يجب أيضًا إضافة إطار العمل تلقائيًا ضمن قسم "أطر العمل والمكتبات المرتبطة".

عند إضافة إطار العمل كإطار ثنائي مضمن، سيقوم Xcode أيضًا بتحديث إدخال "مسارات بحث الإطار" ضمن علامة التبويب "إعدادات البناء" لتضمين الدليل الأصلي لإطار العمل الخاص بك. في حالة عدم حدوث ذلك تلقائيًا، يجب عليك إضافة الدليل الأصلي لدليل TensorFlowLiteC.framework يدويًا.

بمجرد الانتهاء من هذين الإعدادين، يجب أن تكون قادرًا على استيراد واستدعاء واجهة برمجة تطبيقات TensorFlow Lite's C، المحددة بواسطة ملفات الرأس ضمن دليل TensorFlowLiteC.framework/Headers .