ساخت LiteRT برای اندروید

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

از Nightly Snapshot استفاده کنید

برای استفاده از اسنپ شات های شبانه، مخزن زیر را به پیکربندی بیلد Gradle root خود اضافه کنید.

allprojects {
    repositories {      // should be already there
        mavenCentral()  // should be already there
        maven {         // add this repo to use snapshots
          name 'ossrh-snapshot'
          url 'https://oss.sonatype.org/content/repositories/snapshots'
        }
    }
}

عکس های فوری شبانه را به وابستگی ها اضافه کنید (یا در صورت نیاز ویرایش کنید) به build.gradle خود

...
dependencies {
    ...
    implementation 'org.tensorflow:tensorflow-lite:0.0.0-nightly-SNAPSHOT'
    implementation 'com.google.ai.edge.litert:litert-gpu:0.0.0-nightly-SNAPSHOT'
    implementation 'com.google.ai.edge.litert:litert-support:0.0.0-nightly-SNAPSHOT'
    ...
}
...

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

در برخی موارد، ممکن است بخواهید از یک ساخت محلی LiteRT استفاده کنید. برای مثال، ممکن است در حال ساخت یک باینری سفارشی باشید که شامل عملیات انتخاب شده از TensorFlow باشد، یا ممکن است بخواهید تغییرات محلی در LiteRT ایجاد کنید.

محیط ساخت را با استفاده از Docker تنظیم کنید

  • فایل داکر را دانلود کنید. با دانلود فایل Docker، موافقت می کنید که شرایط خدمات زیر بر استفاده شما از آن حاکم است:

با کلیک بر روی پذیرش، بدینوسیله موافقت می‌کنید که تمام استفاده از Android Studio و Android Native Development Kit تحت موافقتنامه مجوز کیت توسعه نرم‌افزار Android موجود در https://developer.android.com/studio/terms (چنین URL ممکن است هر چند وقت یکبار توسط گوگل به روز یا تغییر کند).

برای دانلود فایل باید شرایط خدمات را بپذیرید.

  • شما می توانید به صورت اختیاری نسخه Android SDK یا NDK را تغییر دهید. فایل داکر دانلود شده را در یک پوشه خالی قرار دهید و با اجرای:
docker build . -t tflite-builder -f tflite-android.Dockerfile
  • با نصب پوشه فعلی خود در /host_dir در داخل کانتینر، کانتینر docker را به صورت تعاملی شروع کنید (توجه داشته باشید که /tensorflow_src مخزن TensorFlow در داخل ظرف است):
docker run -it -v $PWD:/host_dir tflite-builder bash

اگر از PowerShell در ویندوز استفاده می کنید، «$PWD» را با «pwd» جایگزین کنید.

اگر می خواهید از یک مخزن TensorFlow در هاست استفاده کنید، به جای آن دایرکتوری میزبان را مونت کنید (-v hostDir:/host_dir).

  • هنگامی که داخل کانتینر هستید، می‌توانید موارد زیر را برای دانلود ابزارها و کتابخانه‌های اضافی Android اجرا کنید (توجه داشته باشید که ممکن است لازم باشد مجوز را بپذیرید):
sdkmanager \
  "build-tools;${ANDROID_BUILD_TOOLS_VERSION}" \
  "platform-tools" \
  "platforms;android-${ANDROID_API_LEVEL}"

اکنون باید به قسمت Configure WORKSPACE و .bazelrc بروید تا تنظیمات ساخت را پیکربندی کنید.

پس از اتمام ساخت کتابخانه ها، می توانید آنها را در /host_dir داخل کانتینر کپی کنید تا بتوانید در هاست به آنها دسترسی داشته باشید.

محیط ساخت را بدون داکر تنظیم کنید

پیش نیازهای Bazel و Android را نصب کنید

Bazel سیستم ساخت اولیه برای TensorFlow است. برای ساخت با آن، باید آن را داشته باشید و Android NDK و SDK را روی سیستم خود نصب کنید.

  1. آخرین نسخه سیستم ساخت Bazel را نصب کنید.
  2. Android NDK برای ساخت کد LiteRT بومی (C/C++) مورد نیاز است. نسخه پیشنهادی فعلی 25b است که می توانید در اینجا پیدا کنید.
  3. Android SDK و ابزارهای ساخت را می توان در اینجا یا به عنوان بخشی از Android Studio به دست آورد. Build tools API >= 23 نسخه توصیه شده برای ساخت LiteRT است.

