ساخت LiteRT برای iOS

این سند نحوه ساخت کتابخانه LiteRT iOS را به تنهایی توضیح می دهد. به طور معمول، شما نیازی به ساخت کتابخانه LiteRT iOS به صورت محلی ندارید. اگر فقط می خواهید از آن استفاده کنید، ساده ترین راه استفاده از نسخه های پایدار یا شبانه از پیش ساخته شده LiteRT CocoaPods است. برای جزئیات بیشتر در مورد نحوه استفاده از آنها در پروژه های iOS خود ، شروع سریع iOS را ببینید.

ساخت و ساز به صورت محلی

در برخی موارد، ممکن است بخواهید از یک ساخت محلی LiteRT استفاده کنید، برای مثال زمانی که می خواهید تغییرات محلی در LiteRT ایجاد کنید و آن تغییرات را در برنامه iOS خود آزمایش کنید یا استفاده از چارچوب استاتیک را به چارچوب پویا ارائه شده ترجیح می دهید. برای ایجاد یک فریم ورک جهانی iOS برای LiteRT به صورت محلی، باید آن را با استفاده از 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 برای LiteRT وجود دارد:

  • TensorFlowLiteSwift : API های Swift را برای LiteRT ارائه می کند.
  • TensorFlowLiteObjC : APIهای Objective-C را برای LiteRT ارائه می دهد.
  • TensorFlowLiteC : پاد پایه معمولی، که زمان اجرا هسته LiteRT را تعبیه می کند و API های پایه C را که توسط دو پاد بالا استفاده می شود، نشان می دهد. قرار نیست مستقیماً توسط کاربران استفاده شود.

به عنوان یک توسعه دهنده، باید TensorFlowLiteSwift یا TensorFlowLiteObjC pod را بر اساس زبانی که برنامه شما به آن نوشته شده است انتخاب کنید، اما نه هر دو. بسته به اینکه دقیقاً کدام قسمت را می خواهید بسازید، مراحل دقیق استفاده از ساخت های محلی LiteRT متفاوت است.

استفاده از APIهای محلی سوئیفت یا Objective-C

اگر از CocoaPods استفاده می‌کنید و فقط می‌خواهید برخی تغییرات محلی را در APIهای Swift یا 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 (که هر شب بین ساعت 1 تا 4 صبح به وقت اقیانوس آرام ساخته می شود) به جای نسخه پایدار که ممکن است در مقایسه با tensorflow محلی شما قدیمی باشد، می سازید. پرداخت از طرف دیگر، می توانید نسخه خود را از TensorFlowLiteC منتشر کنید و از آن نسخه استفاده کنید ( به استفاده از بخش هسته محلی LiteRT در زیر مراجعه کنید).

  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 بازسازی کنید.

با استفاده از هسته 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 به عنوان ابزار ساخت اصلی استفاده می کنید، می توانید به سادگی وابستگی TensorFlowLite به هدف خود در فایل BUILD خود اضافه کنید.

برای سوئیفت:

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

برای Objective-C:

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

وقتی پروژه برنامه خود را می‌سازید، هر تغییری در کتابخانه LiteRT برداشته می‌شود و در برنامه شما تعبیه می‌شود.

تنظیمات پروژه Xcode را مستقیماً تغییر دهید

استفاده از CocoaPods یا Bazel برای افزودن وابستگی LiteRT به پروژه خود بسیار توصیه می شود. اگر همچنان می خواهید چارچوب 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 LiteRT را که توسط فایل‌های هدر در فهرست TensorFlowLiteC.framework/Headers تعریف شده است، وارد کرده و فراخوانی کنید.