Delegasi TensorFlow Lite

Delegasi mengaktifkan akselerasi hardware model TensorFlow Lite dengan memanfaatkan akselerator di perangkat seperti GPU dan Prosesor Sinyal Digital (DSP).

Secara default, TensorFlow Lite menggunakan kernel CPU yang dioptimalkan untuk kumpulan petunjuk ARM Neon. Namun, CPU adalah prosesor multiguna yang tidak harus dioptimalkan untuk aritmetika berat yang biasanya ditemukan dalam model Machine Learning (misalnya, matematika matriks yang terlibat dalam lapisan padat dan konvolusi).

Di sisi lain, sebagian besar ponsel modern memiliki chip yang lebih baik dalam menangani operasi yang berat ini. Pemanfaatannya untuk operasi jaringan neural memberikan manfaat besar dalam hal latensi dan efisiensi daya. Misalnya, GPU dapat memberikan latensi hingga 5x peningkatan.

Masing-masing akselerator ini memiliki API terkait yang memungkinkan komputasi kustom, seperti OpenCL atau OpenGL ES untuk GPU seluler. Biasanya, Anda harus menulis banyak kode kustom untuk menjalankan jaringan neural melalui antarmuka ini. Permasalahan akan semakin rumit jika Anda mempertimbangkan bahwa setiap akselerator memiliki kelebihan & kekurangannya serta tidak dapat menjalankan setiap operasi di jaringan neural. Delegate API TensorFlow Lite mengatasi masalah ini dengan bertindak sebagai jembatan antara runtime TFLite dan API tingkat lebih rendah ini.

runtime dengan delegasi

Memilih Delegasi

TensorFlow Lite mendukung beberapa delegasi, yang masing-masing dioptimalkan untuk platform tertentu dan jenis model tertentu. Biasanya, akan ada beberapa delegasi yang berlaku untuk kasus penggunaan Anda, bergantung pada dua kriteria utama: Platform (Android atau iOS?) yang Anda targetkan, dan Model-type (floating-point atau terkuantisasi?) yang Anda coba percepat.

Delegasi berdasarkan Platform

Lintas platform (Android & iOS)

  • Delegasi GPU - Delegasi GPU dapat digunakan di Android dan iOS. Float ini dioptimalkan untuk menjalankan model berbasis float 32-bit dan 16-bit di mana GPU tersedia. Layanan ini juga mendukung model terkuantisasi 8-bit dan memberikan performa GPU yang setara dengan versi floatnya. Untuk mengetahui detail tentang delegasi GPU, lihat TensorFlow Lite di GPU.

iOS

  • Delegasi Core ML untuk iPhone dan iPad yang lebih baru - Untuk iPhone dan iPad baru yang menyediakan Neural Engine, Anda dapat menggunakan delegasi Core ML guna mempercepat inferensi untuk model floating point 32 bit atau 16 bit. Neural Engine tersedia di perangkat seluler Apple dengan SoC A12 atau yang lebih tinggi. Untuk ringkasan delegasi Core ML dan petunjuk langkah demi langkah, lihat Delegasi ML TensorFlow Lite Core.

Delegasi berdasarkan jenis model

Setiap akselerator dirancang dengan mempertimbangkan lebar bit data tertentu. Jika Anda menyediakan model floating point ke delegasi yang hanya mendukung operasi terkuantisasi 8 bit, model tersebut akan menolak semua operasinya dan model akan berjalan sepenuhnya di CPU. Untuk menghindari hal yang tidak disangka-sangka, tabel di bawah memberikan ringkasan tentang dukungan delegasi berdasarkan jenis model:

Jenis Model GPU CoreML
Floating-point (32 bit) Ya Ya
Kuantisasi float16 pasca-pelatihan Ya Ya
Kuantisasi rentang dinamis pasca-pelatihan Ya Tidak
Kuantisasi bilangan bulat pasca-pelatihan Ya Tidak
Pelatihan berbasis kuantisasi Ya Tidak

Memvalidasi performa

Informasi di bagian ini berfungsi sebagai panduan kasar untuk menyeleksi delegasi yang dapat meningkatkan kualitas aplikasi Anda. Namun, penting untuk diperhatikan bahwa setiap delegasi memiliki kumpulan operasi yang telah ditetapkan yang didukungnya, dan dapat berperforma berbeda bergantung pada model dan perangkat. Oleh karena itu, sebaiknya lakukan benchmark untuk mengukur seberapa berguna delegasi bagi kebutuhan Anda. Hal ini juga membantu menjustifikasi peningkatan ukuran biner yang terkait dengan melampirkan delegasi ke runtime TensorFlow Lite.

TensorFlow Lite memiliki alat evaluasi akurasi dan performa ekstensif yang dapat memberdayakan developer agar percaya diri dalam menggunakan delegasi dalam aplikasi mereka. Alat-alat ini akan dibahas di bagian berikutnya.

Alat untuk Evaluasi

Jejak latensi & memori

Alat tolok ukur TensorFlow Lite dapat digunakan dengan parameter yang sesuai untuk memperkirakan performa model, termasuk latensi inferensi rata-rata, overhead inisialisasi, jejak memori, dll. Alat ini mendukung beberapa flag untuk mengetahui konfigurasi delegasi terbaik untuk model Anda. Misalnya, --gpu_backend=gl dapat ditentukan dengan --use_gpu untuk mengukur eksekusi GPU dengan OpenGL. Daftar lengkap parameter delegasi yang didukung ditentukan dalam dokumentasi mendetail.

