Bantuan melindungi Great Barrier Reef dengan TensorFlow pada Kaggle Bergabung Tantangan

Delegasi TensorFlow Lite NNAPI

Android Neural Networks API (NNAPI) tersedia di semua perangkat Android yang menjalankan Android 8.1 (API level 27) atau lebih tinggi. Ini memberikan akselerasi untuk model TensorFlow Lite di perangkat Android dengan akselerator hardware yang didukung termasuk:

  • Unit Pemrosesan Grafik (GPU)
  • Prosesor Sinyal Digital (DSP)
  • Unit Pemrosesan Saraf (NPU)

Kinerja akan bervariasi tergantung pada perangkat keras tertentu yang tersedia di perangkat.

Halaman ini menjelaskan cara menggunakan delegasi NNAPI dengan TensorFlow Lite Interpreter di Java dan Kotlin. Untuk Android C API, lihat dokumentasi Android Native Developer Kit .

Mencoba delegasi NNAPI pada model Anda sendiri

Impor Gradle

Delegasi NNAPI adalah bagian dari interpreter Android TensorFlow Lite, rilis 1.14.0 atau yang lebih tinggi. Anda dapat mengimpornya ke proyek Anda dengan menambahkan yang berikut ini ke file gradle modul Anda:

dependencies {
   implementation 'org.tensorflow:tensorflow-lite:2.0.0'
}

Menginisialisasi delegasi NNAPI

Tambahkan kode untuk menginisialisasi delegasi NNAPI sebelum Anda menginisialisasi interpreter TensorFlow Lite.

import org.tensorflow.lite.Interpreter;
import org.tensorflow.lite.nnapi.NnApiDelegate;

Interpreter.Options options = (new Interpreter.Options());
NnApiDelegate nnApiDelegate = null;
// Initialize interpreter with NNAPI delegate for Android Pie or above
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
    nnApiDelegate = new NnApiDelegate();
    options.addDelegate(nnApiDelegate);
}

// Initialize TFLite interpreter
try {
    tfLite = new Interpreter(loadModelFile(assetManager, modelFilename), options);
} catch (Exception e) {
    throw new RuntimeException(e);
}

// Run inference
// ...

// Unload delegate
tfLite.close();
if(null != nnApiDelegate) {
    nnApiDelegate.close();
}

Praktik terbaik

Uji kinerja sebelum menerapkan

Kinerja waktu proses dapat sangat bervariasi karena arsitektur model, ukuran, operasi, ketersediaan perangkat keras, dan pemanfaatan perangkat keras waktu proses. Misalnya, jika sebuah aplikasi banyak menggunakan GPU untuk rendering, akselerasi NNAPI mungkin tidak meningkatkan performa karena pertentangan resource. Kami merekomendasikan menjalankan tes kinerja sederhana menggunakan debug logger untuk mengukur waktu inferensi. Jalankan pengujian pada beberapa ponsel dengan chipset berbeda (pabrikan atau model dari pabrikan yang sama) yang mewakili basis pengguna Anda sebelum mengaktifkan NNAPI dalam produksi.

Untuk developer tingkat lanjut, TensorFlow Lite juga menawarkan fitur benchmark model untuk Android .

Buat daftar pengecualian perangkat

Dalam produksi, mungkin ada kasus di mana NNAPI tidak bekerja seperti yang diharapkan. Kami menyarankan pengembang mempertahankan daftar perangkat yang tidak boleh menggunakan akselerasi NNAPI dalam kombinasi dengan model tertentu. Anda dapat membuat daftar ini berdasarkan nilai "ro.board.platform" , yang dapat Anda ambil menggunakan cuplikan kode berikut:

String boardPlatform = "";

try {
    Process sysProcess =
        new ProcessBuilder("/system/bin/getprop", "ro.board.platform").
        redirectErrorStream(true).start();

    BufferedReader reader = new BufferedReader
        (new InputStreamReader(sysProcess.getInputStream()));
    String currentLine = null;

    while ((currentLine=reader.readLine()) != null){
        boardPlatform = line;
    }
    sysProcess.destroy();
} catch (IOException e) {}

Log.d("Board Platform", boardPlatform);

Untuk pengembang tingkat lanjut, pertimbangkan untuk mempertahankan daftar ini melalui sistem konfigurasi jarak jauh. Tim TensorFlow secara aktif mencari cara untuk menyederhanakan dan mengotomatiskan penemuan dan penerapan konfigurasi NNAPI yang optimal.

Kuantisasi

Kuantisasi mengurangi ukuran model dengan menggunakan integer 8-bit atau float 16-bit, bukan float 32-bit untuk komputasi. Ukuran model integer 8-bit adalah seperempat dari versi float 32-bit; Pelampung 16-bit berukuran setengah dari ukuran. Kuantisasi dapat meningkatkan kinerja secara signifikan meskipun proses tersebut dapat mengurangi beberapa akurasi model.

Ada beberapa jenis teknik kuantisasi pasca-pelatihan yang tersedia, tetapi untuk dukungan dan akselerasi maksimum pada perangkat keras saat ini, kami merekomendasikan kuantisasi bilangan bulat penuh . Pendekatan ini mengubah bobot dan operasi menjadi bilangan bulat. Proses kuantisasi ini membutuhkan kumpulan data yang representatif untuk bekerja.

Gunakan model dan operasi yang didukung

Jika delegasi NNAPI tidak mendukung beberapa ops atau kombinasi parameter dalam model, framework hanya menjalankan bagian grafik yang didukung pada akselerator. Sisanya berjalan pada CPU, yang menghasilkan eksekusi terpisah. Karena tingginya biaya sinkronisasi CPU / akselerator, ini dapat mengakibatkan kinerja yang lebih lambat daripada menjalankan seluruh jaringan hanya dengan CPU.

NNAPI bekerja paling baik jika model hanya menggunakan operasi yang didukung . Model berikut diketahui kompatibel dengan NNAPI:

Akselerasi NNAPI juga tidak didukung jika model berisi keluaran berukuran dinamis. Dalam hal ini, Anda akan mendapatkan peringatan seperti:

ERROR: Attempting to use a delegate that only supports static-sized tensors \
with a graph that has dynamic-sized tensors.

Aktifkan implementasi CPU NNAPI

Grafik yang tidak dapat diproses sepenuhnya oleh akselerator dapat kembali ke implementasi CPU NNAPI. Namun, karena performanya lebih rendah daripada interpreter TensorFlow, opsi ini dinonaktifkan secara default di delegasi NNAPI untuk Android 10 (API Level 29) atau yang lebih baru. Untuk mengganti perilaku ini, setel setUseNnapiCpu ke true di objek NnApiDelegate.Options .