Layanan Akselerasi untuk Android (Beta)

Penggunaan prosesor khusus seperti GPU, NPU, atau DSP untuk akselerasi perangkat keras dapat meningkatkan kinerja inferensi secara signifikan (dalam beberapa kasus, inferensi hingga 10x lebih cepat) dan pengalaman pengguna aplikasi Android Anda yang mendukung ML. Namun, mengingat beragamnya perangkat keras dan driver yang mungkin dimiliki pengguna Anda, memilih konfigurasi akselerasi perangkat keras yang optimal untuk setiap perangkat pengguna dapat menjadi suatu tantangan. Selain itu, mengaktifkan konfigurasi yang salah pada perangkat dapat menciptakan pengalaman pengguna yang buruk karena latensi yang tinggi atau, dalam beberapa kasus yang jarang terjadi, kesalahan runtime atau masalah akurasi yang disebabkan oleh ketidakcocokan perangkat keras.

Layanan Akselerasi untuk Android adalah API yang membantu Anda memilih konfigurasi akselerasi perangkat keras yang optimal untuk perangkat pengguna tertentu dan model .tflite Anda, sekaligus meminimalkan risiko kesalahan runtime atau masalah akurasi.

Layanan Akselerasi mengevaluasi berbagai konfigurasi akselerasi pada perangkat pengguna dengan menjalankan benchmark inferensi internal menggunakan model TensorFlow Lite Anda. Uji coba ini biasanya selesai dalam beberapa detik, bergantung pada model Anda. Anda dapat menjalankan tolok ukur satu kali pada setiap perangkat pengguna sebelum waktu inferensi, menyimpan hasilnya dalam cache, dan menggunakannya selama inferensi. Tolok ukur ini sudah tidak lagi dalam proses; yang meminimalkan risiko kerusakan pada aplikasi Anda.

Berikan model Anda, sampel data, dan hasil yang diharapkan (input dan output "emas") dan Layanan Akselerasi akan menjalankan tolok ukur inferensi TFLite internal untuk memberi Anda rekomendasi perangkat keras.

gambar

Layanan Akselerasi adalah bagian dari tumpukan ML khusus Android dan berfungsi dengan TensorFlow Lite di layanan Google Play .

Tambahkan dependensi ke proyek Anda

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 TensorFlow Lite di Layanan Google Play . Jika Anda belum menggunakan runtime TensorFlow Lite yang disediakan melalui Layanan Play, Anda perlu memperbarui dependensi Anda.

Cara menggunakan API Layanan Akselerasi

Untuk menggunakan Layanan Akselerasi, mulailah dengan membuat konfigurasi akselerasi yang ingin Anda evaluasi untuk model Anda (misalnya GPU dengan OpenGL). Kemudian buat konfigurasi validasi dengan model Anda, beberapa data sampel, dan keluaran model yang diharapkan. Terakhir, panggil validateConfig() untuk meneruskan konfigurasi akselerasi dan konfigurasi validasi Anda.

gambar

Buat konfigurasi akselerasi

Konfigurasi akselerasi adalah representasi konfigurasi perangkat keras yang diterjemahkan ke dalam delegasi selama waktu eksekusi. Layanan Akselerasi kemudian akan menggunakan konfigurasi ini secara internal untuk melakukan inferensi pengujian.

Saat ini layanan akselerasi memungkinkan Anda mengevaluasi konfigurasi GPU (dikonversi menjadi delegasi GPU selama waktu eksekusi) dengan GpuAccelerationConfig dan inferensi CPU (dengan CpuAccelerationConfig ). Kami berupaya mendukung lebih banyak delegasi untuk 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() atau tidak.

Konfigurasi akselerasi CPU

Buat akselerasi CPU sebagai berikut:

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

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

Buat konfigurasi validasi

Konfigurasi validasi memungkinkan Anda menentukan bagaimana Anda ingin Layanan Akselerasi mengevaluasi inferensi. Anda akan menggunakannya untuk lulus:

  • sampel masukan,
  • keluaran yang diharapkan,
  • logika validasi akurasi.

Pastikan untuk memberikan sampel masukan yang menurut Anda memiliki performa bagus untuk 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 dengan setBatchSize() . Teruskan masukan sampel emas Anda menggunakan setGoldenInputs() . Berikan keluaran yang diharapkan untuk masukan yang diteruskan dengan setGoldenOutputs() .

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

Secara opsional, Anda juga dapat membuat AccuracyValidator khusus 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 tertanam dalam model Anda, Anda dapat menggunakan EmbeddedValidationConfig .

Hasilkan keluaran validasi

Keluaran emas bersifat opsional dan selama Anda memberikan masukan emas, Layanan Akselerasi dapat menghasilkan keluaran emas secara internal. Anda juga dapat menentukan konfigurasi akselerasi yang digunakan untuk menghasilkan keluaran emas ini dengan memanggil setGoldenConfig() :

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

Validasi konfigurasi Akselerasi

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

Pastikan runtime TensorFlow Lite dengan Layanan Play diinisialisasi dengan benar dan delegasi GPU tersedia untuk perangkat dengan menjalankan:

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

Buat instance AccelerationService dengan memanggil AccelerationService.create() .

Anda kemudian dapat 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 dapat memvalidasi beberapa konfigurasi dengan memanggil validateConfigs() dan meneruskan objek Iterable<AccelerationConfig> sebagai parameter.

validateConfig() akan mengembalikan Task< ValidatedAccelerationConfigResult > dari Api Tugas layanan Google Play yang mengaktifkan tugas asinkron.
Untuk mendapatkan hasil dari panggilan validasi, tambahkan callback addOnSuccessListener() .