Berikut contoh yang dijalankan untuk model terkuantisasi dengan GPU melalui adb:

adb shell /data/local/tmp/benchmark_model \
  --graph=/data/local/tmp/mobilenet_v1_224_quant.tflite \
  --use_gpu=true

Anda dapat mendownload versi bawaan alat ini untuk Android, arsitektur ARM 64-bit di sini (detail selengkapnya).

Akurasi & ketepatan

Delegasi biasanya melakukan komputasi pada presisi yang berbeda dari rekan CPU mereka. Akibatnya, ada kompromi akurasi (biasanya kecil) yang terkait dengan penggunaan delegasi untuk akselerasi hardware. Perlu diperhatikan bahwa ini tidak selalu benar; misalnya, karena GPU menggunakan presisi floating point untuk menjalankan model terkuantisasi, mungkin ada sedikit peningkatan presisi (misalnya, <1% 5 peningkatan teratas dalam klasifikasi gambar ILSVRC).

TensorFlow Lite memiliki dua jenis alat untuk mengukur seberapa akurat delegasi berperilaku untuk model tertentu: Berbasis Tugas dan Task-Agnostic. Semua alat yang dijelaskan di bagian ini mendukung parameter delegasi lanjutan yang digunakan oleh alat tolok ukur dari bagian sebelumnya. Perhatikan bahwa sub-bagian di bawah ini berfokus pada evaluasi delegasi (Apakah delegasi berperforma sama seperti CPU?), bukan evaluasi model (Apakah model itu sendiri bagus untuk tugas tersebut?).

Evaluasi Berbasis Tugas

TensorFlow Lite memiliki alat untuk mengevaluasi ketepatan dua tugas berbasis gambar:

Biner bawaan alat ini (Android, arsitektur ARM 64-bit), beserta dokumentasinya dapat ditemukan di sini:

Contoh di bawah menunjukkan evaluasi klasifikasi gambar dengan GPU di Pixel 4:

adb shell /data/local/tmp/run_eval \
  --model_file=/data/local/tmp/mobilenet_quant_v1_224.tflite \
  --ground_truth_images_path=/data/local/tmp/ilsvrc_images \
  --ground_truth_labels=/data/local/tmp/ilsvrc_validation_labels.txt \
  --model_output_labels=/data/local/tmp/model_output_labels.txt \
  --output_file_path=/data/local/tmp/accuracy_output.txt \
  --num_images=0 # Run on all images. \
  --use_gpu=true

Hasil yang diharapkan adalah daftar metrik Top-K dari 1 hingga 10:

Top-1 Accuracy: 0.733333
Top-2 Accuracy: 0.826667
Top-3 Accuracy: 0.856667
Top-4 Accuracy: 0.87
Top-5 Accuracy: 0.89
Top-6 Accuracy: 0.903333
Top-7 Accuracy: 0.906667
Top-8 Accuracy: 0.913333
Top-9 Accuracy: 0.92
Top-10 Accuracy: 0.923333

Evaluasi Tugas-Agnostik

Untuk tugas-tugas yang tidak tersedia fitur evaluasi di perangkat, atau jika Anda bereksperimen dengan model kustom, TensorFlow Lite memiliki alat Perbedaan Inferensi. (Android, biner arsitektur biner ARM 64-bit di sini)

Perbedaan Inferensi membandingkan eksekusi TensorFlow Lite (dalam hal latensi & penyimpangan nilai output) dalam dua setelan:

  • Inferensi CPU thread tunggal
  • Inferensi yang ditentukan pengguna - ditentukan oleh parameter ini

Untuk melakukannya, alat ini membuat data Gaussian acak dan meneruskannya melalui dua Penafsir TFLite - satu menjalankan kernel CPU thread tunggal, dan yang lainnya diparameterisasi oleh argumen pengguna.

Ini mengukur latensi keduanya, serta perbedaan absolut antara tensor output dari setiap Penerjemah, per elemen.

Untuk model dengan tensor output tunggal, output-nya mungkin terlihat seperti ini:

Num evaluation runs: 50
Reference run latency: avg=84364.2(us), std_dev=12525(us)
Test run latency: avg=7281.64(us), std_dev=2089(us)
OutputDiff[0]: avg_error=1.96277e-05, std_dev=6.95767e-06

Artinya, untuk tensor output pada indeks 0, elemen dari output CPU berbeda dengan output delegasi rata-rata sebesar 1.96e-05.

Perhatikan bahwa menafsirkan angka-angka ini memerlukan pengetahuan model yang lebih mendalam, dan arti yang ditunjukkan oleh setiap tensor output. Jika ini adalah regresi sederhana yang menentukan semacam skor atau penyematan, perbedaannya akan rendah (jika tidak, error pada delegasi). Namun, output seperti 'class deteksi' dari model SSD sedikit lebih sulit ditafsirkan. Misalnya, perbedaan penggunaan alat ini mungkin terlihat tidak benar, tetapi itu mungkin tidak berarti ada masalah dengan delegasi tersebut: pertimbangkan dua class (palsu): "TV (ID: 10)", "Monitor (ID:20)" - Jika delegasi sedikit tidak benar dan menampilkan monitor, bukan TV, perbedaan output untuk tensor ini mungkin setinggi 20-10 = 20-10 =