Bantuan melindungi Great Barrier Reef dengan TensorFlow pada Kaggle Bergabung Tantangan

Delegasi TensorFlow Lite

pengantar

Delegasi mengaktifkan akselerasi hardware 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, kebanyakan ponsel modern mengandung chip yang lebih baik dalam menangani operasi berat ini. Memanfaatkannya untuk operasi jaringan neural 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 percobaan kami.

Masing-masing akselerator ini memiliki API terkait yang memungkinkan komputasi kustom, seperti OpenCL atau OpenGL ES untuk GPU seluler dan Qualcomm® Hexagon SDK untuk DSP. Biasanya, Anda harus menulis banyak kode khusus untuk menjalankan jaringan neural melalui antarmuka ini. Segalanya menjadi lebih rumit ketika Anda mempertimbangkan bahwa setiap akselerator memiliki pro & kontra dan tidak dapat menjalankan setiap operasi dalam jaringan neural. Delegate API TensorFlow Lite memecahkan masalah ini dengan bertindak sebagai jembatan antara waktu proses TFLite dan API tingkat yang lebih 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 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 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 menggunakan 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 di perangkat Android dengan GPU, DSP, dan / atau NPU tersedia. Ini tersedia di Android 8.1 (API 27+) atau lebih tinggi. Untuk ringkasan tentang delegasi NNAPI, petunjuk langkah demi langkah, dan praktik terbaik, lihat Delegasi NNAPI TensorFlow Lite .
  • Delegasi segi enam untuk perangkat Android lama - Delegasi segi enam dapat digunakan untuk mempercepat model pada perangkat Android dengan Qualcomm Hexagon DSP. Ini dapat digunakan pada perangkat yang menjalankan versi Android yang lebih lama yang tidak mendukung NNAPI. Lihat delegasi TensorFlow Lite Hexagon untuk mengetahui detail selengkapnya.

iOS

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

Mendelegasikan menurut jenis model

Setiap akselerator dirancang dengan mempertimbangkan lebar bit data tertentu. Jika Anda memberikan model floating-point ke delegasi yang hanya mendukung operasi terkuantisasi 8-bit (seperti delegasi Hexagon ), itu 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) Iya Iya Tidak Iya
Kuantisasi float16 pasca pelatihan Iya Tidak Tidak Iya
Kuantisasi rentang dinamis pasca pelatihan Iya Iya Tidak Tidak
Kuantisasi bilangan bulat pasca-pelatihan Iya Iya Iya Tidak
Pelatihan sadar kuantitas Iya Iya Iya Tidak

Memvalidasi kinerja

Informasi di bagian ini berfungsi sebagai pedoman kasar untuk memilih delegasi yang dapat meningkatkan aplikasi Anda. Namun, penting untuk diperhatikan bahwa setiap delegasi memiliki rangkaian operasi yang telah ditentukan sebelumnya yang didukungnya, dan dapat bekerja secara berbeda bergantung pada model dan perangkat; misalnya, delegasi NNAPI dapat memilih untuk menggunakan Google Edge-TPU di ponsel Pixel saat menggunakan DSP di perangkat lain. Oleh karena itu, biasanya Anda disarankan untuk melakukan beberapa tolok ukur 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 fitur performa dan evaluasi akurasi ekstensif yang dapat memberdayakan developer agar percaya diri dalam menggunakan delegasi dalam aplikasinya. Alat-alat ini dibahas di bagian selanjutnya.

Alat untuk Evaluasi

Latensi & jejak memori

Alat tolok ukur 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 mencari tahu 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 adalah 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 ( detail selengkapnya ).

Akurasi & ketepatan

Delegasi biasanya melakukan komputasi dengan presisi yang berbeda dari 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, peningkatan <1% Top-5 dalam klasifikasi gambar ILSVRC).

TensorFlow Lite memiliki dua jenis fitur untuk mengukur seberapa akurat delegasi berperilaku 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 dengan CPU?) Daripada evaluasi model (Apakah model itu sendiri bagus untuk tugas tersebut?).

Evaluasi Berbasis Tugas

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

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

Contoh di bawah ini menunjukkan evaluasi klasifikasi gambar dengan NNAPI yang 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-tugas yang tidak memiliki fitur evaluasi pada perangkat yang mapan, atau jika Anda bereksperimen dengan model kustom, TensorFlow Lite memiliki fitur 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 menghasilkan data Gaussian acak dan meneruskannya melalui dua Interpreter TFLite - satu menjalankan kernel CPU utas tunggal, dan yang lainnya diparameterisasi oleh argumen pengguna.

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

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