Gunakan konfigurasi yang divalidasi di juru bahasa Anda

Setelah memeriksa apakah ValidatedAccelerationConfigResult yang dikembalikan dalam callback valid, Anda dapat menyetel konfigurasi yang divalidasi sebagai konfigurasi akselerasi untuk juru bahasa yang memanggil interpreterOptions.setAccelerationConfig() .

Cache konfigurasi

Konfigurasi akselerasi optimal untuk model Anda kemungkinan besar tidak akan berubah di perangkat. Jadi, setelah Anda menerima konfigurasi akselerasi yang memuaskan, Anda harus menyimpannya di perangkat dan membiarkan aplikasi Anda mengambilnya dan menggunakannya untuk membuat InterpreterOptions selama sesi berikutnya alih-alih menjalankan validasi lain. Metode serialize() dan deserialize() di ValidatedAccelerationConfigResult membuat proses penyimpanan dan pengambilan menjadi lebih mudah.

Contoh aplikasi

Untuk meninjau integrasi Layanan Akselerasi di tempat, lihat contoh aplikasi .

Keterbatasan

Layanan Akselerasi saat ini memiliki batasan berikut:

  • Hanya konfigurasi akselerasi CPU dan GPU yang didukung saat ini,
  • Ini hanya mendukung TensorFlow Lite di layanan Google Play dan Anda tidak dapat menggunakannya jika Anda menggunakan versi paket TensorFlow Lite,
  • Itu tidak mendukung Pustaka Tugas TensorFlow Lite karena Anda tidak dapat langsung menginisialisasi BaseOptions dengan objek ValidatedAccelerationConfigResult .
  • Acceleration Service SDK hanya mendukung API level 22 ke atas.

Peringatan

Harap tinjau peringatan berikut dengan cermat, terutama jika Anda berencana 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 perbedaan dari versi Beta saat ini. Untuk terus menggunakan Layanan Akselerasi, Anda perlu bermigrasi ke SDK baru ini dan mengirimkan pembaruan ke aplikasi Anda tepat waktu. Tidak melakukan hal ini dapat menyebabkan kerusakan karena SDK Beta mungkin tidak lagi kompatibel dengan layanan Google Play setelah beberapa waktu.

  • Tidak ada jaminan bahwa fitur tertentu dalam Acceleration Service API atau API secara keseluruhan akan tersedia secara umum. Ini mungkin tetap dalam versi Beta tanpa batas waktu, dihentikan, atau digabungkan dengan fitur lain ke dalam paket yang dirancang untuk audiens pengembang tertentu. Beberapa fitur dengan Acceleration Service API atau seluruh API itu sendiri pada akhirnya mungkin tersedia secara umum, namun tidak ada jadwal pasti untuk hal ini.

Syarat dan privasi

Ketentuan Layanan

Penggunaan Acceleration Service API tunduk pada Persyaratan Layanan Google API .
Selain itu, API Layanan Akselerasi saat ini masih dalam versi beta dan, oleh karena itu, dengan menggunakannya, Anda mengetahui potensi masalah yang diuraikan di bagian Peringatan di atas dan mengakui bahwa Layanan Akselerasi mungkin tidak selalu berfungsi sebagaimana ditentukan.

Pribadi

Saat Anda menggunakan API Layanan Akselerasi, pemrosesan data masukan (misalnya gambar, video, teks) sepenuhnya dilakukan di perangkat, dan Layanan Akselerasi tidak mengirimkan data tersebut ke server Google . Hasilnya, Anda dapat menggunakan API kami untuk memproses data masukan yang tidak boleh keluar dari perangkat.
API Layanan Akselerasi dapat menghubungi server Google dari waktu ke waktu untuk menerima hal-hal seperti perbaikan bug, model yang diperbarui, dan informasi kompatibilitas akselerator perangkat keras. Acceleration Service API juga mengirimkan metrik tentang performa dan pemanfaatan API di aplikasi Anda ke Google. Google menggunakan data metrik ini untuk mengukur kinerja, melakukan debug, memelihara dan meningkatkan API, serta mendeteksi penyalahgunaan atau penyalahgunaan, sebagaimana dijelaskan lebih lanjut dalam Kebijakan Privasi kami.
Anda bertanggung jawab untuk memberi tahu pengguna aplikasi Anda tentang pemrosesan data metrik Layanan Akselerasi yang dilakukan Google sebagaimana diwajibkan oleh hukum yang berlaku.
Data yang kami kumpulkan mencakup hal-hal berikut:

  • Informasi perangkat (seperti pabrikan, model, versi dan versi OS) dan akselerator perangkat keras ML yang tersedia (GPU dan DSP). Digunakan untuk diagnostik dan analisis penggunaan.
  • Informasi aplikasi (nama paket/id bundel, 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, pengunduhan model, pembaruan, pengoperasian, deteksi). Digunakan untuk diagnostik dan analisis penggunaan.
  • Kode kesalahan. Digunakan untuk diagnostik.
  • Metrik kinerja. Digunakan untuk diagnostik.
  • Pengidentifikasi per instalasi yang tidak secara unik mengidentifikasi pengguna atau perangkat fisik. Digunakan untuk pengoperasian konfigurasi jarak jauh dan analisis penggunaan.
  • Alamat IP pengirim permintaan jaringan. Digunakan untuk diagnostik konfigurasi jarak jauh. Alamat IP yang dikumpulkan disimpan sementara.

Dukungan dan umpan balik

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