Delegasi TensorFlow Lite

Perkenalan

Delegasi mengaktifkan akselerasi hardware model TensorFlow Lite dengan memanfaatkan akselerator pada perangkat seperti GPU dan Digital Signal Processor (DSP) .

Secara default, TensorFlow Lite menggunakan kernel CPU yang dioptimalkan untuk set instruksi ARM Neon . Namun, CPU adalah prosesor multiguna yang belum tentu dioptimalkan untuk aritmatika berat yang biasanya ditemukan dalam model Machine Learning (misalnya, matematika matriks yang terlibat dalam konvolusi dan lapisan padat).

Di sisi lain, sebagian besar ponsel modern dilengkapi chip yang lebih baik dalam menangani operasi berat ini. Memanfaatkannya untuk operasi jaringan saraf memberikan manfaat besar dalam hal latensi dan efisiensi daya. Misalnya, GPU dapat memberikan kecepatan latensi hingga 5x , sedangkan Qualcomm® Hexagon DSP telah terbukti mengurangi konsumsi daya hingga 75% dalam eksperimen kami.

Masing-masing akselerator ini memiliki API terkait yang memungkinkan komputasi khusus, seperti OpenCL atau OpenGL ES untuk GPU seluler dan Qualcomm® Hexagon SDK untuk DSP. Biasanya, Anda harus menulis banyak kode khusus untuk menjalankan jaringan saraf melalui antarmuka ini. Segalanya menjadi lebih rumit ketika Anda menganggap bahwa setiap akselerator memiliki pro & kontra dan tidak dapat menjalankan setiap operasi dalam jaringan saraf. Delegate API TensorFlow Lite memecahkan masalah ini dengan bertindak sebagai jembatan antara runtime TFLite dan API tingkat rendah ini.

runtime dengan delegasi

Memilih Delegasi

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

Delegasi berdasarkan Platform

Lintas platform (Android & iOS)

  • Delegasi GPU - Delegasi GPU dapat digunakan di Android dan iOS. Ini dioptimalkan untuk menjalankan model berbasis float 32-bit dan 16-bit di mana GPU tersedia. Ini juga mendukung model terkuantisasi 8-bit dan memberikan kinerja GPU yang setara dengan versi floatnya. Untuk mengetahui detail tentang delegasi GPU, lihat TensorFlow Lite di GPU . Untuk tutorial langkah demi langkah tentang penggunaan delegasi GPU dengan Android dan iOS, lihat Tutorial Delegasi GPU TensorFlow Lite .

Android

  • Delegasi NNAPI untuk perangkat Android yang lebih baru - Delegasi NNAPI dapat digunakan untuk mempercepat model pada perangkat Android dengan GPU, DSP, dan/atau NPU tersedia. Ini tersedia di Android 8.1 (API 27+) atau lebih tinggi. Untuk ringkasan delegasi NNAPI, petunjuk langkah demi langkah, dan praktik terbaik, lihat Delegasi NNAPI TensorFlow Lite .
  • Delegasi Hexagon untuk perangkat Android lama - Delegasi Hexagon dapat digunakan untuk mempercepat model pada perangkat Android dengan Qualcomm Hexagon DSP. Ini dapat digunakan pada perangkat yang menjalankan Android versi lama yang tidak mendukung NNAPI. Lihat delegasi TensorFlow Lite Hexagon untuk detail selengkapnya.

iOS

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

Delegasi berdasarkan tipe model

Setiap akselerator dirancang dengan mempertimbangkan lebar bit data tertentu. Jika Anda memberikan model floating-point kepada delegasi yang hanya mendukung operasi terkuantisasi 8-bit (seperti delegasi Hexagon ), semua operasinya akan ditolak dan model akan berjalan sepenuhnya di CPU. Untuk menghindari kejutan seperti itu, tabel di bawah ini memberikan gambaran umum tentang dukungan delegasi berdasarkan jenis model:

Tipe model GPU NNAPI Segi enam intiML
Titik mengambang (32 bit) Ya Ya TIDAK Ya
Kuantisasi float16 pasca pelatihan Ya TIDAK TIDAK Ya
Kuantisasi rentang dinamis pasca pelatihan Ya Ya TIDAK TIDAK
Kuantisasi bilangan bulat pasca pelatihan Ya Ya Ya TIDAK
Pelatihan sadar kuantisasi Ya Ya Ya TIDAK

Memvalidasi kinerja

