از آنجایی که کتابخانه عملگر داخلی LiteRT فقط از تعداد محدودی از عملگرهای TensorFlow پشتیبانی میکند، هر مدلی قابل تبدیل نیست. برای جزئیات بیشتر، به سازگاری عملگرها مراجعه کنید.
برای امکان تبدیل، کاربران میتوانند استفاده از برخی عملیات TensorFlow را در مدل LiteRT خود فعال کنند. با این حال، اجرای مدلهای LiteRT با عملیات TensorFlow نیاز به وارد کردن هسته زمان اجرای TensorFlow دارد که باعث افزایش اندازه دودویی مفسر LiteRT میشود. برای اندروید، میتوانید با ساخت انتخابی فقط عملیاتهای Tensorflow مورد نیاز، از این امر جلوگیری کنید. برای جزئیات بیشتر، به کاهش اندازه دودویی مراجعه کنید.
این سند نحوه تبدیل و اجرای یک مدل LiteRT حاوی عملیات TensorFlow را بر روی پلتفرم مورد نظر شما شرح میدهد. همچنین در مورد معیارهای عملکرد و اندازه و محدودیتهای شناخته شده بحث میکند.
تبدیل یک مدل
مثال زیر نحوه تولید یک مدل LiteRT با استفاده از گزینههای منتخب TensorFlow را نشان میدهد.
import tensorflow as tf
converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)
converter.target_spec.supported_ops = [
tf.lite.OpsSet.TFLITE_BUILTINS, # enable LiteRT ops.
tf.lite.OpsSet.SELECT_TF_OPS # enable TensorFlow ops.
]
tflite_model = converter.convert()
open("converted_model.tflite", "wb").write(tflite_model)
اجرای استنتاج
هنگام استفاده از یک مدل LiteRT که با پشتیبانی از عملیاتهای TensorFlow انتخاب شده است، کلاینت باید از یک زمان اجرای LiteRT نیز استفاده کند که شامل کتابخانه لازم عملیاتهای TensorFlow باشد.
اندروید AAR
برای کاهش حجم باینری، لطفاً فایلهای AAR سفارشی خود را طبق دستورالعملهای بخش بعدی بسازید. اگر حجم باینری چندان نگرانکننده نیست، توصیه میکنیم از AAR از پیش ساخته شده با TensorFlow ops میزبانی شده در MavenCentral استفاده کنید.
شما میتوانید این مورد را در وابستگیهای build.gradle خود با اضافه کردن آن در کنار LiteRT AAR استاندارد به شرح زیر مشخص کنید:
dependencies {
implementation 'org.tensorflow:tensorflow-lite:0.0.0-nightly-SNAPSHOT'
// This dependency adds the necessary TF op support.
implementation 'org.tensorflow:tensorflow-lite-select-tf-ops:0.0.0-nightly-SNAPSHOT'
}
برای استفاده از اسنپشاتهای شبانه، مطمئن شوید که مخزن اسنپشات Sonatype را اضافه کردهاید.
پس از افزودن وابستگی، نماینده لازم برای مدیریت عملیات TensorFlow گراف باید به طور خودکار برای گرافهایی که به آنها نیاز دارند نصب شود.
توجه : وابستگی TensorFlow ops نسبتاً بزرگ است، بنابراین احتمالاً میخواهید ABI های x86 غیرضروری را در فایل .gradle خود با تنظیم abiFilters فیلتر کنید.
android {
defaultConfig {
ndk {
abiFilters 'armeabi-v7a', 'arm64-v8a'
}
}
}
ساخت AAR اندروید
برای کاهش اندازه باینری یا سایر موارد پیشرفته، میتوانید کتابخانه را به صورت دستی نیز بسازید. با فرض اینکه محیط ساخت LiteRT کار میکند ، Android AAR را با انتخاب گزینههای TensorFlow به شرح زیر بسازید:
sh tensorflow/lite/tools/build_aar.sh \
--input_models=/a/b/model_one.tflite,/c/d/model_two.tflite \
--target_archs=x86,x86_64,arm64-v8a,armeabi-v7a
این دستور فایل AAR bazel-bin/tmp/tensorflow-lite.aar را برای عملیات داخلی و سفارشی LiteRT ایجاد میکند؛ و فایل AAR bazel-bin/tmp/tensorflow-lite-select-tf-ops.aar برای عملیات TensorFlow ایجاد میکند. اگر محیط ساخت مناسبی ندارید، میتوانید فایلهای فوق را با docker نیز بسازید .
از آنجا، میتوانید فایلهای AAR را مستقیماً به پروژه خود وارد کنید، یا فایلهای AAR سفارشی را در مخزن محلی Maven خود منتشر کنید:
mvn install:install-file \
-Dfile=bazel-bin/tmp/tensorflow-lite.aar \
-DgroupId=org.tensorflow \
-DartifactId=tensorflow-lite -Dversion=0.1.100 -Dpackaging=aar
mvn install:install-file \
-Dfile=bazel-bin/tmp/tensorflow-lite-select-tf-ops.aar \
-DgroupId=org.tensorflow \
-DartifactId=tensorflow-lite-select-tf-ops -Dversion=0.1.100 -Dpackaging=aar
در نهایت، در build.gradle برنامه خود، مطمئن شوید که وابستگی mavenLocal() را دارید و وابستگی استاندارد LiteRT را با وابستگیای که از عملیاتهای منتخب TensorFlow پشتیبانی میکند، جایگزین کنید:
allprojects {
repositories {
mavenCentral()
maven { // Only for snapshot artifacts
name 'ossrh-snapshot'
url 'https://oss.sonatype.org/content/repositories/snapshots'
}
mavenLocal()
}
}
dependencies {
implementation 'org.tensorflow:tensorflow-lite:0.1.100'
implementation 'org.tensorflow:tensorflow-lite-select-tf-ops:0.1.100'
}
آیاواس
استفاده از کوکوپادز
LiteRT، TF ops CocoaPods انتخابی شبانه از پیش ساخته شده را برای arm64 فراهم میکند که میتوانید در کنار TensorFlowLiteSwift یا TensorFlowLiteObjC CocoaPods به آنها تکیه کنید.
توجه : اگر نیاز به استفاده از select TF ops در یک شبیهساز x86_64 دارید، میتوانید خودتان فریمورک select ops را بسازید. برای جزئیات بیشتر به بخش «استفاده از Bazel + Xcode» مراجعه کنید.
# In your Podfile target:
pod 'TensorFlowLiteSwift' # or 'TensorFlowLiteObjC'
pod 'TensorFlowLiteSelectTfOps', '~> 0.0.1-nightly'
پس از اجرای pod install ، باید یک پرچم پیونددهنده اضافی برای بارگذاری اجباری چارچوب select TF ops در پروژه خود ارائه دهید. در پروژه Xcode خود، به Build Settings -> Other Linker Flags بروید و موارد زیر را اضافه کنید:
برای نسخههای >= 2.9.0:
-force_load $(SRCROOT)/Pods/TensorFlowLiteSelectTfOps/Frameworks/TensorFlowLiteSelectTfOps.xcframework/ios-arm64/TensorFlowLiteSelectTfOps.framework/TensorFlowLiteSelectTfOps
برای نسخههای < 2.9.0:
-force_load $(SRCROOT)/Pods/TensorFlowLiteSelectTfOps/Frameworks/TensorFlowLiteSelectTfOps.framework/TensorFlowLiteSelectTfOps
سپس باید بتوانید هر مدلی را که با SELECT_TF_OPS تبدیل شده است، در برنامه iOS خود اجرا کنید. به عنوان مثال، میتوانید برنامه iOS طبقهبندی تصویر را برای آزمایش ویژگی select TF ops تغییر دهید.
- فایل مدل را با فایل تبدیلشدهای که
SELECT_TF_OPSدر آن فعال است، جایگزین کنید. - طبق دستورالعمل، وابستگی
TensorFlowLiteSelectTfOpsرا بهPodfileاضافه کنید. - پرچم پیوند دهنده اضافی را مانند بالا اضافه کنید.
- برنامهی نمونه را اجرا کنید و ببینید که آیا مدل به درستی کار میکند یا خیر.
استفاده از Bazel + Xcode
LiteRT با گزینههای منتخب TensorFlow برای iOS را میتوان با استفاده از Bazel ساخت. ابتدا، دستورالعملهای ساخت iOS را دنبال کنید تا فضای کاری Bazel و فایل .bazelrc خود را به درستی پیکربندی کنید.
پس از پیکربندی فضای کاری با پشتیبانی فعال از iOS، میتوانید از دستور زیر برای ساخت چارچوب افزونه select TF ops استفاده کنید که میتواند بر روی TensorFlowLiteC.framework معمولی اضافه شود. توجه داشته باشید که چارچوب select TF ops را نمیتوان برای معماری i386 ساخت، بنابراین باید صریحاً لیست معماریهای هدف به جز i386 را ارائه دهید.
bazel build -c opt --config=ios --ios_multi_cpus=arm64,x86_64 \
//tensorflow/lite/ios:TensorFlowLiteSelectTfOps_framework
این کار، چارچوب را در دایرکتوری bazel-bin/tensorflow/lite/ios/ ایجاد میکند. میتوانید این چارچوب جدید را با دنبال کردن مراحل مشابه شرح داده شده در بخش تنظیمات پروژه Xcode در راهنمای ساخت iOS، به پروژه Xcode خود اضافه کنید.
پس از افزودن چارچوب به پروژه برنامه خود، باید یک پرچم پیوند دهنده اضافی در پروژه برنامه خود مشخص کنید تا چارچوب select TF ops را به صورت اجباری بارگذاری کند. در پروژه Xcode خود، به Build Settings -> Other Linker Flags بروید و موارد زیر را اضافه کنید:
-force_load <path/to/your/TensorFlowLiteSelectTfOps.framework/TensorFlowLiteSelectTfOps>
سی/سی++
اگر از Bazel یا CMake برای ساخت مفسر LiteRT استفاده میکنید، میتوانید با پیوند دادن یک کتابخانه مشترک LiteRT Flex delegate، Flex delegate را فعال کنید. میتوانید آن را با Bazel و با استفاده از دستور زیر بسازید.
bazel build -c opt --config=monolithic tensorflow/lite/delegates/flex:tensorflowlite_flex
این دستور کتابخانه اشتراکی زیر را در bazel-bin/tensorflow/lite/delegates/flex ایجاد میکند.
| پلتفرم | نام کتابخانه |
|---|---|
| لینوکس | libtensorflowlite_flex.so |
| مکاواس | libtensorflowlite_flex.dylib |
| ویندوز | tensorflowlite_flex.dll |
توجه داشته باشید که TfLiteDelegate لازم هنگام ایجاد مفسر در زمان اجرا، تا زمانی که کتابخانه مشترک متصل باشد، به طور خودکار نصب خواهد شد. نصب صریح نمونه delegate مانند آنچه معمولاً برای سایر انواع delegate لازم است، ضروری نیست.
توجه: این ویژگی از نسخه ۲.۷ به بعد در دسترس است.
پایتون
LiteRT با گزینههای انتخابی TensorFlow به طور خودکار با بسته TensorFlow pip نصب میشود. همچنین میتوانید فقط بسته LiteRT Interpreter pip را نصب کنید.
معیارها
عملکرد
هنگام استفاده ترکیبی از عملیات داخلی و عملیاتهای انتخابی TensorFlow، تمام بهینهسازیهای LiteRT و عملیات داخلی بهینهشدهی مشابه با مدل تبدیلشده در دسترس و قابل استفاده خواهند بود.
جدول زیر میانگین زمان لازم برای اجرای استنتاج در MobileNet روی Pixel 2 را نشان میدهد. زمانهای ذکر شده میانگین ۱۰۰ اجرا هستند. این اهداف برای اندروید با استفاده از پرچمهای زیر ساخته شدهاند: --config=android_arm64 -c opt .
| ساختن | زمان (میلی ثانیه) |
|---|---|
فقط عملیات داخلی ( TFLITE_BUILTIN ) | ۲۶۰.۷ |
فقط با استفاده از عملیات TF ( SELECT_TF_OPS ) | ۲۶۴.۵ |
اندازه دودویی
جدول زیر اندازه باینری LiteRT را برای هر ساخت شرح میدهد. این اهداف برای اندروید با استفاده از --config=android_arm -c opt ساخته شدهاند.
| ساختن | اندازه دودویی C++ | حجم APK اندروید |
|---|---|---|
| فقط عملیات داخلی | ۷۹۶ کیلوبایت | ۵۶۱ کیلوبایت |
| عملیات داخلی + عملیات TF | ۲۳.۰ مگابایت | ۸.۰ مگابایت |
| عملیات داخلی + عملیات TF (1) | ۴.۱ مگابایت | ۱.۸ مگابایت |
(1) این کتابخانهها به صورت انتخابی برای مدل i3d-kinetics-400 با 8 عملیات داخلی TFLite و 3 عملیات Tensorflow ساخته شدهاند. برای جزئیات بیشتر، لطفاً به بخش کاهش اندازه باینری LiteRT مراجعه کنید.
محدودیتهای شناختهشده
- انواع پشتیبانی نشده: برخی از عملیات TensorFlow ممکن است از مجموعه کامل انواع ورودی/خروجی که معمولاً در TensorFlow موجود است، پشتیبانی نکنند.
بهروزرسانیها
- نسخه ۲.۶
- پشتیبانی از عملگرهای مبتنی بر GraphDef-attribute و مقداردهی اولیه منابع HashTable بهبود یافته است.
- نسخه ۲.۵
- شما میتوانید بهینهسازیای به نام کوانتیزاسیون پس از آموزش را اعمال کنید
- نسخه ۲.۴
- سازگاری با نمایندگان شتابدهنده سختافزاری بهبود یافته است