WORKSPACE و bazelrc. را پیکربندی کنید

این یک مرحله پیکربندی یکباره است که برای ساخت کتابخانه های LiteRT مورد نیاز است. اسکریپت ./configure را در دایرکتوری root TensorFlow Checkout اجرا کنید و زمانی که اسکریپت خواستار پیکربندی تعاملی ./WORKSPACE برای بیلدهای Android شد، به "بله" پاسخ دهید. اسکریپت سعی خواهد کرد تنظیمات را با استفاده از متغیرهای محیطی زیر پیکربندی کند:

  • ANDROID_SDK_HOME
  • ANDROID_SDK_API_LEVEL
  • ANDROID_NDK_HOME
  • ANDROID_NDK_API_LEVEL

اگر این متغیرها تنظیم نشده باشند، باید به صورت تعاملی در اعلان اسکریپت ارائه شوند. پیکربندی موفقیت آمیز باید ورودی هایی مشابه موارد زیر در فایل .tf_configure.bazelrc در پوشه ریشه داشته باشد:

build --action_env ANDROID_NDK_HOME="/usr/local/android/android-ndk-r25b"
build --action_env ANDROID_NDK_API_LEVEL="21"
build --action_env ANDROID_BUILD_TOOLS_VERSION="30.0.3"
build --action_env ANDROID_SDK_API_LEVEL="30"
build --action_env ANDROID_SDK_HOME="/usr/local/android/android-sdk-linux"

ساخت و نصب کنید

هنگامی که Bazel به درستی پیکربندی شد، می‌توانید LiteRT AAR را از دایرکتوری root checkout به صورت زیر بسازید:

bazel build -c opt --cxxopt=--std=c++17 --config=android_arm64 \
  --fat_apk_cpu=x86,x86_64,arm64-v8a,armeabi-v7a \
  --define=android_dexmerger_tool=d8_dexmerger \
  --define=android_incremental_dexing_tool=d8_dexbuilder \
  //tensorflow/lite/java:tensorflow-lite

این یک فایل AAR در bazel-bin/tensorflow/lite/java/ ایجاد می کند. توجه داشته باشید که این یک AAR "چاق" با چندین معماری مختلف ایجاد می کند. اگر به همه آنها نیاز ندارید، از زیر مجموعه مناسب برای محیط استقرار خود استفاده کنید.

می‌توانید فایل‌های AAR کوچک‌تری بسازید که فقط مجموعه‌ای از مدل‌ها را هدف قرار می‌دهند به شرح زیر:

bash tensorflow/lite/tools/build_aar.sh \
  --input_models=model1,model2 \
  --target_archs=x86,x86_64,arm64-v8a,armeabi-v7a

اسکریپت بالا فایل tensorflow-lite.aar و به صورت اختیاری فایل tensorflow-lite-select-tf-ops.aar تولید می کند اگر یکی از مدل ها از Tensorflow ops استفاده می کند. برای جزئیات بیشتر، لطفاً به بخش کاهش اندازه باینری LiteRT مراجعه کنید.

AAR را مستقیماً به پروژه اضافه کنید

فایل tensorflow-lite.aar را به دایرکتوری به نام libs در پروژه خود منتقل کنید. فایل build.gradle برنامه خود را برای ارجاع به دایرکتوری جدید تغییر دهید و وابستگی LiteRT موجود را با کتابخانه محلی جدید جایگزین کنید، به عنوان مثال:

allprojects {
    repositories {
        mavenCentral()
        maven {  // Only for snapshot artifacts
            name 'ossrh-snapshot'
            url 'https://oss.sonatype.org/content/repositories/snapshots'
        }
        flatDir {
            dirs 'libs'
        }
    }
}

dependencies {
    compile(name:'tensorflow-lite', ext:'aar')
}

AAR را در مخزن محلی Maven نصب کنید

دستور زیر را از دایرکتوری root checkout خود اجرا کنید:

mvn install:install-file \
  -Dfile=bazel-bin/tensorflow/lite/java/tensorflow-lite.aar \
  -DgroupId=org.tensorflow \
  -DartifactId=tensorflow-lite -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'
}

توجه داشته باشید که نسخه 0.1.100 در اینجا صرفاً برای آزمایش / توسعه است. با نصب AAR محلی، می توانید از API های استنتاج جاوا LiteRT استاندارد در کد برنامه خود استفاده کنید.