Performans ölçümü

Karşılaştırma araçları

LiteRT karşılaştırma araçları şu anda aşağıdaki önemli performans metrikleriyle ilgili istatistikleri ölçüp hesaplamaktadır:

  • Başlatma süresi
  • Isınma durumunun çıkarım süresi
  • Kararlı durumun çıkarım süresi
  • İlk kullanıma hazırlama süresindeki bellek kullanımı
  • Genel bellek kullanımı

Karşılaştırma ölçütü araçları, Android ve iOS için karşılaştırma ölçütü uygulamaları ve önceden oluşturulmuş komut satırı ikilileri olarak kullanılabilir. Bu araçların tümü aynı temel performans ölçümü mantığını kullanır. Çalışma zamanı ortamındaki farklılıklar nedeniyle kullanılabilir seçeneklerin ve çıktı biçimlerinin biraz farklı olduğunu unutmayın.

Önceden oluşturulmuş kıyaslama ikilisi (CompiledModel API'yi kullanarak)

Karşılaştırma aracını Android ile kullanmanın iki yolu vardır. Bunlardan biri yerel karşılaştırma ikilisi (CompiledModel API tabanlı), diğeri ise Android karşılaştırma uygulamasıdır (Interpreter API tabanlı). LiteRT Benchmark aracı, yerleşik bir ikili dosya olarak sağlanır benchmark_model. Bu aracı Linux, macOS, Windows, Raspberry Pi, yerleşik cihazlar ve GPU hızlandırması etkinleştirilmiş Android cihazlarda bir kabuk komut satırından çalıştırabilirsiniz.

İkili dosyayı indirme veya oluşturma

Aşağıdaki bağlantıları kullanarak geceye özel olarak önceden oluşturulmuş komut satırı ikililerini indirin:

Bilgisayarınızdaki kaynaktan da karşılaştırma ölçütü ikilisi oluşturabilirsiniz.

bazel build -c opt //litert/tools:benchmark_model

Android NDK araç zinciriyle derleme yapmak için önce bu kılavuzu izleyerek derleme ortamını ayarlamanız veya bu kılavuzda açıklandığı gibi Docker görüntüsünü kullanmanız gerekir.

bazel build -c opt --config=android_arm64 \
  //litert/tools:benchmark_model

Karşılaştırma çalıştırma

Bilgisayarınızda karşılaştırma testleri çalıştırmak için kabuktan ikili dosyayı yürütün.

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

Önceden oluşturulmuş komut satırı ikilisiyle daha önce bahsedilen aynı parametreler kümesini kullanabilirsiniz.

GPU hızlandırıcı

Bu önceden oluşturulmuş ikili dosyalar, yeni LiteRT GPU Hızlandırıcı'yı içerir. Vulkan (Linux), Metal (MacOS) ve Direct3D (Windows) tarafından desteklenen OpenCL ve WebGPU'yu destekler.

GPU hızlandırıcıyı kullanmak için --use_gpu=true işaretini iletin.

Profil modeli işlemleri

Karşılaştırma modeli ikilisi, model işlemlerini profillemenize ve her operatörün yürütme sürelerini almanıza da olanak tanır. Bunu yapmak için çağırma sırasında --use_profiler=true işaretini benchmark_model'ye iletin.

Android karşılaştırma uygulaması (Interpreter API'yi kullanır)

Ayrıca v1 Interpreter API'ye dayalı bir Android karşılaştırma uygulaması da sağlanır. Bu, modelin bir Android uygulamasında nasıl performans göstereceğine dair daha iyi bir ölçüdür. Karşılaştırma aracındaki sayılar, gerçek uygulamada modelle çıkarım yaparken elde edilen sayılardan yine de biraz farklı olacaktır.

Bu Android karşılaştırma uygulamasının kullanıcı arayüzü yoktur. adb komutunu kullanarak yükleyip çalıştırın ve adb logcat komutunu kullanarak sonuçları alın.

Uygulamayı indirme veya oluşturma

Aşağıdaki bağlantıları kullanarak geceye özel olarak önceden oluşturulmuş Android karşılaştırma uygulamalarını indirin:

Flex temsilcisi aracılığıyla TF işlemlerini destekleyen Android karşılaştırma uygulamaları için aşağıdaki bağlantıları kullanın:

Ayrıca bu talimatları uygulayarak uygulamayı kaynaktan da oluşturabilirsiniz.

Karşılaştırma hazırlama

Karşılaştırma uygulamasını çalıştırmadan önce uygulamayı yükleyin ve model dosyasını cihaza aşağıdaki şekilde gönderin:

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

Karşılaştırma çalıştırma

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

graph zorunlu bir parametredir.

  • graph: string
    TFLite model dosyasının yolu.

Karşılaştırmayı çalıştırmak için daha fazla isteğe bağlı parametre belirtebilirsiniz.

  • num_threads: int (varsayılan=1)
    TFLite yorumlayıcısını çalıştırmak için kullanılacak iş parçacığı sayısı.
  • use_gpu: bool (varsayılan=false)
    GPU temsilcisini kullanın.
  • use_xnnpack: bool (varsayılan=false)
    Use XNNPACK delegate.

Kullandığınız cihaza bağlı olarak bu seçeneklerden bazıları kullanılamayabilir veya etkisiz olabilir. Karşılaştırma uygulamasıyla çalıştırabileceğiniz daha fazla performans parametresi için parametreler bölümüne bakın.

logcat komutunu kullanarak sonuçları görüntüleyin:

adb logcat | grep "Inference timings"

Karşılaştırma sonuçları şu şekilde bildirilir:

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

iOS karşılaştırma uygulaması

iOS cihazda karşılaştırma testleri çalıştırmak için uygulamayı kaynaktan oluşturmanız gerekir. LiteRT model dosyasını kaynak ağacının benchmark_data dizinine yerleştirin ve benchmark_params.json dosyasını değiştirin. Bu dosyalar uygulamaya paketlenir ve uygulama, dizindeki verileri okur. Ayrıntılı talimatlar için iOS karşılaştırma uygulamasını ziyaret edin.

Bilinen modeller için performans karşılaştırmaları

Bu bölümde, bazı Android ve iOS cihazlarda iyi bilinen modeller çalıştırılırken LiteRT performans karşılaştırmaları listelenmektedir.

Android performans karşılaştırmaları

Bu performans karşılaştırması sayıları, yerel karşılaştırma ikilisi ile oluşturulmuştur.

Android karşılaştırmalarında, varyansı azaltmak için CPU yakınlığı cihazdaki büyük çekirdekleri kullanacak şekilde ayarlanır (ayrıntılar için bkz.).

Modellerin /data/local/tmp/tflite_models dizinine indirilip sıkıştırılmamış olduğu varsayılır. Karşılaştırma ikili programı, bu talimatlar kullanılarak oluşturulur ve /data/local/tmp dizininde olduğu varsayılır.

Karşılaştırmayı çalıştırmak için:

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

GPU temsilcisiyle çalıştırmak için --use_gpu=true değerini ayarlayın.

Aşağıdaki performans değerleri Android 10'da ölçülmüştür.

Model Adı Cihaz CPU, 4 iş parçacığı GPU
Mobilenet_1.0_224(float) Pixel 3 23,9 ms 6,45 ms
Pixel 4 14,0 ms 9,0 ms
Mobilenet_1.0_224 (quant) Pixel 3 13,4 ms ---
Pixel 4 5,0 ms ---
NASNet mobile Pixel 3 56 ms ---
Pixel 4 34,5 ms ---
SqueezeNet Pixel 3 35,8 ms 9,5 ms
Pixel 4 23,9 ms 11,1 ms
Inception_ResNet_V2 Pixel 3 422 ms 99,8 ms
Pixel 4 272,6 ms 87,2 ms
Inception_V4 Pixel 3 486 ms 93 ms
Pixel 4 324,1 ms 97,6 ms

iOS performans karşılaştırmaları

Bu performans karşılaştırması sayıları, iOS karşılaştırma uygulaması ile oluşturulmuştur.

iOS karşılaştırmalarını çalıştırmak için karşılaştırma uygulaması, uygun modeli içerecek şekilde değiştirildi ve benchmark_params.json, num_threads değerini 2 olarak ayarlayacak şekilde değiştirildi. GPU temsilcisini kullanmak için "use_gpu" : "1" ve "gpu_wait_type" : "aggressive" seçenekleri de benchmark_params.json'ye eklendi.

Model Adı Cihaz CPU, 2 iş parçacığı GPU
Mobilenet_1.0_224(float) iPhone XS 14,8 ms 3,4 ms
Mobilenet_1.0_224 (quant) iPhone XS 11 ms ---
NASNet mobile iPhone XS 30,4 ms ---
SqueezeNet iPhone XS 21,1 ms 15,5 ms
Inception_ResNet_V2 iPhone XS 261,1 ms 45,7 ms
Inception_V4 iPhone XS 309 ms 54,4 ms

Trace LiteRT dahili işleyişi

Android'de Trace LiteRT'nin iç kısımlarını izleme

Bir Android uygulamasının LiteRT yorumlayıcısından gelen dahili etkinlikler, Android izleme araçları tarafından yakalanabilir. Bu etkinlikler, Android Trace API'si ile aynı etkinliklerdir. Bu nedenle, Java/Kotlin kodundan yakalanan etkinlikler LiteRT'nin dahili etkinlikleriyle birlikte görülür.

Etkinliklere örnek olarak şunlar verilebilir:

  • Operatör çağrısı
  • Yetkili tarafından yapılan grafik değişikliği
  • Tensör ayırma

Bu kılavuzda, iz yakalamak için farklı seçenekler arasından Android Studio CPU Profiler ve System Tracing uygulaması ele alınmaktadır. Diğer seçenekler için Perfetto komut satırı aracı veya Systrace komut satırı aracı başlıklı makalelere bakın.

Java koduna izleme etkinlikleri ekleme

Bu, Image Classification örnek uygulamasından alınmış bir kod snippet'idir. LiteRT yorumlayıcısı recognizeImage/runInference bölümünde çalışır. Bu adım isteğe bağlıdır ancak çıkarım çağrısının nerede yapıldığını fark etmenize yardımcı olur.

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

LiteRT izlemeyi etkinleştirme

LiteRT izlemeyi etkinleştirmek için Android uygulamasını başlatmadan önce debug.tflite.trace Android sistem özelliğini 1 olarak ayarlayın.

adb shell setprop debug.tflite.trace 1

Bu özellik, LiteRT yorumlayıcısı başlatıldığında ayarlanmışsa yorumlayıcıdaki önemli etkinlikler (ör. operatör çağrısı) izlenir.

Tüm izlemeleri yakaladıktan sonra özellik değerini 0 olarak ayarlayarak izlemeyi devre dışı bırakın.

adb shell setprop debug.tflite.trace 0

Android Studio CPU Profiler

Aşağıdaki adımları uygulayarak Android Studio CPU Profiler ile izlemeleri yakalayın:

  1. Üst menülerden Run > Profile 'app' (Çalıştır > "app" uygulamasının profilini oluştur) seçeneğini belirleyin.

  2. Profiler penceresi göründüğünde CPU zaman çizelgesinde herhangi bir yeri tıklayın.

  3. CPU Profiling modları arasından "Trace System Calls"ı (Sistem Çağrılarını İzle) seçin.

    "Trace System Calls" (Sistem Çağrılarını İzle) seçeneğini belirleyin.

  4. "Kaydet" düğmesine basın.

  5. "Durdur" düğmesine basın.

  6. İz sonucunu inceleyin.

    Android Studio izi

Bu örnekte, bir ileti dizisindeki etkinliklerin hiyerarşisini ve her operatörün süresine ait istatistikleri görebilir, ayrıca ileti dizileri arasındaki uygulamanın tamamına ait veri akışını da inceleyebilirsiniz.

System Tracing uygulaması

Sistem İzleme uygulaması'nda ayrıntılı olarak açıklanan adımları uygulayarak Android Studio olmadan izleme yakalayın.

Bu örnekte, aynı TFLite etkinlikleri yakalandı ve Android cihazın sürümüne bağlı olarak Perfetto veya Systrace biçiminde kaydedildi. Yakalanan izleme dosyaları Perfetto kullanıcı arayüzünde açılabilir.

Perfetto izi

iOS'te Trace LiteRT'nin iç kısımlarını izleme

Bir iOS uygulamasının LiteRT yorumlayıcısından gelen dahili etkinlikler, Xcode'a dahil edilen Instruments aracıyla yakalanabilir. Bunlar iOS signpost etkinlikleridir. Bu nedenle, Swift/Objective-C kodundan yakalanan etkinlikler LiteRT dahili etkinlikleriyle birlikte görülür.

Etkinliklere örnek olarak şunlar verilebilir:

  • Operatör çağrısı
  • Yetkili tarafından yapılan grafik değişikliği
  • Tensör ayırma

LiteRT izlemeyi etkinleştirme

Aşağıdaki adımları uygulayarak debug.tflite.trace ortam değişkenini ayarlayın:

  1. Xcode'un üst menülerinden Product > Scheme > Edit Scheme... seçeneğini belirleyin.

  2. Sol bölmede "Profil"i tıklayın.

  3. "Çalıştır işlemi bağımsız değişkenlerini ve ortam değişkenlerini kullan" onay kutusunun işaretini kaldırın.

  4. "Ortam Değişkenleri" bölümüne debug.tflite.trace ekleyin.

    Ortam değişkenini ayarlama

iOS uygulamasında profil oluştururken LiteRT etkinliklerini hariç tutmak istiyorsanız ortam değişkenini kaldırarak izlemeyi devre dışı bırakın.

XCode Instruments

Aşağıdaki adımları uygulayarak izlemeleri yakalayın:

  1. Xcode'un üst menülerinden Product > Profile'ı (Ürün > Profil) seçin.

  2. Instruments aracı başlatıldığında profilleme şablonları arasından Logging'i (Günlüğe Kaydetme) tıklayın.

  3. "Başlat" düğmesine basın.

  4. "Durdur" düğmesine basın.

  5. OS Logging alt sistem öğelerini genişletmek için "os_signpost"u tıklayın.

  6. "org.tensorflow.lite" işletim sistemi günlük kaydı alt sistemini tıklayın.

  7. İz sonucunu inceleyin.

    Xcode Instruments izi

Bu örnekte, her operatör zamanı için etkinlik hiyerarşisini ve istatistikleri görebilirsiniz.

İzleme verilerini kullanma

İzleme verileri, performansla ilgili sorunları belirlemenize olanak tanır.

Aşağıda, profiler'dan alabileceğiniz analizlere ve performansı artırmaya yönelik olası çözümlere dair bazı örnekler verilmiştir:

  • Kullanılabilir CPU çekirdeklerinin sayısı çıkarım iş parçacıklarının sayısından azsa CPU zamanlama ek yükü, performansın düşük olmasına neden olabilir. Uygulamanızdaki diğer CPU yoğun görevleri, model çıkarımınızla çakışmamaları için yeniden planlayabilir veya yorumlayıcı iş parçacıklarının sayısını ayarlayabilirsiniz.
  • Operatörler tam olarak temsil edilmiyorsa model grafiğinin bazı bölümleri, beklenen donanım hızlandırıcı yerine CPU üzerinde yürütülür. Desteklenmeyen operatörleri, desteklenen benzer operatörlerle değiştirebilirsiniz.