Informasi di bagian ini bertindak sebagai pedoman kasar untuk memilih delegasi yang dapat meningkatkan lamaran Anda. Namun, penting untuk dicatat bahwa setiap delegasi memiliki serangkaian operasi yang telah ditentukan sebelumnya yang didukungnya, dan mungkin melakukan hal yang berbeda tergantung pada model dan perangkat; misalnya, delegasi NNAPI dapat memilih untuk menggunakan Edge-TPU Google di ponsel Pixel sambil menggunakan DSP di perangkat lain. Oleh karena itu, biasanya disarankan agar Anda melakukan beberapa tolok ukur untuk mengukur seberapa berguna seorang delegasi untuk kebutuhan Anda. Hal ini juga membantu membenarkan peningkatan ukuran biner yang terkait dengan melampirkan delegasi ke runtime TensorFlow Lite.

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

Alat untuk Evaluasi

Latensi & jejak memori

Alat benchmark 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 banyak tanda 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 terperinci .

Berikut ini 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 mengunduh versi bawaan alat ini untuk Android, arsitektur ARM 64-bit di sini ( detail lebih lanjut ).

Akurasi & kebenaran

Delegasi biasanya melakukan komputasi dengan presisi yang berbeda dibandingkan rekan CPU mereka. Akibatnya, terdapat tradeoff akurasi (biasanya kecil) yang terkait dengan penggunaan delegasi untuk akselerasi perangkat keras. Perlu diingat bahwa hal ini tidak selalu benar; misalnya, karena GPU menggunakan presisi floating-point untuk menjalankan model terkuantisasi, mungkin ada sedikit peningkatan presisi (misalnya, <1% peningkatan Top-5 dalam klasifikasi gambar ILSVRC).

TensorFlow Lite memiliki dua jenis alat untuk mengukur seberapa akurat perilaku delegasi untuk model tertentu: Task-Based dan Task-Agnostic . Semua alat yang dijelaskan di bagian ini mendukung parameter delegasi lanjutan yang digunakan oleh alat pembandingan dari bagian sebelumnya. Perhatikan bahwa sub-bagian di bawah fokus pada evaluasi delegasi (Apakah delegasi mempunyai kinerja yang sama seperti CPU?) daripada evaluasi model (Apakah model itu sendiri baik untuk tugas tersebut?).

Evaluasi Berbasis Tugas

TensorFlow Lite memiliki alat untuk mengevaluasi kebenaran 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 NNAPI menggunakan Edge-TPU Google pada 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_nnapi=true \
  --nnapi_accelerator_name=google-edgetpu

Keluaran 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 yang tidak memiliki alat evaluasi pada perangkat, atau jika Anda bereksperimen dengan model khusus, TensorFlow Lite memiliki alat Inference Diff . (Android, biner arsitektur biner ARM 64-bit di sini )

Inference Diff membandingkan eksekusi TensorFlow Lite (dalam hal latensi & deviasi nilai keluaran) dalam dua setelan:

  • Inferensi CPU berulir tunggal
  • Inferensi Buatan Pengguna - ditentukan oleh parameter ini

Untuk melakukannya, alat ini menghasilkan data Gaussian acak dan meneruskannya melalui dua Penerjemah TFLite - satu menjalankan kernel CPU single-threaded, dan yang lainnya diparameterisasi oleh argumen pengguna.

Ini mengukur latensi keduanya, serta perbedaan absolut antara tensor keluaran dari masing-masing Interpreter, berdasarkan per elemen.

Untuk model dengan tensor keluaran tunggal, keluarannya 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 keluaran pada indeks 0 , elemen dari keluaran CPU berbeda dari keluaran delegasi dengan rata-rata 1.96e-05 .

Perhatikan bahwa menafsirkan angka-angka ini memerlukan pengetahuan yang lebih dalam tentang model, dan arti dari setiap tensor keluaran. Jika ini merupakan regresi sederhana yang menentukan semacam skor atau penyematan, perbedaannya harus rendah (jika tidak, ini merupakan kesalahan delegasi). Namun, keluaran seperti 'kelas deteksi' dari model SSD sedikit lebih sulit untuk diinterpretasikan. Misalnya, ini mungkin menunjukkan perbedaan menggunakan alat ini, tapi itu mungkin tidak berarti ada sesuatu yang salah dengan delegasi: pertimbangkan dua kelas (palsu): "TV (ID: 10)", "Monitor (ID:20)" - Jika jika seorang delegasi sedikit melenceng dari kenyataan sebenarnya dan menampilkan monitor alih-alih TV, perbedaan keluaran untuk tensor ini mungkin mencapai 20-10 = 10.