عملگرهای TensorFlow را انتخاب کنید

از آنجایی که کتابخانه اپراتور داخلی 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 است.

Android AAR

برای کاهش اندازه باینری، لطفاً فایل‌های AAR سفارشی خود را طبق راهنمایی در بخش بعدی بسازید. اگر اندازه باینری نگرانی قابل توجهی نیست، توصیه می کنیم از AAR از پیش ساخته شده با عملیات TensorFlow که در 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 نسبتاً زیاد است، بنابراین احتمالاً می‌خواهید با تنظیم abiFilters ، ABI‌های x86 غیرضروری را در فایل .gradle . خود فیلتر کنید.

android {
    defaultConfig {
        ndk {
            abiFilters 'armeabi-v7a', 'arm64-v8a'
        }
    }
}

ساخت Android 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 ops ایجاد کنید. اگر محیط ساخت کار ندارید، می توانید فایل های بالا را با 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'
}

iOS

استفاده از CocoaPods

LiteRT برای arm64 شبانه TF ops CocoaPods از پیش ساخته شده را ارائه می دهد که می توانید در کنار 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 ، باید یک پرچم پیوند دهنده اضافی برای بارگذاری چارچوب انتخابی 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 را برای آزمایش ویژگی انتخابی TF ops تغییر دهید.

  • فایل مدل را با فایل تبدیل شده با SELECT_TF_OPS جایگزین کنید.
  • طبق دستور، وابستگی TensorFlowLiteSelectTfOps را به Podfile اضافه کنید.
  • پرچم پیوند دهنده اضافی را مانند بالا اضافه کنید.
  • برنامه نمونه را اجرا کنید و ببینید آیا مدل درست کار می کند یا خیر.

با استفاده از Bazel + Xcode

LiteRT با گزینه‌های TensorFlow برای iOS می‌تواند با استفاده از Bazel ساخته شود. ابتدا دستورالعمل های ساخت iOS را دنبال کنید تا فضای کاری Bazel و فایل .bazelrc خود را به درستی پیکربندی کنید.

هنگامی که فضای کاری را با فعال بودن پشتیبانی iOS پیکربندی کردید، می‌توانید از دستور زیر برای ساخت چارچوب افزونه انتخابی TF ops استفاده کنید که می‌تواند در بالای TensorFlowLiteC.framework معمولی اضافه شود. توجه داشته باشید که چارچوب انتخاب 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 خود اضافه کنید.

پس از افزودن فریم ورک به پروژه برنامه خود، یک پرچم پیوند دهنده اضافی باید در پروژه برنامه شما مشخص شود تا چارچوب انتخابی TF ops بارگذاری شود. در پروژه Xcode خود، به Build Settings -> Other Linker Flags بروید و اضافه کنید:

-force_load <path/to/your/TensorFlowLiteSelectTfOps.framework/TensorFlowLiteSelectTfOps>

C/C++

اگر از Bazel یا CMake برای ساخت مترجم LiteRT استفاده می‌کنید، می‌توانید Flex delegate را با پیوند دادن یک کتابخانه مشترک LiteRT Flex فعال کنید. می توانید آن را با Bazel به عنوان دستور زیر بسازید.

bazel build -c opt --config=monolithic tensorflow/lite/delegates/flex:tensorflowlite_flex

این دستور کتابخانه مشترک زیر را در bazel-bin/tensorflow/lite/delegates/flex ایجاد می‌کند.

پلت فرم نام کتابخانه
لینوکس libtensorflowlite_flex.so
macOS libtensorflowlite_flex.dylib
ویندوز tensorflowlite_flex.dll

توجه داشته باشید که TfLiteDelegate ضروری هنگام ایجاد مفسر در زمان اجرا تا زمانی که کتابخانه مشترک پیوند داده شده باشد به طور خودکار نصب می شود. نیازی به نصب صریح نمونه نماینده نیست، همانطور که معمولاً در مورد سایر انواع نماینده مورد نیاز است.

توجه: این ویژگی از نسخه 2.7 در دسترس است.

پایتون

LiteRT با گزینه های TensorFlow به طور خودکار با بسته Pip TensorFlow نصب می شود. همچنین می‌توانید فقط بسته پیپ LiteRT Interpreter را نصب کنید.

معیارها

عملکرد

هنگام استفاده از ترکیبی از هر دو عملیات داخلی و منتخب TensorFlow، همه بهینه‌سازی‌های LiteRT یکسان و عملیات داخلی بهینه‌شده در دسترس و قابل استفاده با مدل تبدیل شده خواهند بود.

جدول زیر میانگین زمان اجرای استنباط در MobileNet را در Pixel 2 توضیح می‌دهد. زمان‌های ذکر شده به طور متوسط ​​100 اجرا هستند. این اهداف برای اندروید با استفاده از پرچم‌ها ساخته شده‌اند: --config=android_arm64 -c opt .

ساخت زمان (میلی ثانیه)
فقط عملیات داخلی ( TFLITE_BUILTIN ) 260.7
فقط استفاده از عملیات TF ( SELECT_TF_OPS ) 264.5

اندازه باینری

جدول زیر اندازه باینری LiteRT را برای هر ساخت توضیح می دهد. این اهداف با استفاده از --config=android_arm -c opt برای اندروید ساخته شده اند.

ساخت اندازه باینری C++ اندازه APK اندروید
فقط عملیات داخلی 796 کیلوبایت 561 کیلوبایت
عملیات داخلی + عملیات TF 23.0 مگابایت 8.0 مگابایت
عملیات داخلی + عملیات TF (1) 4.1 مگابایت 1.8 مگابایت

(1) این کتابخانه ها به طور انتخابی برای مدل i3d-kinetics-400 با 8 عملیات داخلی TFLite و 3 عملیات تنسورفلو ساخته شده اند. برای جزئیات بیشتر، لطفاً به بخش کاهش اندازه باینری LiteRT مراجعه کنید.

محدودیت های شناخته شده

  • انواع پشتیبانی‌نشده: برخی از عملیات‌های TensorFlow ممکن است از مجموعه کامل انواع ورودی/خروجی که معمولاً در TensorFlow موجود هستند، پشتیبانی نکنند.

به روز رسانی ها

  • نسخه 2.6
    • پشتیبانی از عملگرهای مبتنی بر ویژگی GraphDef و مقداردهی اولیه منابع HashTable بهبود یافته است.
  • نسخه 2.5
  • نسخه 2.4
    • سازگاری با نمایندگان تسریع شده سخت افزاری بهبود یافته است