Layanan Akselerasi untuk Android (Beta)

Penggunaan prosesor khusus seperti GPU, NPU, atau DSP untuk perangkat keras akselerasi dapat meningkatkan performa inferensi secara signifikan (hingga 10x lebih cepat inferensi dalam beberapa kasus) dan pengalaman pengguna aplikasi Android berkemampuan ML aplikasi. Namun, mengingat keragaman perangkat keras dan {i>driver<i} yang mungkin miliki, memilih konfigurasi akselerasi perangkat keras yang optimal untuk setiap perangkat Anda bukanlah hal yang mudah. Selain itu, mengaktifkan konfigurasi yang salah pada dapat menyebabkan pengalaman pengguna yang buruk karena latensi yang tinggi atau, dalam beberapa kasus, kesalahan {i>runtime<i}, atau masalah akurasi yang disebabkan oleh inkompatibilitas perangkat keras.

Acceleration Service for Android adalah API yang membantu Anda memilih konfigurasi akselerasi perangkat keras yang optimal untuk perangkat pengguna tertentu dan model .tflite, sekaligus meminimalkan risiko error runtime atau masalah akurasi.

Acceleration Service mengevaluasi berbagai konfigurasi akselerasi pada pengguna perangkat dengan menjalankan tolok ukur inferensi internal dengan LiteRT Anda model transformer. Pengujian ini biasanya selesai dalam beberapa detik, bergantung pada model transformer. Anda dapat menjalankan benchmark sekali pada setiap perangkat pengguna sebelum inferensi waktu, meng-cache hasilnya, dan menggunakannya selama inferensi. {i>Benchmark<i} ini dijalankan di luar proses; yang meminimalkan risiko error pada aplikasi Anda.

Berikan model Anda, sampel data, dan hasil yang diharapkan, {i>input<i} ("emas" dan output) dan Acceleration Service akan menjalankan inferensi TFLite internal untuk memberi Anda rekomendasi hardware.

gambar

Acceleration Service adalah bagian dari stack ML kustom Android dan berfungsi dengan LiteRT di layanan Google Play.

Menambahkan dependensi ke project

Tambahkan dependensi berikut ke file build.gradle aplikasi Anda:

implementation  "com.google.android.gms:play-services-tflite-
acceleration-service:16.0.0-beta01"

Acceleration Service API berfungsi dengan LiteRT di Google Play Layanan. Jika Anda belum menggunakan runtime LiteRT yang disediakan melalui Layanan Play, harus memperbarui dependencies Anda.

Cara menggunakan Acceleration Service API

Untuk menggunakan Acceleration Service, mulai dengan membuat konfigurasi akselerasi yang ingin Anda evaluasi untuk modelnya (mis.GPU dengan OpenGL). Kemudian buat konfigurasi validasi dengan model, beberapa data sampel, dan model output model. Terakhir, panggil validateConfig() dalam meneruskan konfigurasi akselerasi, dan konfigurasi validasi.

gambar

Membuat konfigurasi akselerasi

Konfigurasi akselerasi adalah representasi dari konfigurasi hardware yang diterjemahkan menjadi delegasi selama waktu eksekusi. Acceleration Service kemudian akan menggunakan konfigurasi ini secara internal melakukan inferensi pengujian.

Saat ini, layanan akselerasi memungkinkan Anda mengevaluasi konfigurasi (dikonversi ke delegasi GPU selama waktu eksekusi) dengan GpuAccelerationConfig dan inferensi CPU (dengan CpuAccelerationConfig). Kami berupaya untuk mendukung lebih banyak delegasi guna mengakses perangkat keras lain di masa depan.

Konfigurasi akselerasi GPU

Buat konfigurasi akselerasi GPU sebagai berikut:

AccelerationConfig accelerationConfig = new GpuAccelerationConfig.Builder()
  .setEnableQuantizedInference(false)
  .build();

Anda harus menentukan apakah model Anda menggunakan kuantisasi dengan setEnableQuantizedInference()

Konfigurasi akselerasi CPU

Buat akselerasi CPU sebagai berikut:

AccelerationConfig accelerationConfig = new CpuAccelerationConfig.Builder()
  .setNumThreads(2)
  .build();

Gunakan setNumThreads() untuk menentukan jumlah thread yang ingin Anda gunakan untuk mengevaluasi CPU inferensi.

Membuat konfigurasi validasi

Konfigurasi validasi memungkinkan Anda menentukan cara Akselerasi yang diinginkan Layanan untuk mengevaluasi inferensi. Anda akan menggunakannya untuk meneruskan:

  • sampel input,
  • {i>output<i} yang diharapkan,
  • logika validasi akurasi.

Pastikan untuk memberikan sampel input yang performanya menurut Anda bagus model Anda (juga dikenal sebagai sampel "emas").

