TensorFlow Lite Temsilcileri

giriiş

Delegeler , GPU ve Dijital Sinyal İşlemcisi (DSP) gibi cihazdaki hızlandırıcılardan yararlanarak TensorFlow Lite modellerinin donanım hızlandırmasını sağlar.

Varsayılan olarak, TensorFlow Lite, ARM Neon komut seti için optimize edilmiş CPU çekirdeklerini kullanır. Bununla birlikte, CPU, genellikle Makine Öğrenimi modellerinde bulunan ağır aritmetik (örneğin, evrişim ve yoğun katmanlarda yer alan matris matematiği) için optimize edilmemiş çok amaçlı bir işlemcidir.

Öte yandan, çoğu modern cep telefonu, bu ağır işlemleri gerçekleştirmede daha iyi olan çipler içerir. Bunları sinir ağı işlemleri için kullanmak, gecikme ve güç verimliliği açısından büyük faydalar sağlar. Örneğin, GPU'lar gecikmede 5 kata kadar hızlanma sağlayabilirken Qualcomm® Hexagon DSP'nin deneylerimizde güç tüketimini %75'e kadar azalttığını göstermiştir.

Bu hızlandırıcıların her biri, mobil GPU için OpenCL veya OpenGL ES ve DSP için Qualcomm® Hexagon SDK gibi özel hesaplamaları etkinleştiren ilişkili API'lere sahiptir. Tipik olarak, bu arayüzler aracılığıyla bir sinir ağını çalıştırmak için çok sayıda özel kod yazmanız gerekir. Her hızlandırıcının artıları ve eksileri olduğunu ve bir sinir ağında her işlemi gerçekleştiremeyeceğini düşündüğünüzde işler daha da karmaşıklaşıyor. TensorFlow Lite'ın Delege API'si, TFLite çalışma zamanı ile bu alt düzey API'ler arasında bir köprü görevi görerek bu sorunu çözer.

temsilcilerle çalışma zamanı

Delege Seçimi

TensorFlow Lite, her biri belirli platform(lar) ve belirli model türleri için optimize edilmiş birden çok temsilciyi destekler. Genellikle, iki ana kritere bağlı olarak, kullanım durumunuza uygun birden fazla delege olacaktır: hedeflediğiniz Platform (Android veya iOS?) ve hızlandırmaya çalıştığınız Model türü (kayan nokta veya nicelleştirilmiş?) .

Platforma Göre Delegeler

Çapraz platform (Android ve iOS)

  • GPU temsilcisi - GPU temsilcisi hem Android hem de iOS'ta kullanılabilir. GPU'nun mevcut olduğu 32 bit ve 16 bit kayan nokta tabanlı modelleri çalıştırmak için optimize edilmiştir. Ayrıca 8 bit nicelleştirilmiş modelleri destekler ve kayan sürümleriyle eşit GPU performansı sağlar. GPU temsilcisiyle ilgili ayrıntılar için GPU'da TensorFlow Lite bölümüne bakın. Android ve iOS ile GPU temsilcisini kullanma hakkında adım adım eğitimler için bkz. TensorFlow Lite GPU Delege Eğitimi .

Android

  • Daha yeni Android cihazlar için NNAPI temsilcisi - NNAPI temsilcisi, GPU, DSP ve/veya NPU bulunan Android cihazlarda modelleri hızlandırmak için kullanılabilir. Android 8.1 (API 27+) veya üzeri sürümlerde mevcuttur. NNAPI temsilcisine genel bir bakış, adım adım talimatlar ve en iyi uygulamalar için bkz. TensorFlow Lite NNAPI temsilcisi .
  • Eski Android cihazlar için Hexagon delegesi - Hexagon delegesi, Qualcomm Hexagon DSP ile Android cihazlarda modelleri hızlandırmak için kullanılabilir. NNAPI'yi desteklemeyen eski Android sürümlerini çalıştıran cihazlarda kullanılabilir. Daha fazla ayrıntı için TensorFlow Lite Hexagon temsilcisine bakın.

