ایجاد رابط های مدل با استفاده از ابرداده

با استفاده از LiteRT Metadata ، توسعه‌دهندگان می‌توانند کد پوششی (wrapper code) را برای فعال‌سازی ادغام در اندروید تولید کنند. برای اکثر توسعه‌دهندگان، رابط گرافیکی Android Studio ML Model Binding ساده‌ترین رابط کاربری است. اگر به سفارشی‌سازی بیشتری نیاز دارید یا از ابزار خط فرمان استفاده می‌کنید، LiteRT Codegen نیز موجود است.

استفاده از اتصال مدل ML در اندروید استودیو

برای مدل‌های LiteRT که با فراداده‌ها (metadata) تقویت شده‌اند، توسعه‌دهندگان می‌توانند از Android Studio ML Model Binding برای پیکربندی خودکار تنظیمات پروژه و تولید کلاس‌های wrapper بر اساس فراداده‌های مدل استفاده کنند. کد wrapper نیاز به تعامل مستقیم با ByteBuffer را از بین می‌برد. در عوض، توسعه‌دهندگان می‌توانند با مدل LiteRT با اشیاء تایپ‌شده مانند Bitmap و Rect تعامل داشته باشند.

یک مدل LiteRT را در Android Studio وارد کنید

  1. روی ماژولی که می‌خواهید از مدل TFLite استفاده کنید، کلیک راست کنید یا روی File کلیک کنید، سپس New > Other > LiteRT Model کنید.

  2. محل فایل TFLite خود را انتخاب کنید. توجه داشته باشید که این ابزار، وابستگی ماژول را از طرف شما با اتصال ML Model پیکربندی می‌کند و تمام وابستگی‌ها به طور خودکار در فایل build.gradle ماژول اندروید شما وارد می‌شوند.

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

  3. Finish کلیک کنید.

  4. پس از موفقیت‌آمیز بودن وارد کردن، صفحه زیر ظاهر می‌شود. برای شروع استفاده از مدل، Kotlin یا Java را انتخاب کنید، کد را کپی کرده و در بخش Sample Code قرار دهید. می‌توانید با دوبار کلیک کردن روی مدل TFLite در پوشه ml در اندروید استودیو، به این صفحه بازگردید.

تسریع استنتاج مدل

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

مرحله ۱. فایل build.gradle ماژول را بررسی کنید که شامل وابستگی‌های زیر باشد:

    dependencies {
        ...
        // For the LiteRT GPU delegate, we need
        // 'com.google.ai.edge.litert:litert-gpu' version 1.*.
        implementation 'com.google.ai.edge.litert:litert-gpu:1.4.1'
    }

مرحله ۲. تشخیص اینکه آیا پردازنده گرافیکی در حال اجرا روی دستگاه با TensorFlow GPU delegate سازگار است یا خیر، در غیر این صورت مدل را با استفاده از چندین نخ پردازنده اجرا کنید:

کاتلین

    import org.tensorflow.lite.gpu.CompatibilityList
    import org.tensorflow.lite.gpu.GpuDelegate

    val compatList = CompatibilityList()

    val options = if(compatList.isDelegateSupportedOnThisDevice) {
        // if the device has a supported GPU, add the GPU delegate
        Model.Options.Builder().setDevice(Model.Device.GPU).build()
    } else {
        // if the GPU is not supported, run on 4 threads
        Model.Options.Builder().setNumThreads(4).build()
    }

    // Initialize the model as usual feeding in the options object
    val myModel = MyModel.newInstance(context, options)

    // Run inference per sample code
      

جاوا

    import org.tensorflow.lite.support.model.Model
    import org.tensorflow.lite.gpu.CompatibilityList;
    import org.tensorflow.lite.gpu.GpuDelegate;

    // Initialize interpreter with GPU delegate
    Model.Options options;
    CompatibilityList compatList = CompatibilityList();

    if(compatList.isDelegateSupportedOnThisDevice()){
        // if the device has a supported GPU, add the GPU delegate
        options = Model.Options.Builder().setDevice(Model.Device.GPU).build();
    } else {
        // if the GPU is not supported, run on 4 threads
        options = Model.Options.Builder().setNumThreads(4).build();
    }

    MyModel myModel = new MyModel.newInstance(context, options);

    // Run inference per sample code
      

تولید رابط‌های مدل با مولد کد LiteRT