Buat ValidationConfig dengan CustomValidationConfig.Builder sebagai berikut:

ValidationConfig validationConfig = new CustomValidationConfig.Builder()
   .setBatchSize(5)
   .setGoldenInputs(inputs)
   .setGoldenOutputs(outputBuffer)
   .setAccuracyValidator(new MyCustomAccuracyValidator())
   .build();

Tentukan jumlah sampel emas setBatchSize() Teruskan input sampel emas Anda menggunakan setGoldenInputs() Berikan output yang diharapkan untuk input yang diteruskan dengan setGoldenOutputs()

Anda dapat menentukan waktu inferensi maksimum dengan setInferenceTimeoutMillis() (5.000 md secara default). Jika inferensi memakan waktu lebih lama dari waktu yang Anda tentukan, konfigurasi akan ditolak.

Jika ingin, Anda juga dapat membuat AccuracyValidator kustom sebagai berikut:

class MyCustomAccuracyValidator implements AccuracyValidator {
   boolean validate(
      BenchmarkResult benchmarkResult,
      ByteBuffer[] goldenOutput) {
        for (int i = 0; i < benchmarkResult.actualOutput().size(); i++) {
            if (!goldenOutputs[i]
               .equals(benchmarkResult.actualOutput().get(i).getValue())) {
               return false;
            }
         }
         return true;

   }
}

Pastikan untuk menentukan logika validasi yang sesuai untuk kasus penggunaan Anda.

Perhatikan bahwa jika data validasi sudah disematkan dalam model, Anda bisa menggunakan EmbeddedValidationConfig

Membuat output validasi

Output emas bersifat opsional dan selama Anda memberikan input emas, Acceleration Service dapat menghasilkan output emas secara internal. Anda juga dapat menentukan konfigurasi akselerasi yang digunakan untuk menghasilkan {i>output<i} emas ini dengan memanggil setGoldenConfig():

ValidationConfig validationConfig = new CustomValidationConfig.Builder()
   .setBatchSize(5)
   .setGoldenInputs(inputs)
   .setGoldenConfig(customCpuAccelerationConfig)
   [...]
   .build();

Memvalidasi konfigurasi Akselerasi

Setelah membuat konfigurasi akselerasi dan konfigurasi validasi, Anda dapat mengevaluasinya untuk model Anda.

Memastikan LiteRT dengan runtime Layanan Play berjalan dengan benar diinisialisasi dan bahwa delegasi GPU tersedia untuk perangkat dengan menjalankan:

TfLiteGpu.isGpuDelegateAvailable(context)
   .onSuccessTask(gpuAvailable -> TfLite.initialize(context,
      TfLiteInitializationOptions.builder()
        .setEnableGpuDelegateSupport(gpuAvailable)
        .build()
      )
   );

Membuat instance AccelerationService dengan memanggil AccelerationService.create().

Kemudian, Anda bisa memvalidasi konfigurasi akselerasi untuk model Anda dengan memanggil validateConfig():

