Pengukuran performa

Peralatan benchmark

Alat tolok ukur TensorFlow Lite saat ini mengukur dan menghitung statistik untuk metrik performa penting berikut:

  • Waktu inisialisasi
  • Waktu inferensi status pemanasan
  • Waktu inferensi keadaan stabil
  • Penggunaan memori selama waktu inisialisasi
  • Penggunaan memori secara keseluruhan

Alat tolok ukur tersedia sebagai aplikasi tolok ukur untuk Android dan iOS serta sebagai biner command line native, dan semuanya memiliki logika pengukuran performa in yang sama. Perhatikan bahwa opsi dan format output yang tersedia sedikit berbeda karena perbedaan pada lingkungan runtime.

Aplikasi tolok ukur Android

Ada dua opsi untuk menggunakan alat benchmark dengan Android. Salah satunya adalah biner tolok ukur native dan yang lainnya adalah aplikasi tolok ukur Android, alat pengukur yang lebih baik tentang performa model dalam aplikasi. Apa pun itu, angka dari alat tolok ukur masih akan sedikit berbeda dari saat menjalankan inferensi dengan model dalam aplikasi sebenarnya.

Aplikasi benchmark Android ini tidak memiliki UI. Instal dan jalankan kode menggunakan perintah adb, lalu ambil hasilnya menggunakan perintah adb logcat.

Mendownload atau membuat aplikasi

Download aplikasi tolok ukur Android yang dibangun malam hari menggunakan tautan di bawah ini:

Sedangkan untuk aplikasi benchmark Android yang mendukung operasi TF melalui delegasi Flex, gunakan link di bawah ini:

Anda juga dapat membuat aplikasi dari sumber dengan mengikuti instructions ini.

Menyiapkan benchmark

Sebelum menjalankan aplikasi benchmark, instal aplikasi dan kirim file model ke perangkat seperti berikut:

adb install -r -d -g android_aarch64_benchmark_model.apk
adb push your_model.tflite /data/local/tmp

Menjalankan benchmark

adb shell am start -S \
  -n org.tensorflow.lite.benchmark/.BenchmarkModelActivity \
  --es args '"--graph=/data/local/tmp/your_model.tflite \
              --num_threads=4"'

graph adalah parameter wajib.

  • graph: string
    Jalur ke file model TFLite.

Anda dapat menentukan lebih banyak parameter opsional untuk menjalankan benchmark.

  • num_threads: int (default=1)
    Jumlah thread yang akan digunakan untuk menjalankan penafsir TFLite.
  • use_gpu: bool (default=false)
    Gunakan delegasi GPU.
  • use_xnnpack: bool (default=false)
    Gunakan delegasi XNNPACK.

Bergantung pada perangkat yang Anda gunakan, beberapa opsi ini mungkin tidak tersedia atau tidak berpengaruh. Lihat parameter untuk mengetahui parameter performa lainnya yang dapat Anda jalankan dengan aplikasi benchmark.

Lihat hasil menggunakan perintah logcat:

adb logcat | grep "Inference timings"

Hasil tolok ukur dilaporkan sebagai:

... tflite  : Inference timings in us: Init: 5685, First inference: 18535, Warmup (avg): 14462.3, Inference (avg): 14575.2

Biner tolok ukur native

Alat benchmark juga disediakan sebagai biner native benchmark_model. Anda dapat menjalankan alat ini dari command line shell di Linux, Mac, perangkat tersemat, dan perangkat Android.

Download atau bangun biner

Download biner command line native bawaan malam dengan mengikuti link di bawah ini:

Untuk biner yang telah dibuat setiap malam yang mendukung operasi TF melalui delegasi Fleksibel, gunakan link di bawah ini:

Anda juga dapat membuat biner tolok ukur native dari sumber di komputer.

bazel build -c opt //tensorflow/lite/tools/benchmark:benchmark_model

Untuk mem-build dengan toolchain Android NDK, Anda perlu menyiapkan lingkungan build terlebih dahulu dengan mengikuti panduan ini, atau gunakan image docker seperti yang dijelaskan dalam panduan ini.

bazel build -c opt --config=android_arm64 \
  //tensorflow/lite/tools/benchmark:benchmark_model

Menjalankan benchmark

Untuk menjalankan benchmark di komputer Anda, jalankan biner dari shell.

path/to/downloaded_or_built/benchmark_model \
  --graph=your_model.tflite \
  --num_threads=4

Anda dapat menggunakan kumpulan parameter yang sama seperti yang disebutkan di atas dengan biner command line native.

Operasi model pembuatan profil

Biner model benchmark juga memungkinkan Anda membuat profil operasi model dan mendapatkan waktu eksekusi setiap operator. Untuk melakukannya, teruskan flag --enable_op_profiling=true ke benchmark_model selama pemanggilan. Detailnya dijelaskan di sini.

Biner tolok ukur native untuk beberapa opsi performa dalam satu proses

