Pengukuran performa

Peralatan benchmark

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

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

Alat tolok ukur tersedia sebagai aplikasi tolok ukur untuk Android dan iOS serta biner command line native, dan semuanya memiliki performa inti yang sama logika pengukuran. Perhatikan bahwa opsi yang tersedia dan format {i>output<i} adalah sedikit berbeda karena perbedaan dalam lingkungan runtime.

Aplikasi benchmark Android

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

Aplikasi benchmark Android ini tidak memiliki UI. Menginstal dan menjalankannya menggunakan adb perintah tersebut dan mengambil hasilnya dengan menggunakan perintah adb logcat.

Mendownload atau membangun aplikasi

Download aplikasi benchmark Android siap pakai setiap malam menggunakan link di bawah:

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

Anda juga dapat membangun aplikasi dari sumber dengan mengikuti petunjuk ini.

Menyiapkan benchmark

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

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

Jalankan tolok ukur

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 penerjemah 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. Rujuk ke parameter untuk parameter performa lainnya yang dapat Anda jalankan dengan aplikasi benchmark.

Lihat hasilnya 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 benchmark native

Alat benchmark juga disediakan sebagai benchmark_model biner native. Anda dapat menjalankan alat ini dari baris perintah {i> shell <i}di Linux, Mac, perangkat yang tertanam, dan Perangkat Android.

Download atau bangun biner

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

Sedangkan untuk biner bawaan per malam yang mendukung operasi TF melalui delegasi Fleksibel, gunakan link di bawah ini:

Anda juga dapat membangun biner benchmark native dari sumber di komputer Anda.

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

Untuk membangun dengan toolchain Android NDK, Anda perlu menyiapkan lingkungan build terlebih dahulu dengan mengikuti guide, atau gunakan image Docker seperti yang dijelaskan dalam panduan kami.

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

Jalankan tolok ukur

Untuk menjalankan benchmark di komputer, jalankan biner dari shell.

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

Anda dapat menggunakan kumpulan pertanyaan parameter seperti yang disebutkan di atas dengan biner baris perintah asli.

Operasi model pembuatan profil

Biner model benchmark juga memungkinkan Anda membuat profil operasi model dan mendapatkan waktu eksekusi masing-masing operator. Untuk melakukan ini, teruskan penanda --enable_op_profiling=true ke benchmark_model selama pemanggilan. Detailnya adalah dijelaskan di sini.

Biner tolok ukur native untuk berbagai opsi performa dalam satu proses

Biner C++ yang praktis dan sederhana juga disediakan untuk menjalankan tolok ukur beberapa opsi performa dalam sekali jalan. Biner ini dibuat berdasarkan alat {i>benchmark<i} yang disebutkan di atas yang hanya dapat menjalankan benchmark pada satu opsi performa dalam satu waktu. Mereka berbagi proses build/instal/jalankan yang sama, tapi nama target BUILD dari biner ini benchmark_model_performance_options dan diperlukan 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 bawaan 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. Letakkan file model LiteRT di benchmark_data dari direktori sumber dan memodifikasi file benchmark_params.json. Mereka file dikemas ke dalam aplikasi dan aplikasi membaca data dari direktori. Kunjungi tindakan Aplikasi tolok ukur iOS untuk petunjuk terperinci.

Tolok ukur performa untuk model yang terkenal

Bagian ini mencantumkan tolok ukur performa LiteRT saat berjalan dengan baik yang umum di beberapa perangkat Android dan iOS.

Tolok ukur performa Android

Jumlah tolok ukur performa ini dibuat dengan biner tolok ukur native.

Untuk benchmark Android, afinitas CPU disetel untuk menggunakan core besar di perangkat untuk mengurangi varians (lihat detail).

Diasumsikan 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 tolok ukur:

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

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

Nilai performa di bawah 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 ---
NASNet seluler 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 tolok ukur dimodifikasi untuk menyertakan 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 ---
NASNet seluler 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

Internal LiteRT Trace

Melacak internal LiteRT di Android

Peristiwa internal dari penafsir LiteRT aplikasi Android dapat ditangkap oleh Alat pelacakan Android. Keduanya merupakan peristiwa yang sama di Android Trace API, sehingga peristiwa yang diambil dari kode Java/Kotlin dilihat bersama dengan LiteRT peristiwa internal.

Beberapa contoh peristiwa adalah:

  • Panggilan operator
  • Modifikasi grafik berdasarkan delegasi
  • Alokasi tensor

Di antara berbagai opsi untuk menangkap rekaman aktivitas, panduan ini mencakup Android CPU Profiler Studio dan aplikasi Pelacakan Sistem. Rujuk ke Alat command line Perfetto atau Alat command line Systrace untuk opsi lainnya.

Menambahkan peristiwa rekaman aktivitas dalam kode Java

Ini adalah cuplikan kode dari Klasifikasi Gambar aplikasi contoh. Penerjemah LiteRT berjalan dalam recognizeImage/runInference. Langkah ini opsional tetapi 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();

Mengaktifkan pelacakan LiteRT

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

adb shell setprop debug.tflite.trace 1

Jika properti ini telah disetel ketika penafsir LiteRT diinisialisasi, peristiwa tombol (misalnya, pemanggilan operator) dari penafsir akan dilacak.

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

adb shell setprop debug.tflite.trace 0

CPU Profiler Android Studio

Mengambil rekaman aktivitas dengan CPU Profiler Android Studio dengan mengikuti langkah-langkah berikut:

  1. Pilih Run > Profil 'aplikasi' dari menu atas.

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

  3. Pilih 'Lacak Panggilan Sistem' di antara mode Profiling CPU.

    Pilih &#39;Lacak Panggilan Sistem&#39;

  4. Tekan 'Rekam' tombol.

  5. Tekan 'Berhenti' tombol.

  6. Menyelidiki hasil rekaman aktivitas.

    Rekaman aktivitas Android Studio

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

Aplikasi Pelacakan Sistem

Mengambil rekaman 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 Perfetto atau Systrace bergantung pada versi perangkat Android. Gambar file rekaman aktivitas dapat dibuka di UI Perfetto.

Rekaman aktivitas Perfetto

Melacak internal LiteRT di iOS

Peristiwa internal dari penafsir LiteRT aplikasi iOS dapat ditangkap oleh Instrumen yang disertakan dalam Xcode. Mereka adalah perangkat signpost sehingga peristiwa yang direkam dari kode Swift/Objective-C dapat dilihat secara bersamaan dengan peristiwa internal LiteRT.

Beberapa contoh peristiwa adalah:

  • Panggilan operator
  • Modifikasi grafik berdasarkan delegasi
  • Alokasi tensor

Mengaktifkan pelacakan LiteRT

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

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

  2. Klik 'Profil' di panel kiri.

  3. Batalkan pilihan 'Gunakan argumen dan variabel lingkungan Run action' .

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

    Tetapkan variabel lingkungan

Jika Anda ingin mengecualikan peristiwa LiteRT saat membuat profil aplikasi iOS, menonaktifkan pelacakan 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 'Mulai' tombol.

  4. Tekan 'Berhenti' tombol.

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

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

  7. Menyelidiki hasil rekaman aktivitas.

    Rekaman aktivitas Instrumen Xcode

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

Menggunakan data perekaman aktivitas

Data perekaman aktivitas memungkinkan Anda mengidentifikasi bottleneck performa.

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

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