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

این سند نحوه ساخت کتابخانه اندروید LiteRT را به صورت شخصی شرح می‌دهد. معمولاً نیازی به ساخت محلی کتابخانه اندروید LiteRT ندارید.

از اسنپ‌شات‌های شبانه استفاده کنید

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

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، شما موافقت می‌کنید که شرایط خدمات زیر، استفاده شما از آن را تعیین می‌کند:

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

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

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

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

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

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

حالا باید به بخش پیکربندی فضای کاری و فایل .bazelrc بروید تا تنظیمات ساخت را پیکربندی کنید.

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

راه‌اندازی محیط ساخت بدون داکر

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

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

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

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

این یک مرحله پیکربندی یک‌باره است که برای ساخت کتابخانه‌های LiteRT مورد نیاز است. اسکریپت ./configure را در دایرکتوری پرداخت ریشه TensorFlow اجرا کنید و وقتی اسکریپت از شما می‌خواهد که به صورت تعاملی فایل‌های ./WORKSPACE for 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 را از دایرکتوری پرداخت ریشه به شرح زیر بسازید:

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 استفاده کند، تولید خواهد کرد. برای جزئیات بیشتر، لطفاً به بخش Reduce LiteRT binary size مراجعه کنید.

اضافه کردن مستقیم 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

دستور زیر را از دایرکتوری پرداخت ریشه خود اجرا کنید:

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 در کد برنامه خود استفاده کنید.