Biner C++ yang mudah dan sederhana juga disediakan untuk menjalankan benchmark beberapa opsi performa dalam satu pengoperasian. Biner ini dibuat berdasarkan alat tolok ukur yang disebutkan di atas yang hanya dapat mengukur satu opsi performa dalam satu waktu. Keduanya memiliki proses build/instal/run yang sama, tetapi nama target BUILD biner ini adalah benchmark_model_performance_options dan memerlukan beberapa parameter tambahan. Parameter penting untuk biner ini adalah:

perf_options_list: string (default='all')
Daftar opsi performa TFLite yang dipisahkan koma untuk diukur.

Anda bisa mendapatkan biner siap pakai setiap malam untuk alat ini seperti yang tercantum di bawah:

Aplikasi tolok ukur iOS

Untuk menjalankan benchmark di perangkat iOS, Anda perlu membangun aplikasi dari sumber. Tempatkan file model TensorFlow Lite di direktori benchmark_data dari hierarki sumber dan ubah file benchmark_params.json. File tersebut dikemas ke dalam aplikasi dan aplikasi membaca data dari direktori. Buka aplikasi tolok ukur iOS untuk mendapatkan petunjuk mendetail.

Tolok ukur performa untuk model terkenal

Bagian ini mencantumkan tolok ukur performa TensorFlow Lite saat menjalankan model populer di beberapa perangkat Android dan iOS.

Tolok ukur performa Android

Angka tolok ukur performa ini dihasilkan dengan biner tolok ukur native.

Untuk benchmark Android, afinitas CPU ditetapkan untuk menggunakan core besar pada perangkat guna mengurangi varian (lihat detail).

Hal ini mengasumsikan bahwa model telah didownload dan diekstrak ke direktori /data/local/tmp/tflite_models. Biner benchmark dibuat menggunakan petunjuk ini dan diasumsikan berada di direktori /data/local/tmp.

Untuk menjalankan benchmark:

adb shell /data/local/tmp/benchmark_model \
  --num_threads=4 \
  --graph=/data/local/tmp/tflite_models/${GRAPH} \
  --warmup_runs=1 \
  --num_runs=50

Untuk berjalan dengan delegasi GPU, setel --use_gpu=true.

Nilai performa di bawah ini diukur di Android 10.

Nama Model Perangkat CPU, 4 thread GPU
Mobilenet_1.0_224(float) Pixel 3 23,9 md 6,45 md
Pixel 4 14,0 md 9,0 md
Mobilenet_1.0_224 (kuantitas) Pixel 3 13,4 md ---
Pixel 4 5,0 md ---
Seluler NASNet Pixel 3 56 md ---
Pixel 4 34,5 md ---
SqueezeNet Pixel 3 35,8 md 9,5 md
Pixel 4 23,9 md 11,1 md
Inception_ResNet_V2 Pixel 3 422 md 99,8 md
Pixel 4 272,6 md 87,2 md
Inception_V4 Pixel 3 486 md 93 md
Pixel 4 324,1 md 97,6 md

Tolok ukur performa iOS

Jumlah tolok ukur performa ini dibuat dengan aplikasi tolok ukur iOS.

Untuk menjalankan benchmark iOS, aplikasi benchmark dimodifikasi untuk menyertakan model yang sesuai dan benchmark_params.json diubah untuk menetapkan num_threads ke 2. Untuk menggunakan delegasi GPU, opsi "use_gpu" : "1" dan "gpu_wait_type" : "aggressive" juga ditambahkan ke benchmark_params.json.

Nama Model Perangkat CPU, 2 thread GPU
Mobilenet_1.0_224(float) iPhone XS 14,8 md 3,4 md
Mobilenet_1.0_224 (kuantitas) iPhone XS 11 md ---
Seluler NASNet iPhone XS 30,4 md ---
SqueezeNet iPhone XS 21,1 md 15,5 md
Inception_ResNet_V2 iPhone XS 261,1 md 45,7 md
Inception_V4 iPhone XS 309 md 54,4 md

Melacak internal TensorFlow Lite

Melacak internal TensorFlow Lite di Android

Peristiwa internal dari penafsir TensorFlow Lite aplikasi Android dapat diambil dengan alat pelacakan Android. Peristiwa tersebut adalah peristiwa yang sama dengan Android Trace API, sehingga peristiwa yang diambil dari kode Java/Kotlin akan terlihat bersama dengan peristiwa internal TensorFlow Lite.

Beberapa contoh peristiwa adalah:

  • Pemanggilan operator
  • Modifikasi grafik berdasarkan delegasi
  • Alokasi tensor

Di antara berbagai opsi untuk mengambil rekaman aktivitas, panduan ini mencakup CPU Profiler Android Studio dan aplikasi Pelacakan Sistem. Lihat alat command line Perfetto atau alat command line Systrace untuk opsi lainnya.

Menambahkan peristiwa rekaman aktivitas dalam kode Java

Ini adalah cuplikan kode dari aplikasi contoh Klasifikasi Gambar. Penafsir TensorFlow Lite berjalan di bagian recognizeImage/runInference. Langkah ini bersifat opsional, tetapi akan berguna untuk membantu memperhatikan di mana panggilan inferensi dilakukan.

  Trace.beginSection("recognizeImage");
  ...
  // Runs the inference call.
  Trace.beginSection("runInference");
  tflite.run(inputImageBuffer.getBuffer(), outputProbabilityBuffer.getBuffer().rewind());
  Trace.endSection();
  ...
  Trace.endSection();