InterpreterApi interpreter;
InterpreterOptions interpreterOptions = InterpreterApi.Options();
AccelerationService.create(context)
   .validateConfig(model, accelerationConfig, validationConfig)
   .addOnSuccessListener(validatedConfig -> {
      if (validatedConfig.isValid() && validatedConfig.benchmarkResult().hasPassedAccuracyTest()) {
         interpreterOptions.setAccelerationConfig(validatedConfig);
         interpreter = InterpreterApi.create(model, interpreterOptions);
});

Anda juga bisa memvalidasi beberapa konfigurasi dengan memanggil validateConfigs() dan meneruskan objek Iterable<AccelerationConfig> sebagai parameter.

validateConfig()akan menampilkan Task<ValidatedAccelerationConfigResult> dari layanan Google Play Task Api yang memungkinkan dan asinkron.
Untuk mendapatkan hasil dari panggilan validasi, tambahkan addOnSuccessListener() .

Gunakan konfigurasi yang divalidasi di penerjemah Anda

Setelah memeriksa apakah ValidatedAccelerationConfigResult ditampilkan di Jika callback ini valid, Anda dapat menetapkan konfigurasi yang divalidasi sebagai konfigurasi akselerasi untuk penerjemah Anda yang memanggil interpreterOptions.setAccelerationConfig().

Penyimpanan cache konfigurasi

Konfigurasi akselerasi optimal untuk model Anda kemungkinan tidak akan berubah pada perangkat. Jadi setelah Anda menerima konfigurasi akselerasi yang memuaskan, Anda harus menyimpannya di perangkat dan membiarkan aplikasi Anda mengambilnya dan menggunakannya untuk membuat InterpreterOptions Anda selama sesi berikut, bukan menjalankan validasi yang lain. Metode serialize() dan deserialize() di ValidatedAccelerationConfigResult membuat proses penyimpanan dan pengambilan semuanya.

Contoh aplikasi

Untuk meninjau integrasi in-situ dari Layanan Akselerasi, lihat aplikasi contoh.

Batasan

Layanan Akselerasi memiliki batasan berikut saat ini:

  • Hanya konfigurasi akselerasi CPU dan GPU yang didukung saat ini.
  • Alat ini hanya mendukung LiteRT di layanan Google Play dan Anda tidak dapat gunakan jika Anda menggunakan paket LiteRT.
  • Acceleration Service SDK hanya mendukung API level 22 dan yang lebih tinggi.

Peringatan

Harap tinjau peringatan berikut dengan cermat, terutama jika Anda sedang merencanakan untuk menggunakan SDK ini dalam produksi:

  • Sebelum keluar dari Beta dan merilis versi stabil untuk Acceleration Service API, kami akan menerbitkan SDK baru yang mungkin memiliki beberapa berbeda dengan versi Beta saat ini. Untuk terus menggunakan Layanan Akselerasi, Anda harus bermigrasi ke SDK baru ini dan mengirimkan mengupdate aplikasi Anda pada waktu yang tepat. Jika tidak dilakukan dapat menyebabkan kerusakan SDK Beta mungkin tidak lagi kompatibel dengan layanan Google Play setelah beberapa saat.

  • Tidak ada jaminan bahwa fitur tertentu dalam Akselerasi API Layanan atau API secara keseluruhan akan tersedia secara umum. Ini dapat tetap dalam versi Beta tanpa batas waktu, akan dimatikan, atau digabungkan dengan fitur ke dalam paket yang didesain untuk audiens developer tertentu. Agak besar di Acceleration Service API atau seluruh API itu sendiri akhirnya akan tersedia secara umum, tetapi tidak ada jadwal tetap untuk ini.

Persyaratan dan privasi

Persyaratan Layanan

Penggunaan Acceleration Service API tunduk pada Persyaratan Layanan Google API Layanan.
Selain itu, Acceleration Service API saat ini masih dalam versi beta sehingga dengan menggunakannya, Anda memahami potensi masalah yang diuraikan dalam Peringatan di atas dan mengonfirmasi bahwa Layanan Akselerasi mungkin tidak selalu berjalan seperti yang ditentukan.

Privasi

Saat Anda menggunakan Acceleration Service API, pemrosesan data input (mis. gambar, video, teks) sepenuhnya terjadi di perangkat, dan Service Acceleration Service tidak akan mengirim data tersebut ke server Google. Oleh karena itu, Anda dapat menggunakan API kami untuk memproses data input yang seharusnya berada di luar perangkat.
Acceleration Service API dapat menghubungi server Google dari waktu ke waktu di untuk menerima hal seperti perbaikan bug, model yang diperbarui, dan akselerator hardware informasi kompatibilitas. Acceleration Service API juga mengirim metrik tentang performa dan penggunaan API di aplikasi Anda untuk Google. Google menggunakan data metrik ini untuk mengukur performa, men-debug, memelihara, dan meningkatkan API, dan mendeteksi penyalahgunaan atau penyalahgunaan, sebagaimana dijelaskan lebih lanjut dalam artikel Privasi Kebijakan kami.
Anda bertanggung jawab untuk memberi tahu pengguna aplikasi Anda tentang pemrosesan Google data metrik Acceleration Service sebagaimana diwajibkan oleh hukum yang berlaku.
Data yang kami kumpulkan meliputi:

  • Informasi perangkat (seperti produsen, model, versi OS, dan build) serta akselerator hardware ML yang tersedia (GPU dan DSP). Digunakan untuk diagnostik dan analisis penggunaan Anda.
  • Informasi aplikasi (nama paket / ID paket, versi aplikasi). Digunakan untuk diagnostik dan analisis penggunaan.
  • Konfigurasi API (seperti format dan resolusi gambar). Digunakan untuk diagnostik dan analisis penggunaan.
  • Jenis peristiwa (seperti inisialisasi, model download, update, jalankan, deteksi). Digunakan untuk diagnostik dan analisis penggunaan.
  • Kode error. Digunakan untuk diagnostik.
  • Metrik performa. Digunakan untuk diagnostik.
  • ID per penginstalan yang tidak mengidentifikasi pengguna atau perangkat fisik. Digunakan untuk pengoperasian konfigurasi dan penggunaan jarak jauh Analytics.
  • Alamat IP pengirim permintaan jaringan. Digunakan untuk konfigurasi jarak jauh diagnostik. Alamat IP yang dikumpulkan akan dipertahankan untuk sementara.

Dukungan dan masukan

Anda dapat memberikan masukan dan mendapatkan dukungan melalui TensorFlow Issue Tracker. Laporkan masalah dan permintaan dukungan menggunakan template masalah untuk LiteRT di layanan Google Play.