برای مدل LiteRT که با فراداده بهبود یافته است، توسعه‌دهندگان می‌توانند از مولد کد پوششی اندروید LiteRT برای ایجاد کد پوششی مخصوص پلتفرم استفاده کنند. کد پوششی نیاز به تعامل مستقیم با ByteBuffer را از بین می‌برد. در عوض، توسعه‌دهندگان می‌توانند با مدل TensorFlow Lite با اشیاء تایپ‌شده مانند Bitmap و Rect تعامل داشته باشند.

سودمندی مولد کد به کامل بودن ورودی فراداده مدل LiteRT بستگی دارد. برای مشاهده نحوه تجزیه هر فیلد توسط ابزار کدژن، به بخش <Codegen usage> در زیر فیلدهای مربوطه در metadata_schema.fbs مراجعه کنید.

تولید کد پوششی

شما باید ابزارهای زیر را در ترمینال خود نصب کنید:

pip install tflite-support

پس از تکمیل، می‌توان از مولد کد با استفاده از سینتکس زیر استفاده کرد:

tflite_codegen --model=./model_with_metadata/mobilenet_v1_0.75_160_quantized.tflite \
    --package_name=org.tensorflow.lite.classify \
    --model_class_name=MyClassifierModel \
    --destination=./classify_wrapper

کد حاصل در دایرکتوری مقصد قرار خواهد گرفت. اگر از Google Colab یا محیط ریموت دیگری استفاده می‌کنید، شاید راحت‌تر باشد که نتیجه را در یک فایل زیپ فشرده کنید و آن را در پروژه اندروید استودیو خود دانلود کنید:

# Zip up the generated code
!zip -r classify_wrapper.zip classify_wrapper/

# Download the archive
from google.colab import files
files.download('classify_wrapper.zip')

با استفاده از کد تولید شده

مرحله ۱: کد تولید شده را وارد کنید

در صورت لزوم، کد تولید شده را در یک ساختار دایرکتوری از حالت فشرده خارج کنید. فرض می‌شود ریشه کد تولید شده SRC_ROOT باشد.

پروژه اندروید استودیو را که می‌خواهید از مدل LiteRT در آن استفاده کنید، باز کنید و ماژول تولید شده را از طریق مسیر زیر وارد کنید: و File -> New -> Import Module -> select SRC_ROOT

با استفاده از مثال بالا، دایرکتوری و ماژول وارد شده، classify_wrapper نامیده می‌شوند.

مرحله ۲: فایل build.gradle برنامه را به‌روزرسانی کنید

در ماژول app که ماژول کتابخانه تولید شده را مصرف خواهد کرد:

در بخش اندروید، موارد زیر را اضافه کنید:

aaptOptions {
   noCompress "tflite"
}

در بخش وابستگی‌ها، موارد زیر را اضافه کنید:

implementation project(":classify_wrapper")

مرحله ۳: استفاده از مدل

// 1. Initialize the model
MyClassifierModel myImageClassifier = null;

try {
    myImageClassifier = new MyClassifierModel(this);
} catch (IOException io){
    // Error reading the model
}

if(null != myImageClassifier) {

    // 2. Set the input with a Bitmap called inputBitmap
    MyClassifierModel.Inputs inputs = myImageClassifier.createInputs();
    inputs.loadImage(inputBitmap));

    // 3. Run the model
    MyClassifierModel.Outputs outputs = myImageClassifier.run(inputs);

    // 4. Retrieve the result
    Map<String, Float> labeledProbability = outputs.getProbability();
}

تسریع استنتاج مدل

کد تولید شده راهی را برای توسعه‌دهندگان فراهم می‌کند تا با استفاده از نمایندگان و تعداد نخ‌ها، کد خود را تسریع کنند. این موارد را می‌توان هنگام مقداردهی اولیه شیء مدل تنظیم کرد، زیرا سه پارامتر می‌گیرد:

  • Context : متن از فعالیت یا سرویس اندروید
  • (اختیاری) Device : نماینده شتاب TFLite. برای مثال: GPUDelegate
  • (اختیاری) numThreads : تعداد نخ‌های مورد استفاده برای اجرای مدل - پیش‌فرض یکی است.

برای مثال، برای استفاده از یک نماینده GPU و حداکثر سه نخ، می‌توانید مدل را به این صورت مقداردهی اولیه کنید:

try {
    myImageClassifier = new MyClassifierModel(this, Model.Device.GPU, 3);
} catch (IOException io){
    // Error reading the model
}

عیب‌یابی

اگر با خطای 'java.io.FileNotFoundException: This file can't be opened as a file descriptor; it is probably compressed' مواجه شدید، خطوط زیر را در بخش اندروید ماژول app که از ماژول کتابخانه استفاده می‌کند، وارد کنید:

aaptOptions {
   noCompress "tflite"
}