Aktifkan pelacakan TensorFlow Lite

Untuk mengaktifkan pelacakan TensorFlow Lite, tetapkan properti sistem Android debug.tflite.trace ke 1 sebelum memulai aplikasi Android.

adb shell setprop debug.tflite.trace 1

Jika properti ini telah ditetapkan saat penafsir TensorFlow Lite diinisialisasi, peristiwa utama (misalnya, pemanggilan operator) dari penafsir akan dilacak.

Setelah Anda mengambil semua rekaman aktivitas, nonaktifkan perekaman aktivitas dengan menetapkan nilai properti ke 0.

adb shell setprop debug.tflite.trace 0

CPU Profiler Android Studio

Ambil rekaman aktivitas menggunakan CPU Profiler Android Studio dengan mengikuti langkah-langkah di bawah:

  1. Pilih Run > Profile 'app' dari menu atas.

  2. Klik di mana saja dalam linimasa CPU saat jendela Profiler muncul.

  3. Pilih 'Trace System Calls' di antara mode CPU Profiling.

    Pilih 'Trace System Calls'

  4. Tekan tombol 'Rekam'.

  5. Tekan tombol 'Stop'.

  6. Selidiki hasil rekaman aktivitas.

    Rekaman aktivitas Android Studio

Dalam contoh ini, Anda dapat melihat hierarki peristiwa dalam thread dan statistik untuk setiap waktu operator, serta melihat aliran data seluruh aplikasi di antara thread.

Aplikasi Pelacakan Sistem

Merekam aktivitas tanpa Android Studio dengan mengikuti langkah-langkah yang dijelaskan di aplikasi Pelacakan Sistem.

Dalam contoh ini, peristiwa TFLite yang sama diambil dan disimpan ke format Perfetto atau Systrace bergantung pada versi perangkat Android. File rekaman aktivitas yang diambil dapat dibuka di UI Perfetto.

Rekaman aktivitas Perfetto

Melacak internal TensorFlow Lite di iOS

Peristiwa internal dari penafsir TensorFlow Lite pada aplikasi iOS dapat ditangkap oleh alat Instruments yang disertakan dengan Xcode. Peristiwa tersebut adalah peristiwa signpost iOS, sehingga peristiwa yang direkam dari kode Swift/Objective-C terlihat bersama dengan peristiwa internal TensorFlow Lite.

Beberapa contoh peristiwa adalah:

  • Pemanggilan operator
  • Modifikasi grafik berdasarkan delegasi
  • Alokasi tensor

Aktifkan pelacakan TensorFlow Lite

Setel variabel lingkungan debug.tflite.trace dengan mengikuti langkah-langkah di bawah:

  1. Pilih Product > Scheme > Edit Scheme... dari menu atas Xcode.

  2. Klik 'Profil' di panel kiri.

  3. Hapus centang pada kotak 'Use the Run action's arguments and environment variables'.

  4. Tambahkan debug.tflite.trace di bagian 'Environment Variables'.

    Tetapkan variabel lingkungan

Jika Anda ingin mengecualikan peristiwa TensorFlow Lite saat membuat profil aplikasi iOS, nonaktifkan perekaman aktivitas dengan menghapus variabel lingkungan.

Instrumen XCode

Ambil rekaman aktivitas dengan mengikuti langkah-langkah di bawah:

  1. Pilih Product > Profile dari menu atas Xcode.

  2. Klik Logging di antara template pembuatan profil saat alat Instruments diluncurkan.

  3. Tekan tombol 'Start'.

  4. Tekan tombol 'Stop'.

  5. Klik 'os_signpost' untuk meluaskan item subsistem Logging OS.

  6. Klik subsistem Logging OS 'org.tensorflow.lite'.

  7. Selidiki hasil rekaman aktivitas.

    Rekaman aktivitas Instrumen Xcode

Dalam contoh ini, Anda dapat melihat hierarki peristiwa dan statistik untuk setiap waktu operator.

Menggunakan data pelacakan

Data pelacakan memungkinkan Anda mengidentifikasi bottleneck performa.

Berikut beberapa contoh insight yang bisa Anda dapatkan dari profiler dan solusi yang potensial untuk meningkatkan performa:

  • Jika jumlah core CPU yang tersedia lebih kecil dari jumlah thread inferensi, overhead penjadwalan CPU dapat menyebabkan performa di bawah standar. Anda dapat menjadwalkan ulang tugas intensif CPU lainnya di aplikasi untuk menghindari tumpang-tindih dengan inferensi model atau menyesuaikan jumlah thread penafsir.
  • Jika operator tidak sepenuhnya didelegasikan, beberapa bagian dari grafik model akan dijalankan di CPU, bukan akselerator hardware yang diharapkan. Anda dapat mengganti operator yang tidak didukung dengan operator serupa yang didukung.