iOS

  • Daha yeni iPhone'lar ve iPad'ler için Core ML temsilcisi - Neural Engine'in kullanılabildiği daha yeni iPhone'lar ve iPad'ler için, 32 bit veya 16 bit kayan nokta modelleri için çıkarımı hızlandırmak için Core ML temsilcisini kullanabilirsiniz. Neural Engine, A12 SoC veya üstü olan Apple mobil cihazlarında mevcuttur. Core ML temsilcisine ve adım adım talimatlara genel bakış için bkz. TensorFlow Lite Core ML temsilcisi .

Model türüne göre temsilciler

Her hızlandırıcı, belirli bir veri genişliği göz önünde bulundurularak tasarlanmıştır. Yalnızca 8 bit nicelleştirilmiş işlemleri destekleyen bir temsilciye kayan nokta modeli sağlarsanız (örneğin, Hexagon temsilcisi ), tüm işlemlerini reddeder ve model tamamen CPU'da çalışır. Bu tür sürprizlerden kaçınmak için aşağıdaki tablo, model türüne göre temsilci desteğine genel bir bakış sağlar:

Model türü GPU NNAPI Altıgen CoreML
Kayan nokta (32 bit) Evet Evet Numara Evet
Eğitim sonrası float16 niceleme Evet Numara Numara Evet
Eğitim sonrası dinamik aralık niceleme Evet Evet Numara Numara
Eğitim sonrası tamsayı nicemleme Evet Evet Evet Numara
Kuantizasyona duyarlı eğitim Evet Evet Evet Numara

performans doğrulama

Bu bölümdeki bilgiler, uygulamanızı iyileştirebilecek delegelerin kısa listeye alınması için kaba bir kılavuz görevi görür. Ancak, her temsilcinin desteklediği önceden tanımlanmış bir dizi işlem olduğunu ve modele ve cihaza bağlı olarak farklı performans gösterebileceğini unutmamak önemlidir; örneğin, NNAPI temsilcisi , başka bir cihazda DSP kullanırken Google'ın Edge-TPU'sunu Pixel telefonda kullanmayı seçebilir. Bu nedenle, bir temsilcinin ihtiyaçlarınız için ne kadar yararlı olduğunu ölçmek için genellikle bazı kıyaslamalar yapmanız önerilir. Bu ayrıca, TensorFlow Lite çalışma zamanına bir temsilci eklemeyle ilişkili ikili boyut artışını doğrulamaya da yardımcı olur.

TensorFlow Lite, geliştiricilerin uygulamalarında delegeleri kullanma konusunda kendilerine güvenmelerini sağlayan kapsamlı performans ve doğruluk değerlendirme araçlarına sahiptir. Bu araçlar bir sonraki bölümde tartışılmaktadır.

Değerlendirme Araçları

Gecikme ve bellek ayak izi

TensorFlow Lite'ın kıyaslama aracı , ortalama çıkarım gecikmesi, başlatma yükü, bellek ayak izi vb. dahil olmak üzere model performansını tahmin etmek için uygun parametrelerle kullanılabilir. Bu araç, modeliniz için en iyi temsilci yapılandırmasını bulmak için birden çok bayrağı destekler. Örneğin, OpenGL ile GPU yürütmesini ölçmek için --gpu_backend=gl --use_gpu ile belirtilebilir. Desteklenen temsilci parametrelerinin tam listesi ayrıntılı belgelerde tanımlanmıştır.

adb aracılığıyla GPU'lu nicelleştirilmiş bir model için çalıştırma örneği:

adb shell /data/local/tmp/benchmark_model \
  --graph=/data/local/tmp/mobilenet_v1_224_quant.tflite \
  --use_gpu=true

Bu aracın Android, 64-bit ARM mimarisi için önceden oluşturulmuş sürümünü buradan indirebilirsiniz ( daha fazla ayrıntı ).

Doğruluk ve doğruluk

