ساخت 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 را در دایرکتوری root TensorFlow Checkout اجرا کنید و وقتی اسکریپت پرسید که آیا می‌خواهید 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 شما ایجاد می کند. به‌طور پیش‌فرض، چارچوب تولید شده حاوی یک باینری «fat» است که شامل 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 ایجاد می کند. و به صورت اختیاری، اگر مدل‌های شما دارای گزینه‌های Select TensorFlow هستند، چارچوب استاتیک bazel-bin/tensorflow/lite/ios/tmp/TensorFlowLiteSelectTfOps_framework.zip ایجاد می‌کند. توجه داشته باشید که پرچم --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های محلی سوئیفت یا Objective-C

اگر از CocoaPods استفاده می‌کنید و فقط می‌خواهید برخی تغییرات محلی را در APIهای Swift TensorFlow Lite یا APIهای Objective-C آزمایش کنید، مراحل اینجا را دنبال کنید.

  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 خود اشاره کنید.
    برای سوئیفت:
    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_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 در بخش «Frameworks, Libraries, and Embedded Content» اضافه کنید.
  • Xcode 10 و پایین تر: به برگه "عمومی" ویرایشگر پروژه برای هدف برنامه خود بروید و TensorFlowLiteC.framework در قسمت "باینری های جاسازی شده" اضافه کنید. چارچوب همچنین باید به طور خودکار در بخش «چارچوب‌های مرتبط و کتابخانه‌ها» اضافه شود.

هنگامی که چارچوب را به‌عنوان یک باینری جاسازی شده اضافه می‌کنید، Xcode همچنین ورودی «مسیرهای جستجوی چارچوب» را در زیر تب «تنظیمات ساخت» به‌روزرسانی می‌کند تا فهرست والد فریم‌ورک شما را نیز شامل شود. در صورتی که این به طور خودکار اتفاق نیفتد، باید دایرکتوری والد دایرکتوری TensorFlowLiteC.framework را به صورت دستی اضافه کنید.

پس از انجام این دو تنظیمات، باید بتوانید API C TensorFlow Lite را که توسط فایل‌های هدر زیر فهرست TensorFlowLiteC.framework/Headers تعریف شده است، وارد کرده و فراخوانی کنید.