Delegasi TensorFlow Lite, Delegasi TensorFlow Lite

pengantar

Delegasi mengaktifkan akselerasi perangkat keras model TensorFlow Lite dengan memanfaatkan akselerator di 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 Pembelajaran Mesin (misalnya, matematika matriks yang terlibat dalam konvolusi dan lapisan padat).

Di sisi lain, sebagian besar ponsel modern mengandung 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 hingga 5x dalam latensi, 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. Hal-hal menjadi lebih rumit ketika Anda menganggap bahwa setiap akselerator memiliki pro & kontra dan tidak dapat menjalankan setiap operasi dalam jaringan saraf. Delegate API dari TensorFlow Lite memecahkan masalah ini dengan bertindak sebagai jembatan antara runtime TFLite dan API level yang lebih rendah ini.

runtime dengan delegasi

Memilih Delegasi

TensorFlow Lite mendukung banyak delegasi, yang masing-masing dioptimalkan untuk platform 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 tipe Model (floating-point atau terkuantisasi?) yang Anda coba akselerasi .

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 float mereka. Untuk 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 yang tersedia. Ini tersedia di Android 8.1 (API 27+) atau lebih tinggi. Untuk ikhtisar tentang 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 yang lebih baru - Untuk iPhone dan iPad yang lebih baru di mana Neural Engine tersedia, Anda dapat menggunakan delegasi Core ML untuk mempercepat inferensi untuk model titik-mengambang 32-bit atau 16-bit. Neural Engine tersedia untuk perangkat seluler Apple dengan A12 SoC atau lebih tinggi. Untuk ikhtisar delegasi Core ML dan petunjuk langkah demi langkah, lihat Delegasi TensorFlow Lite Core ML .

Delegasi berdasarkan tipe model

Setiap akselerator dirancang dengan mempertimbangkan bit-width data tertentu. Jika Anda memberikan model titik-mengambang kepada delegasi yang hanya mendukung operasi terkuantisasi 8-bit (seperti delegasi Hexagon ), model tersebut akan menolak semua operasinya 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 CoreML
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 aplikasi Anda. Namun, penting untuk dicatat bahwa setiap delegasi memiliki serangkaian operasi yang telah ditentukan sebelumnya yang didukungnya, dan dapat bekerja secara berbeda tergantung pada model dan perangkatnya; misalnya, delegasi NNAPI dapat memilih untuk menggunakan Edge-TPU Google di ponsel Pixel saat menggunakan DSP di perangkat lain. Oleh karena itu, biasanya disarankan agar Anda melakukan beberapa benchmarking untuk mengukur seberapa berguna delegasi untuk kebutuhan Anda. Ini juga membantu membenarkan peningkatan ukuran biner yang terkait dengan melampirkan delegasi ke runtime TensorFlow Lite.

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

Alat untuk Evaluasi

Latensi & jejak memori

Alat benchmark TensorFlow Lite dapat digunakan dengan parameter yang sesuai untuk memperkirakan kinerja 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 didefinisikan 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 pra-bangun alat ini untuk Android, arsitektur ARM 64-bit di sini ( lebih detail ).

Akurasi & kebenaran

Delegasi biasanya melakukan perhitungan pada presisi yang berbeda dari rekan-rekan CPU mereka. Akibatnya, ada tradeoff akurasi (biasanya kecil) yang terkait dengan penggunaan delegasi untuk akselerasi perangkat keras. Perhatikan bahwa ini tidak selalu benar; misalnya, karena GPU menggunakan presisi floating-point untuk menjalankan model terkuantisasi, mungkin ada sedikit peningkatan presisi (misalnya, <1% peningkatan 5 teratas dalam klasifikasi gambar ILSFRC).

TensorFlow Lite memiliki dua jenis fitur untuk mengukur seberapa akurat perilaku delegasi untuk model tertentu: Berbasis Tugas dan Agnostik Tugas . 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 ini berfokus pada evaluasi delegasi (Apakah delegasi melakukan hal 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 pada dua tugas berbasis gambar:

Binari prebuilt dari alat ini (Android, arsitektur ARM 64-bit), bersama dengan dokumentasi dapat ditemukan di sini:

Contoh di bawah ini 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

Output 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 yang ditetapkan, 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 & penyimpangan nilai keluaran) dalam dua setelan:

  • Inferensi CPU utas tunggal
  • Inferensi yang Ditentukan Pengguna - ditentukan oleh parameter ini

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

Ini mengukur latensi keduanya, serta perbedaan absolut antara tensor keluaran dari setiap Interpreter, pada basis 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-elemen dari keluaran CPU berbeda dari keluaran delegasi dengan rata-rata 1.96e-05 .

Perhatikan bahwa menafsirkan angka-angka ini membutuhkan pengetahuan model yang lebih dalam, dan arti dari setiap tensor keluaran. Jika ini adalah regresi sederhana yang menentukan semacam skor atau penyematan, perbedaannya harus rendah (jika tidak, itu adalah kesalahan dengan delegasi). Namun, keluaran seperti 'kelas deteksi' dari model SSD sedikit lebih sulit untuk ditafsirkan. Misalnya, mungkin menunjukkan perbedaan menggunakan alat ini, tetapi itu mungkin tidak berarti ada yang salah dengan delegasi: pertimbangkan dua kelas (palsu): "TV (ID: 10)", "Monitor (ID:20)" - Jika delegasi sedikit menyimpang dari kebenaran emas dan menunjukkan monitor alih-alih TV, perbedaan output untuk tensor ini mungkin setinggi 20-10 = 10.