Delegeler genellikle hesaplamaları CPU benzerlerinden farklı bir hassasiyette gerçekleştirir. Sonuç olarak, donanım hızlandırma için bir temsilcinin kullanılmasıyla ilişkili (genellikle küçük) bir doğruluk dengesi vardır. Bunun her zaman doğru olmadığına dikkat edin; örneğin, GPU, nicelenmiş modelleri çalıştırmak için kayan nokta kesinliğini kullandığından, hafif bir hassasiyet iyileştirmesi olabilir (örneğin, ILSVRC görüntü sınıflandırmasında <%1 İlk-5 iyileştirme).

TensorFlow Lite, bir temsilcinin belirli bir model için ne kadar doğru davrandığını ölçmek için iki tür araca sahiptir: Görev Tabanlı ve Görevden Bağımsız. Bu bölümde açıklanan tüm araçlar, önceki bölümdeki kıyaslama aracı tarafından kullanılan gelişmiş yetkilendirme parametrelerini destekler. Aşağıdaki alt bölümlerin, model değerlendirmesi (Modelin kendisi görev için iyi mi?) yerine temsilci değerlendirmesine odaklandığını unutmayın (Delege CPU ile aynı şeyi yapıyor mu?).

Göreve Dayalı Değerlendirme

TensorFlow Lite, iki görüntü tabanlı görevin doğruluğunu değerlendirmek için araçlara sahiptir:

Bu araçların önceden oluşturulmuş ikili dosyaları (Android, 64-bit ARM mimarisi), belgelerle birlikte burada bulunabilir:

Aşağıdaki örnek, bir Pixel 4 üzerinde Google'ın Edge-TPU'sunu kullanan NNAPI ile görüntü sınıflandırma değerlendirmesini göstermektedir:

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

Beklenen çıktı, 1'den 10'a kadar Top-K metriklerinin bir listesidir:

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

Görevden Agnostik Değerlendirme

Yerleşik bir cihaz üzerinde değerlendirme aracının olmadığı görevler için veya özel modellerle denemeler yapıyorsanız TensorFlow Lite, Çıkarım Farkı aracına sahiptir. (Android, 64-bit ARM ikili mimarisi burada ikili)

Çıkarım Farkı, TensorFlow Lite yürütmesini (gecikme ve çıktı değeri sapması açısından) iki ayarda karşılaştırır:

  • Tek iş parçacıklı CPU Çıkarımı
  • Kullanıcı Tanımlı Çıkarım - bu parametrelerle tanımlanır

Bunu yapmak için, araç rasgele Gauss verileri üretir ve bunu biri tek iş parçacıklı CPU çekirdeği çalıştıran ve diğeri kullanıcının argümanları tarafından parametrelendirilen iki TFLite Yorumlayıcıdan geçirir.

Her bir yorumlayıcının çıktı tensörleri arasındaki mutlak farkı olduğu kadar her ikisinin gecikmesini de eleman bazında ölçer.

Tek çıkış tensörü olan bir model için çıktı şöyle görünebilir:

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

Bunun anlamı, 0 dizinindeki çıkış tensörü için, CPU çıkışından gelen öğelerin, temsilci çıkışından ortalama 1.96e-05 kadar farklı olmasıdır.

Bu sayıların yorumlanmasının model ve her bir çıktı tensörünün ne anlama geldiği hakkında daha derin bilgi gerektirdiğini unutmayın. Bir tür puanı veya yerleştirmeyi belirleyen basit bir regresyon ise, fark düşük olmalıdır (aksi takdirde bu, temsilci ile ilgili bir hatadır). Ancak, SSD modellerinden 'algılama sınıfı' gibi çıktıların yorumlanması biraz daha zordur. Örneğin, bu aracı kullanmak bir fark gösterebilir, ancak bu, temsilci için gerçekten yanlış bir şey olduğu anlamına gelmeyebilir: iki (sahte) sınıf düşünün: "TV (ID: 10)", "Monitör (ID:20)" - Eğer bir delege altın gerçeğin biraz dışındadır ve TV yerine monitörü gösterir, bu tensör için çıkış farkı 20-10 = 10 kadar yüksek olabilir.