این سند نحوه ساخت کتابخانه 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 بسازید، به «بله» پاسخ دهید.
ساخت چارچوب پویا TensorFlowLiteC (توصیه می شود)
هنگامی که 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 آزمایش کنید، مراحل اینجا را دنبال کنید.
تغییراتی را در 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
(که هر شب بین ساعت 1 تا 4 صبح به وقت اقیانوس آرام ساخته می شود) به جای نسخه پایدار که ممکن است در مقایسه باtensorflow
محلی شما قدیمی باشد، می سازید. پرداخت از طرف دیگر، می توانید نسخه خود را ازTensorFlowLiteC
منتشر کنید و از آن نسخه استفاده کنید ( به استفاده از بخش هسته محلی LiteRT در زیر مراجعه کنید).در
Podfile
پروژه iOS خود، وابستگی را به صورت زیر تغییر دهید تا به مسیر محلی دایرکتوری ریشهtensorflow
خود اشاره کنید.
برای سوئیفت:
pod 'TensorFlowLiteSwift', :path => '<your_tensorflow_root_dir>'
برای Objective-C:
pod 'TensorFlowLiteObjC', :path => '<your_tensorflow_root_dir>'
نصب پاد خود را از دایرکتوری ریشه پروژه 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 به عنوان ابزار ساخت اصلی استفاده می کنید، می توانید به سادگی وابستگی 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
تعریف شده است، وارد کرده و فراخوانی کنید.