,

pengantar

Delegasi mengaktifkan akselerasi perangkat keras model TensorFlow Lite dengan memanfaatkan akselerator di 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 Pembelajaran Mesin (misalnya, matematika matriks yang terlibat dalam konvolusi dan lapisan padat).

Di sisi lain, sebagian besar ponsel modern mengandung 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 hingga 5x dalam latensi, 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. Hal-hal menjadi lebih rumit ketika Anda menganggap bahwa setiap akselerator memiliki pro & kontra dan tidak dapat menjalankan setiap operasi dalam jaringan saraf. Delegate API dari TensorFlow Lite memecahkan masalah ini dengan bertindak sebagai jembatan antara runtime TFLite dan API level yang lebih rendah ini.

runtime dengan delegasi

Memilih Delegasi

TensorFlow Lite mendukung banyak delegasi, yang masing-masing dioptimalkan untuk platform 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 tipe Model (floating-point atau terkuantisasi?) yang Anda coba akselerasi .

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 float mereka. Untuk 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 yang tersedia. Ini tersedia di Android 8.1 (API 27+) atau lebih tinggi. Untuk ikhtisar tentang 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 yang lebih baru - Untuk iPhone dan iPad yang lebih baru di mana Neural Engine tersedia, Anda dapat menggunakan delegasi Core ML untuk mempercepat inferensi untuk model titik-mengambang 32-bit atau 16-bit. Neural Engine tersedia untuk perangkat seluler Apple dengan A12 SoC atau lebih tinggi. Untuk ikhtisar delegasi Core ML dan petunjuk langkah demi langkah, lihat Delegasi TensorFlow Lite Core ML .

Delegasi berdasarkan tipe model

Setiap akselerator dirancang dengan mempertimbangkan bit-width data tertentu. Jika Anda memberikan model titik-mengambang kepada delegasi yang hanya mendukung operasi terkuantisasi 8-bit (seperti delegasi Hexagon ), model tersebut akan menolak semua operasinya 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 CoreML
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 aplikasi Anda. Namun, penting untuk dicatat bahwa setiap delegasi memiliki serangkaian operasi yang telah ditentukan sebelumnya yang didukungnya, dan dapat bekerja secara berbeda tergantung pada model dan perangkatnya; misalnya, delegasi NNAPI dapat memilih untuk menggunakan Edge-TPU Google di ponsel Pixel saat menggunakan DSP di perangkat lain. Oleh karena itu, biasanya disarankan agar Anda melakukan beberapa benchmarking untuk mengukur seberapa berguna delegasi untuk kebutuhan Anda. Ini juga membantu membenarkan peningkatan ukuran biner yang terkait dengan melampirkan delegasi ke runtime TensorFlow Lite.

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

Alat untuk Evaluasi

Latensi & jejak memori

Alat benchmark TensorFlow Lite dapat digunakan dengan parameter yang sesuai untuk memperkirakan kinerja 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 didefinisikan 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 pra-bangun alat ini untuk Android, arsitektur ARM 64-bit di sini ( lebih detail ).

Akurasi & kebenaran

Delegasi biasanya melakukan perhitungan pada presisi yang berbeda dari rekan-rekan CPU mereka. Akibatnya, ada tradeoff akurasi (biasanya kecil) yang terkait dengan penggunaan delegasi untuk akselerasi perangkat keras. Perhatikan bahwa ini tidak selalu benar; misalnya, karena GPU menggunakan presisi floating-point untuk menjalankan model terkuantisasi, mungkin ada sedikit peningkatan presisi (misalnya, <1% peningkatan 5 teratas dalam klasifikasi gambar ILSFRC).

TensorFlow Lite memiliki dua jenis fitur untuk mengukur seberapa akurat perilaku delegasi untuk model tertentu: Berbasis Tugas dan Agnostik Tugas . 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 ini berfokus pada evaluasi delegasi (Apakah delegasi melakukan hal 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 pada dua tugas berbasis gambar:

Binari prebuilt dari alat ini (Android, arsitektur ARM 64-bit), bersama dengan dokumentasi dapat ditemukan di sini:

Contoh di bawah ini 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

Output 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 yang ditetapkan, 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 & penyimpangan nilai keluaran) dalam dua setelan:

  • Inferensi CPU utas tunggal
  • Inferensi yang Ditentukan Pengguna - ditentukan oleh parameter ini

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

Ini mengukur latensi keduanya, serta perbedaan absolut antara tensor keluaran dari setiap Interpreter, pada basis 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-elemen dari keluaran CPU berbeda dari keluaran delegasi dengan rata-rata 1.96e-05 .

Perhatikan bahwa menafsirkan angka-angka ini membutuhkan pengetahuan model yang lebih dalam, dan arti dari setiap tensor keluaran. Jika ini adalah regresi sederhana yang menentukan semacam skor atau penyematan, perbedaannya harus rendah (jika tidak, itu adalah kesalahan dengan delegasi). Namun, keluaran seperti 'kelas deteksi' dari model SSD sedikit lebih sulit untuk ditafsirkan. Misalnya, mungkin menunjukkan perbedaan menggunakan alat ini, tetapi itu mungkin tidak berarti ada yang salah dengan delegasi: pertimbangkan dua kelas (palsu): "TV (ID: 10)", "Monitor (ID:20)" - Jika delegasi sedikit menyimpang dari kebenaran emas dan menunjukkan monitor alih-alih TV, perbedaan output untuk tensor ini mungkin setinggi 20-10 = 10.